美文网首页让前端飞
别踩白块儿项目记录

别踩白块儿项目记录

作者: IrisLong | 来源:发表于2019-03-22 18:02 被阅读1次
技术栈: egret+ts

第一个游戏小项目,有点可惜的是并非独立完成
其实什么方式写出来并没有那么重要,重要的是将这个游戏里面涉及到的知识点最终变成自己的
以后再碰到类似的逻辑处理起来就不会毫无头绪了
私以为,写代码也是一个积累的过程
不断将目前的知识盲区解锁解锁再解锁
自然而然会的就多起来了


别踩白块儿项目效果图
项目需求

1.未开始游戏时 -> 最底层始终全部都是白色方块
2.游戏过程中 -> 每行只能有一个黑色方块,其余都是白色方块
3.游戏上方 -> 存在一个计数器记录游戏时间,计数器走到0,则游戏结束
4.点击黑色方块
  1)不跳行点击 -> 黑色方块颜色变为蓝色,同时界面方块行上移,可以持续进行下一步点击操作
  2)跳行点击 -> 黑色方块颜色变为蓝色,同时界面弹出蓝色按钮,则提示游戏结束,你走了##步
5.点击白色方块 -> 白色方块颜色变为红色,同时界面弹出蓝色按钮,则提示游戏结束,你走了##步
6.重新开始游戏 -> 回到初始状态

项目逻辑

其实写游戏的时候,一开始不需要过分关注功能的实现
反而可以最简化,也就是暂时不管如何实现游戏中的各种功能
而是先开始从零开始搭建,等需要功能的时候再写

以这个游戏项目为例
1.创建一个方块
2.生成一行方块
3.生成一页方块
4.创建记时面板
5.创建游戏结束界面 -> 1)显示游戏步数 2)再次开始游戏的按钮

上述罗列的是整个游戏项目的骨架,至于游戏里面涉及到的功能逻辑,都是在主干上进行伸展

几处核心代码
  • 生成一行方块 -> 同理: 生成一页方块
    涉及知识点:
      1) for循环
      2) 数组 -> push方法
// 生成一行方块 -> 一行四个首尾相连一次排列
    private _rects:Array<Rect>;
    private createRects(){
        this._rects = [];
        for(var i=0; i<4; i++){
            var rect:Rect = new Rect();   // 实例化单个小方块
            this._rects.push(rect);
            rect.x = rect.width*i;
            this.addChild(rect);
            this.addEventListener(egret.TouchEvent.TOUCH_TAP,this.clickRect,this);
        }
    }
效果示意图
  • 每一行方块中随机生成一个黑色方块
    涉及知识点:
      1) Math.random()
      2) if~else语句
private currentBlackRectIndex = 0;
    public createBlackRect(){
        var n:number = Math.random();
        if(n>=0 && n<0.25){
            this.currentBlackRectIndex = 0;
        }else if(n>=0.25 && n<0.5){
            this.currentBlackRectIndex = 1;
        }else if(n>=0.5 && n<0.75){
            this.currentBlackRectIndex = 2;
        }else if(n>=0.75 && n>1){
            this.currentBlackRectIndex = 3;
        }
        this._rects[this.currentBlackRectIndex].type = RectType.CLICKABLE;
    }
一行白色方块->内部有一个黑色方块
  • 定时器功能 -> 计时结束 -> 游戏结束 -> 弹出结束界面
    涉及知识点:
      1) 计时器
class TimerPannel extends egret.Sprite{
    public constructor(){
        super();
        this.draw();
        this.createTimer();
    }

    // 计时面板
    private label:egret.TextField;
    private draw(){
        this.label = new egret.TextField();
        this.label.x = this.label.width/2;
        this.label.y = 300;
        this.label.width = egret.MainContext.instance.stage.stageWidth;
        this.label.text = "20'00''";
        this.label.textColor = 0xff0000; // 默认字体是白色
        this.label.textAlign = egret.HorizontalAlign.CENTER;
        this.addChild(this.label);
    }

    // 定时器功能
    private timer:egret.Timer;
    private num = 20;
    private createTimer(){
        this.timer = new egret.Timer(1000,this.num); // 间隔,执行次数
        this.timer.addEventListener(egret.TimerEvent.TIMER,this.timerFunc,this);
        this.timer.addEventListener(egret.TimerEvent.TIMER_COMPLETE,this.timerComFunc,this);
    }

    private maxTime:number = 20;
    private timerFunc(){  // 计时过程中触发
        this.maxTime--;
        this.label.text = this.maxTime + "'00''";
        console.log(this.maxTime);
    }

    private timerComFunc(){  // 计时结束后触发
        this.label.text = this.maxTime + "'00''";
        console.log(this.maxTime);
        egret.MainContext.instance.stage.dispatchEventWith("gameOver");
    }

    public start(){
        this.label.text = "20'00''";
        this.maxTime = 20;
        this.timer.reset();
        this.timer.start(); 
    }

    public stop(){
        this.timer.stop();
    }
}
逻辑BUG
  • 方块生成页之后 -> 点击判断失效 -> 一直进入 "点错了" 这个判断区间
    原因: 当前行数逻辑出错

  • 下移函数失效
      原本以为是下移步骤的逻辑出错 -> 但排查后发现逻辑没问题

// 行数下移逻辑
public move() {
        this._currentRow++;
        if (this._currentRow === Data.getRectRow()) {   // 当前行数 = 总行数
            this._currentRow = 0;
            this.createBlackRect();
        }
        // egret.log(this.y)
        this.y = this._currentRow * Data.getRectWidth();
        // egret.log(this.y)
    }
}
// 点击正确 -> 行数向下移动
    public nextRow() {
        for (var i = 0; i < Data.getRectRow(); i++) {
            this._pageRects[i].move();
            Data.score++;
        }
    }

  实际原因: 抛出函数没有成功抛出,或者说抛出去的函数,没有被目标接收到!!!


why? -> 两个文档里面,this指向不同
统一 监听事件的发送者

见 -> 事件机制

  • 定时文本无法实时跟新,并且定时面板无法在 PageRect文件 里面实例化
    思考方向: -> 1)容器问题 或者 2)层级问题

相关文章

网友评论

    本文标题:别踩白块儿项目记录

    本文链接:https://www.haomeiwen.com/subject/xwwfvqtx.html