Commit b4122601 authored by Master Q's avatar Master Q

就这样吧

parent 90ced5ad
......@@ -6,9 +6,9 @@
"@babel/preset-typescript"
],
"plugins": [
["@babel/plugin-transform-runtime", {
// "corejs": 3
}],
// ["@babel/plugin-transform-runtime", {
// // "corejs": 3
// }],
["@babel/plugin-proposal-decorators", { "legacy": true }],
"@babel/plugin-proposal-optional-chaining",
"./babel-plugins/babel-plugins-test.js"
......
......@@ -52,6 +52,15 @@
<!-- 这里的 bundle 就是 webpack 临时打包出来 -->
<script src="output.js"></script>
<script type="module">
const app = {
checkMember: () => {
return false;
}
};
function getApp() {
return app;
}
window.addEventListener("load", function () {
const canvas = document.getElementById('stage')
canvas.width = document.body.clientWidth * (window.devicePixelRatio || 1)
......
......@@ -6027,6 +6027,7 @@ export class Container extends DisplayObject {
isInDisplay: any;
sw: number;
sh: number;
_index: number;
constructor();
/**
* children改变时触发,暂时没地方用到,考虑废弃
......
This diff is collapsed.
This diff is collapsed.
{
"success": true,
"data": {
"name": "123123",
"image": "http://qnpic.top/yoona2.jpg",
"type": 2
}
}
\ No newline at end of file
{
"success": true
}
\ No newline at end of file
......@@ -10,13 +10,13 @@
"dev": "node ./scripts/devServer.js",
"flushRes": "node scripts/flushRes",
"handleLotS": "node scripts/handleLotS",
"handleRes": "node scripts/delRel && node scripts/copyRes && node scripts/imageMin.js",
"handleRes": "node scripts/delRel && node scripts/copyRes && node scripts/createTm && node scripts/textureMerge && node scripts/delTm && node scripts/imageMin",
"upload": "node scripts/upload",
"prod": "npm run handleRes && npm run upload && npm run buildTS",
"buildWeb": "npm run handleRes && node scripts/upload 1",
"buildTS": "webpack --config webpack.prod.js && node scripts/mergeJs",
"babelbuild": "babel src --out-dir dist --extensions .ts,.tsx",
"build": "webpack --config webpack.prod.js",
"build": "npm run handleRes && node scripts/mergeJson && node scripts/upload && npm run buildTS",
"check-type": "tsc --watch"
},
"author": "",
......
......@@ -12,6 +12,10 @@
"keys": "DSM1.png,DSMB.png",
"name": "DrawSucModal"
},
{
"keys": "FGM1.png,FGMB.png",
"name": "FinalGiftModal"
},
{
"keys": "2b727ace1b5c959dbc6274cacb5b4e5f.png,3ed4431aad269ef7059929043bd45597.png,60377934f7cf618b52457273db65aace.png,9074d1305c0e7feb16037261986c7f4b.png,f3bde4659477f82338fcb2b134272321.png",
"name": "GameAtom"
......@@ -32,12 +36,20 @@
"keys": "back.png,bottomAtom.png,gele1.png,goBackBtn.png,player.png,scoreboard-t.png",
"name": "GameScene"
},
{
"keys": "2120075482341d7d94d8164b1a0f6d43.png,3ed4431aad269ef7059929043bd45597.png,4f4612689c9fde32a8c28c129e9f6e7d.png,60377934f7cf618b52457273db65aace.png,63b0a84f0f9b10842b5f83fa5e923534.png,f3bde4659477f82338fcb2b134272321.png",
"name": "JumpEnd"
},
{
"keys": "Guide1.png,NGSB.jpg,nextStep.png,startGameBtn.png",
"name": "NewGuyScene"
},
{
"keys": "closebtn.png,giftBoxIcon.png",
"keys": "2120075482341d7d94d8164b1a0f6d43.png",
"name": "PerfectJumpEnd"
},
{
"keys": "closebtn.png,giftBoxIcon.png,waitingBg.png,waitingRot.png",
"name": "common"
},
{
......
var fs = require("fs");
var iconv = require('iconv-lite');
var del = require('del');
var readPath = "./released/resource/";
//读取json文件
var data = iconv.decode(fs.readFileSync(readPath + "res.json"), "utf-8");//GBK
//反序列化
data = JSON.parse(data); //eval(data)
//取出里面的图片,暂存到tm文件夹中,同时删除文件夹里的,和本身json里的
if (!fs.existsSync("./released/tm"))
fs.mkdirSync("./released/tm");
for (var i = 0; i < data.groups.length; i++) {
var name = data.groups[i].name;
var path = readPath + name + "/";
var arr = data.groups[i].keys.split(",");
//取出图片的,注意已排除jpg
var images = arr.filter((f) => { return (f.substr(-4) == ".png" /*|| f.substr(-4) == ".jpg"*/) })
//没有图片,
if (!images.length) continue;
//去掉原先数据里的
// data.groups[i].keys = arr.filter((f) => { return (f.substr(-4) != ".png" && f.substr(-4) != ".jpg") }).join(",");
//添加新的json,加到atlas里
// if (data.groups[i].keys) data.groups[i].keys += ","
data.groups[i].atlas = name + ".json"
//读取原先路径里的图片,写到tm的文件夹里,并删除原文件夹里的图片
fs.mkdirSync("./released/tm/" + name);
for (var m = 0; m < images.length; m++) {
fs.writeFileSync(
"./released/tm/" + name + "/" + images[m],
fs.readFileSync(path + images[m])
)
del(path + images[m])
}
}
//序列化
fs.writeFileSync(readPath + "res.json", JSON.stringify(data, "", "\t"));
var del = require('del');
del("./released/tm")
\ No newline at end of file
var fs = require("fs");
var path = require('path');
var del = require('del');
var iconv = require('iconv-lite');
const join = require('path').join;
//写入图集的文件夹,将文件夹内所有的json合并,并删除原先json
var readPath = "./released/resource/";
//读取json文件
var data = iconv.decode(fs.readFileSync(readPath + "res.json"), "utf-8");//GBK
//反序列化
data = JSON.parse(data);
var files = fs.readdirSync(readPath);
// let obj = {};
let count = 0;
let countAll = files.length
files.forEach(function (file) {
//路径
let fPath = join(readPath, file);
//只处理文件夹
if (fs.statSync(fPath).isDirectory()) {
//读文件夹fPath里的json文件
fs.readdir(fPath, function (err, files) {
if (err) {
console.warn(err)
} else {
var hasJson
//遍历
for (var i = 0; i < files.length; i++) {
let filename = files[i];
if (filename.indexOf(".json") == -1) continue
hasJson = true;
//获取当前文件的绝对路径
let filedir = path.join(fPath, filename);
let content = fs.readFileSync(filedir, 'utf-8');
let group = getGroupByName(filename.replace(".json", ""), data.groups)
group.atlas = JSON.parse(content);
//删除原先json
del(filedir)
if (++count == countAll) endFun();
}
if(!hasJson)if (++count == countAll) endFun();
//序列化,不格式化,节省内存
}
})
} else {
if (++count == countAll) endFun();
}
})
function endFun() {
console.log("资源配置js生成完毕")
// del(join(readPath, "res.json"))
fs.writeFileSync(readPath + "res.json", JSON.stringify(data, "", "\t"));
}
function getGroupByName(name, groups) {
var group;
for (var i = 0; i < groups.length; i++) {
if (groups[i].name === name) {
group = groups[i];
break;
}
}
return group
}
This source diff could not be displayed because it is too large. You can view the blob instead.
const fs = require("fs");
const exec = require('child_process').exec;
const del = require('del');
const join = require('path').join;
// const packTextures = require("pack_textures");
//写入图集的文件夹
const outPath = "./released/resource/";
//读取散图的文件夹
const readPath = "./released/tm/";
const files = fs.readdirSync(readPath);
files.forEach(function (file) {
//路径
let fPath = join(readPath, file);
//只处理文件夹
if (fs.statSync(fPath).isDirectory()) {
//判断文件夹内是否有图片
if (!judgeHasImage(fPath)) return;
//如果文件夹不存在
if (!fs.existsSync(outPath + file)) {
fs.mkdirSync(outPath + file);
} else {
//图集文件存在就删除
if (fs.existsSync(outPath + file + "/" + file + ".json")) {
del(outPath + file + "/" + file + ".json")
}
if (fs.existsSync(outPath + file + "/" + file + ".png")) {
del(outPath + file + "/" + file + ".png")
}
}
// packTextures(
// fPath,
// outPath + file + "/" + file,
// 4096,
// 4096,
// false,
// 2,
// 2,
// true,
// true
// )
//全局命令装过,就直接用命令行
exec(
'packTextures' + //基础指令
' -i ' + fPath + //要合图集的文件夹路径
' -o ' + outPath + file + "/" + file + //输出路径及名字
' --mw ' + 4096 + //最大宽度
' --mh ' + 4096 +//最大高度
' -p ' + false + //长宽是否2的指数,canvas下没必要,false
' --sp ' + 2 + //图片间隔
' --bp ' + 2 + //边界间隔
' -r ' + true + //是否允许图片旋转
' -t ' + true //是否允许裁切图片边缘透明像素
,
{ encoding: 'utf8' },
(e) => {
if (e) return console.log(e);
console.log("生成图集:" + file);
}
)
}
})
/**
* 判断文件夹内是否有图片
* @param {*} path
*/
function judgeHasImage(path) {
const files = fs.readdirSync(path);
for (let i = 0; i < files.length; i++) {
const itm = files[i];
const stat = fs.statSync(path + "/" + itm);
if (stat.isDirectory()) {
//递归读取文件
if (judgeHasImage(path + "/" + itm + "/")) return true;
} else {
if (itm.substr(-4) === ".jpg" || itm.substr(-4) === ".png") return true;
}
}
return false;
}
......@@ -24,8 +24,8 @@ class TuiaAutoUpload {
var _this = this;
this.client = new OSS({
region: 'oss-cn-hangzhou',
accessKeyId: 'LTAI4Fw25WcfcGv7FvcHoiHK',
accessKeySecret: 'NZk1NtT9J5HFaAolNbtQdzTzLLvLYm',
accessKeyId: 'LTAI5tAEU43ff2kFkrKRLnxG',
accessKeySecret: '2qQIPVT3Lgp72s8RShDlE4uVNqZWgy',
bucket: _this.type === 'prod' ? 'duiba' : 'daily-duiba'
});
this.bar = new ProgressBar(chalk.yellow(` 文件上传中 [:bar] :current/${this.files().length} :percent :elapseds`), {
......
......@@ -39,8 +39,8 @@ function uploadSingleJs(url) {
const originPath = `/db_games/${url}/output.js`;
var client = new OSS({
region: 'oss-cn-hangzhou',
accessKeyId: 'LTAI4Fw25WcfcGv7FvcHoiHK',
accessKeySecret: 'NZk1NtT9J5HFaAolNbtQdzTzLLvLYm',
accessKeyId: 'LTAI5tAEU43ff2kFkrKRLnxG',
accessKeySecret: '2qQIPVT3Lgp72s8RShDlE4uVNqZWgy',
bucket: 'duiba'
})
var originFile;
......
......@@ -92,7 +92,7 @@ export function createElement<K extends new(p?: any) => ChildType, T extends Chi
// 简单点直接赋值
for (let k in inlineProps) {
// @ts-ignore 里面是 getter 和 setter 写的
(eleins[k] = inlineProps[k])
inlineProps[k] !== undefined && (eleins[k] = inlineProps[k])
}
}
......
......@@ -3,6 +3,13 @@ import { RenderContainer } from "./renderContainer";
import { EventsMap } from "./types";
import { nextTick } from "./utils";
export type DreamProps<T extends Record<string, any>, R = FYGE.Container> = {
ref?: (c: R) => void,
inlineProps?: Record<string, any>
className?: string
children?: FYGE.Container[], // 这样写的话,外面也能提示了 -。-
} & T
export type DreamFC<T extends Record<string, any> = {}, R extends any = FYGE.Container> = (props: {
ref?: (c: R) => void,
inlineProps?: Record<string, any>
......
This diff is collapsed.
......@@ -11,7 +11,7 @@ export const DreamSprite: OriginalElementWidthEvents<{
width?: number,
height?: number,
sizeType?: SpriteSizeType
}> = (props) => {
}, FYGE.Sprite> = (props) => {
const {
src,
width,
......
import Dream from "../../Dream";
import { DreamContainer } from "../DreamContainer/DreamContainer";
import { DreamShape } from "../DreamShape/DreamShape";
import { DreamTextField } from "../DreamTextField/DreamTextField";
export class DreamToast extends Dream.RenderContainer {
render() {
return (
<DreamContainer>
<DreamShape drawData={[0, 0, 460, 130]} alpha={0.8} />
<DreamTextField
text={this.props.msg}
size={28}
color='#ffffff'
verticalAlign={FYGE.VERTICAL_ALIGN.MIDDLE}
textWidth={460}
textHeight={130}
/>
</DreamContainer>
)
}
}
\ No newline at end of file
import Dream from "../../Dream";
import { RES } from "../../modules/RES";
import { UsePreload } from "../../modules/UseDecorator/usePreload";
import { DreamContainer } from "../DreamContainer/DreamContainer";
import { DreamSprite } from "../DreamSprite/DreamSprite";
import { DreamTextField } from "../DreamTextField/DreamTextField";
@UsePreload({
async preAction() {
await RES.loadGroup('common')
},
loadingComponent: null
})
export class DreamWaiting extends Dream.RenderContainer<{
msg?: string
}> {
render() {
const roleCont = RES.getRes('waitingBg.png')
const rotCont = RES.getRes('waitingRot.png')
let count = 0
const {
msg = '加载中...'
} = this.props
return (
<DreamContainer>
<DreamSprite src={roleCont} />
<DreamSprite src={rotCont} inlineProps={{
y: 55,
x: roleCont.width / 2 - rotCont.width / 2,
anchorX: rotCont.width / 2,
anchorY: rotCont.height / 2
}} onEnterFrame={(e) => {
count++
if (count % 30 == 0) {
(e.target as FYGE.Sprite).rotation += 45
}
}} />
<DreamTextField text={msg} color='#ffffff' size={26} textWidth={roleCont.width} inlineProps={{
y: 126
}} />
</DreamContainer>
)
}
}
\ No newline at end of file
......@@ -5,6 +5,7 @@ import { ResJson } from "./ResJson";
import { GameScene } from "./scenes/GameScene/GameScene";
import { HomeScene } from "./scenes/home";
import { NewGuyScene } from "./scenes/NewGuyScene/NewGuyScene";
import { Tools } from "./tools/Tools";
import Tween = FYGE.Tween;
import EventDispatcher = FYGE.EventDispatcher;
import Stage = FYGE.Stage;
......@@ -12,6 +13,16 @@ import RENDERER_TYPE = FYGE.RENDERER_TYPE
import Event = FYGE.Event
import getEnv = FYGE.getEnv;
/**
* 全局事件,为了和小程序交互
* 有可能多处页面用到,所以单开
*/
export const GDispatcher = new EventDispatcher();
export const loadAllGroups = async function() {
await RES.loadAllGroup()
}
export class Main {
//主舞台
stage: Stage;
......@@ -21,6 +32,10 @@ export class Main {
constructor(
canvas: HTMLCanvasElement,
config: {
isFirstGame: boolean,
liveCard: number
},
desWidth = 750,
desHeight = 1624,
divWidth?: number,
......@@ -31,6 +46,7 @@ export class Main {
resolution?: any,
) {
let sysInfo;
config && (Tools.PageData = config)
// 淘宝小程序环境就用canvas初始化
if (!window) { // 自行处理吧,这么判断也不保险,万一淘宝小程序加进了window
FYGE.initedByCanvas(canvas); // 里面会设置env为tb,这个很重要
......@@ -90,7 +106,7 @@ export class Main {
RES.loadConfig(ResJson)
await RES.loadGroup('common')
SceneController.changeScene(GameScene)
SceneController.changeScene(Tools.PageData.isFirstGame ? NewGuyScene : GameScene)
}
initWebEvent(){
......@@ -104,6 +120,8 @@ export class Main {
this._pause = false;
// @ts-ignore Tween计时清零
Tween._lastTime = null;
// 触发onShow
// GDispatcher.dispatchEvent({ type: G_EVENT.ON_SHOW });
}
/**
......@@ -111,6 +129,43 @@ export class Main {
*/
pause() {
// this._pause = true;//先不暂停了
// GDispatcher.dispatchEvent({ type: G_EVENT.ON_HIDE });
}
/**
* 添加全局事件,用于小程序的交互调用
* 一直很犹豫要不要放在main的实例里,还是和Main同级导出,还有上面的pause,run,下面的事件等
* @param name
* @param fun
* @param thisObj
* @param once
*/
addGlobalEvent(name: string, fun: Function, thisObj?: any, once: boolean = false) {
if (once) {
GDispatcher.once(name, fun, thisObj)
} else {
GDispatcher.addEventListener(name, fun, thisObj)
}
}
/**
* 派发全局事件,用于小程序的交互调用
* @param name 可以是事件名,也可以是事件
* @param data
*/
dispatchGlobalEvent(name: string | any, data?: any) {
GDispatcher.dispatchEvent(name, data)
}
/**
* 移除全局事件,用于小程序交互调用
* @param name
* @param fun
* @param thisObj
*/
removeGlobalEvent(name: string, fun: Function, thisObj?: any) {
GDispatcher.removeEventListener(name, fun, thisObj)
}
//在小程序页面卸载时调用onUnload,多次销毁后会有问题,再检查
......
This diff is collapsed.
This diff is collapsed.
......@@ -69,8 +69,9 @@ function ModalWraper(ModalNode: any) {
// 这里做了 适配,不知道为什么 有些拿不到宽高
if (ModalConfig?.center) {
const body = this.ModalBody
const sw = body.sw || getBoundsPropty(body, 'width')
const sh = body.sh || getBoundsPropty(body, 'height')
// TODO 这里好像算的有点问题多 20
const sw = body.sw || getBoundsPropty(body, 'width') - 20
const sh = body.sh || getBoundsPropty(body, 'height') - 20
this.ModalBody.position.set(layers.stageWidth / 2 - sw / 2, layers.stageHeight / 2 - sh / 2)
}
}
......
......@@ -25,6 +25,44 @@ export function fadeOutFactory(t: number) {
}
}
export function fadeOutUpFactory(t: number, upLen: number = 200) {
return function(cont: FYGE.Container) {
return new Promise<void>(r => {
FYGE.Tween.removeTweens(cont)
const oy = cont.y
FYGE.Tween.get(cont, {
onChange: () => {
cont.y = (oy - upLen * (1 - cont.alpha))
}
})
.set({alpha: 1})
.to({
alpha: 0
}, t, FYGE.Ease.quadIn)
.call(() => {
setTimeout(() => {
cont.y = oy
})
r()
})
})
}
}
export function BounceOutAni(t: number = 1000) {
return function (cont: FYGE.Container) {
return new Promise(r => {
const oy = cont.position.y
cont.position.y -= 100
FYGE.Tween.get(cont)
.to({
y: oy
}, t, FYGE.Ease.bounceOut)
})
}
}
/**
* 因为一些不可抗因素导致拿不到最后的 真是宽高
* @param Con
......
......@@ -11,6 +11,12 @@ import { UsePreload } from "../../modules/UseDecorator/usePreload";
loadingComponent: null
})
export class DrawFailModal extends Dream.RenderContainer {
onConfirm = () => {
this.props.onConfirm()
this.props.closeModal()
}
render() {
const roleCont = RES.getRes('DFMB.png')
const confirmbtn = RES.getRes('DFM1.png')
......@@ -19,14 +25,11 @@ export class DrawFailModal extends Dream.RenderContainer {
<DreamContainer>
<DreamSprite src={roleCont} />
<DreamSprite onClick={() => {
// TODO
this.props.closeModal()
}} inlineProps={{
<DreamSprite onClick={this.onConfirm} inlineProps={{
x: roleCont.width - 50,
y: -50
}} src={RES.getRes('closebtn.png')}/>
<DreamSprite onClick={this.props.closeModal} inlineProps={{
<DreamSprite onClick={this.onConfirm} inlineProps={{
x: roleCont.width / 2 - confirmbtn.width / 2,
y: 300
}} src={confirmbtn}/>
......
......@@ -4,6 +4,7 @@ import { DreamTextField } from "../../components/DreamTextField/DreamTextField";
import Dream from "../../Dream";
import { RES } from "../../modules/RES";
import { UsePreload } from "../../modules/UseDecorator/usePreload";
import { sendTbNet, TbNetName } from "../../tools/TbNet";
@UsePreload({
resList: [],
......@@ -14,15 +15,21 @@ import { UsePreload } from "../../modules/UseDecorator/usePreload";
})
export class DrawSucModal extends Dream.RenderContainer<{
closeModal: () => Promise<any>,
onConfirm: () => void
name: string,
img: string
}> {
onConfirm = () => {
// TODO 回到首页?
onClose2GameOver = () => {
this.props.onConfirm()
this.props.closeModal()
}
onConfirm = () => {
// sendTbNet(TbNetName.goMyPrize)
this.onClose2GameOver()
}
render() {
const roleCont = RES.getRes('DSMB.png')
const confirmbtn = RES.getRes('DSM1.png')
......@@ -36,8 +43,7 @@ export class DrawSucModal extends Dream.RenderContainer<{
<DreamSprite src={roleCont}></DreamSprite>
<DreamSprite onClick={() => {
// TODO
this.props.closeModal()
this.onClose2GameOver()
}} inlineProps={{
x: roleWidth - 50
}} src={RES.getRes('closebtn.png')}/>
......
import { DreamContainer } from "../../components/DreamContainer/DreamContainer";
import { DreamSprite } from "../../components/DreamSprite/DreamSprite";
import Dream from "../../Dream";
import { RES } from "../../modules/RES";
import { UsePreload } from "../../modules/UseDecorator/usePreload";
@UsePreload({
preAction: async() => {
await RES.loadGroup('FinalGiftModal')
}
})
export class FinalGiftModal extends Dream.RenderContainer {
onConfirm() {
this.props.onConfirm()
}
render() {
const roleCont = RES.getRes('FGMB.png')
const confirmbtn = RES.getRes('FGM1.png')
return (
<DreamContainer>
<DreamSprite src={roleCont} />
<DreamSprite src={confirmbtn} onClick={this.onConfirm.bind(this)} inlineProps={{
x: roleCont.width / 2 - confirmbtn.width / 2,
y: 500
}} />
</DreamContainer>
)
}
}
\ No newline at end of file
......@@ -5,6 +5,7 @@ import { RES } from "../../modules/RES";
import { UsePreload } from "../../modules/UseDecorator/usePreload";
import Dream from "../../Dream";
import { DreamTextField } from "../../components/DreamTextField/DreamTextField";
import { sendTbNet, TbNetName } from "../../tools/TbNet";
console.log(Dream)
@UsePreload({
......@@ -16,12 +17,12 @@ export class GameOverModal extends ModalComponent<{
score: number
}> {
onCancel() {
// TODO 回到首页
sendTbNet(TbNetName.goBackHome)
this.props.closeModal()
}
onConfirm() {
// TODO 显示复活卡弹窗
sendTbNet(TbNetName.openCardTask)
}
......
......@@ -4,6 +4,7 @@ import { DreamTextField } from "../../components/DreamTextField/DreamTextField";
import Dream from "../../Dream";
import { RES } from "../../modules/RES";
import { UsePreload } from "../../modules/UseDecorator/usePreload";
import { sendTbNet, TbNetName } from "../../tools/TbNet";
@UsePreload({
async preAction() {
......@@ -16,8 +17,8 @@ export class GameQuitModal extends Dream.RenderContainer<{
}> {
onConfirm = () => {
// TODO
this.props.closeModal()
sendTbNet(TbNetName.goBackHome)
}
render() {
......
......@@ -5,6 +5,7 @@ import Dream from "../../Dream";
import { DreamSpriteV2 } from "../../Dream/UI";
import { RES } from "../../modules/RES";
import { UsePreload } from "../../modules/UseDecorator/usePreload";
import { sendTbNet, TbNetName } from "../../tools/TbNet";
@UsePreload({
preAction: async function() {
......@@ -15,6 +16,8 @@ import { UsePreload } from "../../modules/UseDecorator/usePreload";
export class GameResumeModal extends Dream.RenderContainer<{
resumeNum: number,
closeModal: () => Promise<any>
onConfirm: () => void
onCancel: () => Promise<void>
}> {
countTextField: FYGE.TextField
intervalId: any
......@@ -46,9 +49,17 @@ export class GameResumeModal extends Dream.RenderContainer<{
/**
* 确认走复活逻辑
*/
onConfirm = () => {
// TODO 走下接口
onConfirm = async () => {
const {
success
} = await sendTbNet(TbNetName.reduceTools)
if (success) {
this.props.onConfirm()
this.props.closeModal()
} else {
this.props.closeModal()
}
}
render() {
......@@ -77,7 +88,10 @@ export class GameResumeModal extends Dream.RenderContainer<{
x: RoleContWidth / 2 - cancelBtn.width / 2,
y: 320 + confirmBtn.height + 20
}}
onClick={this.props.closeModal}
onClick={async () => {
this.props.onCancel()
this.props.closeModal()
}}
>
<DreamTextField ref={el=> {
this.countTextField = el
......
......@@ -9,71 +9,142 @@ export enum BoxType {
Box8 = 'Box8',
}
export const BoxTypeList: BoxType[] = [
BoxType.Box1,
BoxType.Box2,
BoxType.Box3,
BoxType.Box4,
BoxType.Box5,
BoxType.Box6,
BoxType.Box7,
BoxType.Box8
]
export const GameConfig = {
debugger: true,
GenerateSpace: [300, 400], // 生成间距
finalGiftPart: 0.1, // 最终奖励 概率 100%
maxLen: 550,
totoalPart: 0, // 全部概率
PartList: [] as {
preSumPart: number,
type: BoxType
}[], // 概率
GenerateConfig: {
angle: Math.PI * 40 / 180,
tanNum: Math.tan(Math.PI * 40 / 180)
},
CameraConfig: {
pos: {
x: 375,
y: 1100
},
},
GameStagePos: {
x: 160,
y: 1200
},
boxConfig: {
[BoxType.Box1]: {
resName: 'box1.png',
addScore: 5,
oc: {
x: 200, y: 100 // 判断中心点
x: 142, y: 230 // 判断中心点
},
oz: 60 // height
oz: 90, // height
dt: [-60, 50],
part: 10
},
[BoxType.Box2]: {
resName: 'box2.png',
addScore: 5,
oc: {
x: 200, y: 100
x: 142, y: 230
},
oz: 60
oz: 60,
dt: [-50, 50],
part: 10
},
[BoxType.Box3]: {
resName: 'box3.png',
addScore: 5,
oc: {
x: 200, y: 100
x: 142, y: 230
},
oz: 60
oz: 140,
dt: [-50, 50],
part: 10
},
[BoxType.Box4]: {
resName: 'box4.png',
addScore: 5,
oc: {
x: 200, y: 100
x: 142, y: 250
},
oz: 60
oz: 160,
dt: [-40, 40],
part: 10
},
[BoxType.Box5]: {
resName: 'box5.png',
addScore: 5,
oc: {
x: 200, y: 100
x: 142, y: 260
},
oz: 60
oz: 60,
dt: [-40, 40],
part: 10
},
[BoxType.Box6]: {
resName: 'box6.png',
addScore: 5,
oc: {
x: 200, y: 100
x: 142, y: 230
},
oz: 60
oz: 70,
dt: [-50, 50],
part: 10
},
[BoxType.Box7]: {
resName: 'box7.png',
addScore: 5,
oc: {
x: 200, y: 100
x: 142, y: 360
},
oz: 60
oz: 300,
dt: [-50, 50],
part: 4
},
[BoxType.Box8]: {
resName: 'box8.png',
addScore: 5,
oc: {
x: 200, y: 100
x: 142, y: 360
},
oz: 60
oz: 305,
dt: [-40, 40],
part: 4
}
}
}
let temp = []
for (let k in GameConfig.boxConfig) {
let kType: BoxType = k as any
temp.push(kType)
}
const tp: {
preSumPart: number,
type: BoxType
}[] = []
GameConfig.totoalPart = temp.reduce((pre, cur) => {
const tt = pre + GameConfig.boxConfig[cur].part
tp.push({
preSumPart: tt,
type: cur
})
return tt
}, 0)
GameConfig.PartList = tp
import { DreamContainer } from "../../components/DreamContainer/DreamContainer";
import { DreamShape } from "../../components/DreamShape/DreamShape";
import { DreamSprite } from "../../components/DreamSprite/DreamSprite";
import { DreamTextField } from "../../components/DreamTextField/DreamTextField";
import Dream from "../../Dream";
import Dream, {DreamProps } from "../../Dream";
import { fadeOutUpFactory } from "../../modules/animations";
import { RES } from "../../modules/RES";
import { BoxType, BoxTypeList, GameConfig } from "./GameConfig";
type GameEleType = DreamProps<{
type?: BoxType,
x?: number,
y?: number,
inlineProps?: Record<string, any>
isWithGift?: boolean
}, GameEle>
export class GameEle extends Dream.RenderContainer<GameEleType> {
GameBoxType: BoxType = BoxType.Box1
GiftIcon: FYGE.Sprite
constructor(props: GameEleType) {
super(props)
const {
type
} = this.props
if (type) {
this.GameBoxType = type
} else {
this.GameBoxType = BoxTypeList[Math.random() * BoxTypeList.length >> 0]
}
}
didRendered(): void {
}
onGetGift() {
if (this.GiftIcon) {
fadeOutUpFactory(500, 200)(this.GiftIcon)
}
}
export class GameEle extends Dream.RenderContainer {
render() {
const currGameBoxConfig = GameConfig.boxConfig[this.GameBoxType]
const boxRes = RES.getRes(currGameBoxConfig.resName)
const {
x,
y,
inlineProps,
isWithGift
} = this.props
const {
dt = [0, 0],
oc: {
x: ocx,
y: ocy
},
oz
} = currGameBoxConfig
const tanNum = Math.tan(GameConfig.GenerateConfig.angle)
// const offsetY = * Math.abs(spaceNum)
// console.log(boxRes, this.GameBoxType, GameConfig.boxConfig, currGameBoxConfig)
return (
<FYGE.Container>
<DreamTextField text="12123" color="#ffffff"></DreamTextField>
<DreamSprite src={RES.getRes('产品8.png')} inlineProps={{
x: 200,
y: 1000
}}></DreamSprite>
</FYGE.Container>
<DreamContainer inlineProps={{
...inlineProps,
x,y
}}>
<DreamContainer inlineProps={{
x: -currGameBoxConfig.oc.x,
y: -currGameBoxConfig.oc.y
}}>
<DreamSprite src={boxRes}></DreamSprite>
{
isWithGift && (
<DreamSprite ref={el => {
this.GiftIcon = el
}} src={RES.getRes('giftBoxIcon.png')} inlineProps={{
x: currGameBoxConfig.oc.x - 60,
y: currGameBoxConfig.oc.y - 80 - currGameBoxConfig.oz,
}} />
)
}
{
GameConfig.debugger && (
<DreamContainer>
<DreamShape type="circle" drawData={[0,0, 8]} fillColor="#f17368" inlineProps={{
x: currGameBoxConfig.oc.x,
y: currGameBoxConfig.oc.y
}} />
<DreamShape type="circle" drawData={[0,0, 8]} fillColor="#f17368" inlineProps={{
x: ocx,
y: ocy - oz
}} />
<DreamShape type="circle" drawData={[0,0, 8]} fillColor="#f17368" inlineProps={{
x: ocx + dt[0],
y: ocy - oz + tanNum * Math.abs(dt[0])
}} ></DreamShape>
<DreamShape type="circle" drawData={[0,0, 8]} fillColor="#f17368" inlineProps={{
x: ocx + dt[1],
y: ocy - oz - tanNum * dt[1]
}} ></DreamShape>
</DreamContainer>
)
}
</DreamContainer>
</DreamContainer>
)
}
}
\ No newline at end of file
This diff is collapsed.
import { DreamSpine } from "../../components/DreamSpine/DreamSpine";
import { DreamContainer } from "../../components/DreamContainer/DreamContainer";
import { DreamLottie } from "../../components/DreamLottie/DreamLottie";
import { DreamSpine, setSpineAni } from "../../components/DreamSpine/DreamSpine";
import { DreamTextField } from "../../components/DreamTextField/DreamTextField";
import Dream from "../../Dream";
import { JumpEnd } from "../../lotties/JumpEnd";
import { PerfectJumpEnd } from "../../lotties/PerfectJumpEnd";
import { fadeOutUpFactory } from "../../modules/animations";
import { RES } from "../../modules/RES";
import { UsePreload } from "../../modules/UseDecorator/usePreload";
export enum PlayAniEnum {
Stand = 'daiji',
Jump = 'zuizhong'
StandBy = 'dunxia1',
Jump = 'tiaoyue2'
}
const PlayerAction = {
JUMP: 'tiaoyue2',
STANDBY: 'dunxia1',
STAND: 'daiji'
}
export type PlayerIns = {
turnRound: (dir: 1 | -1) => void
jump: () => Promise<void>
jumpPrepare: () => Promise<void>
showJumpEndAtom: (score: number) => Promise<void>
}
@UsePreload({
......@@ -15,19 +35,45 @@ export enum PlayAniEnum {
loadingComponent: null
})
export class Player extends Dream.RenderContainer<{
getPlayer?: (ins: {
turnRound: (dir: 1 | -1) => void
target: FYGE.Spine
}) => void
getPlayer?: (ins: PlayerIns) => void
inlineProps?: Record<string, any>
}> {
SpineContainer: FYGE.Container
SpinePlayer: FYGE.Spine
AtomLottie: FYGE.Lottie
aniText: FYGE.TextField
didRendered(): void {
this.props.getPlayer && this.props.getPlayer({
turnRound: (dir) => {
this.SpinePlayer.scaleX = dir
this.SpineContainer.scaleX = dir
},
jump: () => {
return new Promise(r => {
setSpineAni(this.SpinePlayer, PlayerAction.JUMP, 1 , () => {
setSpineAni(this.SpinePlayer, PlayerAction.STAND)
r()
})
})
},
showJumpEndAtom:(score: number) => {
return new Promise(r => {
this.AtomLottie.visible = true
this.aniText.text = `+${score}`
fadeOutUpFactory(500, 100)(this.aniText)
this.AtomLottie.play(1, () => {
this.AtomLottie.visible = false
r()
})
})
},
target: this.SpinePlayer
jumpPrepare: () => {
return new Promise(r => {
setSpineAni(this.SpinePlayer, PlayerAction.STANDBY, 1 , () => {
r()
})
})
}
})
}
......@@ -35,9 +81,33 @@ export class Player extends Dream.RenderContainer<{
const PlayerSpineData = RES.getRes('rabbit.spi')
return (
<DreamContainer inlineProps={{
...this.props.inlineProps
}}>
<DreamTextField ref={el=> {
this.aniText = el
}} size={32} color="#fad99e" text="+0" textWidth={300} inlineProps={{
y: -210,
x: -150,
alpha: 0
}} ></DreamTextField>
<DreamContainer ref={el => {
this.SpineContainer = el
}}>
<DreamLottie ref={el => {
this.AtomLottie = el
}} inlineProps={{
x: -125,
y: -230,
visible: false
}} lottieData={JumpEnd} />
<DreamSpine ref={el => {
this.SpinePlayer = el
}} aniName={PlayAniEnum.Stand} spineData={PlayerSpineData} inlineProps={this.props.inlineProps}></DreamSpine>
}} aniName={PlayAniEnum.Stand} spineData={PlayerSpineData} inlineProps={{
y: 10,x: -5
}}></DreamSpine>
</DreamContainer>
</DreamContainer>
)
}
}
\ No newline at end of file
export class Stack<T extends any = number> {
list: T[] = []
get stackHead() {
return this.list[this.list.length - 1]
}
pushStack(item: T) {
this.list.push(item)
return item
}
popStack() {
return this.list.pop()
}
traverse(callbackfn: (value: T, index: number, array: T[]) => void) {
const sliceItems = this.list.slice(0)
sliceItems.forEach(callbackfn)
}
}
\ No newline at end of file
import { GDispatcher } from "..";
import { DreamToast } from "../components/DreamToast/DreamToast";
import { ModalCtroller } from "../modules/ModalControl";
//接口枚举,包括需要调用淘宝的api,用是否含有兑吧区分,或者单独区分
export enum TbNetName {
submitGame = 'mine.submitGame',
reduceTools = "mine.reduceTools",
goBackHome = "mine.goBackHome",
goMyPrize = "mine.goMyPrize",
onDrawLottery = "mine.onDrawLottery",
openCardTask = "mine.openCardTask"
}
async function fetchAsync(url: string) {
// await response of fetch call
let response = await fetch(url);
// only proceed once promise is resolved
let data = await response.json();
// only proceed once second promise is resolved
return data;
}
function showToast(msg: string) {
ModalCtroller.showModal(DreamToast, {
msg: msg
}, {
maskAlpha: 0
})
setTimeout(() => {
ModalCtroller.closeModal(DreamToast)
}, 1500)
}
//返回数据类型
interface dataOut {
success: boolean,
data?: any
code?: string,
message?: string
}
//记录数据
let dataRecord: {
[name: string]: any
} = {};
/**
* 发送接口
* @param netName
* @param parameter
* @param callback
* @param hideMsg
*/
export function sendTbNet(
netName: TbNetName,
parameter?: any,
callback?: (success: boolean, res?: dataOut) => void,
hideMsg: boolean = false
): Promise<dataOut> {
return new Promise((resolve, reject) => {
//网络超时
// let waitObj;
//@ts-ignore 本地开发,直接取数据
if (location.port == '8081') {
const netInfo = netName.split(".");
const url = `../../mock/miniTb/${netInfo[0]}/${netInfo[1]}.json`;
fetchAsync(url)
.then((data) => {
//清除超时
// clearWait(waitObj)
//记录数据
dataRecord[netName] = data;
//统一错误信息提示
if (!hideMsg && !data.success) showToast(data.message || "网络异常")
//回调
callback && callback(data.success, data);
resolve(data)
console.log(
`\n%c[ mock ]\n`
+ `NAME : ${netName} \n`
+ `STATE : %o \n`
+ `PARAM : %o \n`
+ `%cDATA : %o \n`
, `${data.success ? 'color:green' : 'color:red'}`
, data.success
, parameter
, `${data.success ? 'color:green' : 'color:red'}`
, data
);
}, () => {
resolve({ success: false, data: null });
})
return
}
let fun = function (e: { type: string, data: dataOut }) {
//清除超时记录
// clearWait(waitObj)
//移除事件
GDispatcher.removeEventListener(netName, fun);
var d = e.data;
//记录数据
dataRecord[netName] = d;
//统一错误信息提示,d.data为了区分网络超时
if (!hideMsg && !d.success) showToast(d.message || "网络超时")
//执行回调
callback && callback(d.success, d);
resolve(d)
console.log(
`\n%c[ request ]\n`
+ `NAME : ${netName} \n`
+ `STATE : %o \n`
+ `PARAM : %o \n`
+ `%cDATA : %o \n`
, `${d.success ? 'color:green' : 'color:red'}`
, d.success
, parameter
, `${d.success ? 'color:green' : 'color:red'}`
, d
);
}
//添加事件接收接口返回信息
GDispatcher.addEventListener(netName, fun);
//用事件方式吧,派发事件发接口,,,,注意很多独有的事件名别重了,onHide,onShow,onMessage等 放到最后,因为有同步的情况
GDispatcher.dispatchEvent({ type: "onMessage" }, { netName, parameter })
})
}
\ No newline at end of file
export class Tools {
static PageData: {
isFirstGame: boolean,
liveCard: number
} = {
isFirstGame: false,
liveCard: 1
}
}
\ No newline at end of file
// @ts-ignore
const app = getApp()
const audioIns = app?.audioContext
if (audioIns) {
audioIns.onPlay(() => {
console.log('播放')
})
audioIns.onError(() => {
console.log('audio error')
})
}
export function PlayAudio() {
audioIns && audioIns.play()
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment