Egret开发《消灭方块》后记(三)点击事件那点事

        追求好的性能就要对代码很苛刻,效率都是一点一点挤出来的,蚊子肉也是肉,但是这一点点的积累就会带来一个很流畅的游戏。本篇说的是关于点击事件的优化,对效率的提升可能不是那么明显,只是为你提供一种用更高效的方式解决问题的思路,希望能对你有所启发。

怎么来减少事件侦听

        对于《消灭方块》这个游戏,怎么判断玩家点击的是那个方块呢?假如让你来实现你会怎么做呢?是给每个方块添加一个点击事件吗?如果你想到的是这一种之外的方式,那么恭喜你,你已经是个注重效率的程序员了。

        那么讲一下《消灭方块》的点击判断吧。方块不接受任何事件,但是在方块下面放一个接受点击的交互层,长和宽和方块总体的宽高保持一致,玩家点击其实是点击的交互层,这样的话我捕获交互层点击事件的localX和localY,数学运算一下就可以知道点击的是那个方块,具体看下图:



从点击坐标计算点击方块索引的代码:

    private getTouchIndexByPos(localX, localY):number
    {
        return Math.floor(localX / (GameConfig.BLOCK_WIDTH + GameConfig.BLOCK_MARGIN)) +
            Math.floor(localY / (GameConfig.BLOCK_WIDTH + GameConfig.BLOCK_MARGIN)) * GameSettings.COLUMN;
    }

        这样我只需要一个点击事件就很好地实现点击方块的判断。这种方法的好处:首先执行效率高,做一点数学运算的消耗可以忽略不计了,其次玩家永远都不会点错方块(比如方块下落的时候被点击也不会被误判)。突然有种感觉,玩家玩游戏只是在玩数组里的数据而已。

        如果你还有更好的方式,请留言一起讨论。

点击事件还可以这么用

        做过网页的朋友一定会记得HTML有个“热点图片”,这很好用啊,当然要借鉴过来啊。“热点图片”就是一张图片,点击不同的区域触发不同的事件而已。《消灭方块》最后结算界面就是个“热点图片”,左右两边的“按钮”是和背景图在一起的。



这其实是我想偷懒的结果…这样就不用切图再做按钮再拼UI了,对吗?
实现代码:

class HotspotBitmap extends egret.Bitmap
{
    private _hotspot:any[];
    public constructor()
    {
        super();
        this._hotspot = [];
        this.touchEnabled = true;
        this.addEventListener(egret.TouchEvent.TOUCH_BEGIN, this.onTouch, this);
    }

    public addHotspotArea(rect:egret.Rectangle, callBack:Function, thisObj:any, para?:any):void
    {
        this._hotspot.push({"rect":rect, "callBack":callBack, "thisObj":thisObj, "para":para});
    }

    private onTouch(e:egret.TouchEvent):void
    {
        var x:number = e.localX;
        var y:number = e.localY;
        var tempObj:any;
        for(var i:number = 0;i < this._hotspot.length;i ++)
        {
            tempObj = this._hotspot[i];
            if(tempObj.rect.contains(x, y))
            {
                if(tempObj.para)
                    tempObj.callBack.call(tempObj.thisObj, tempObj.para);
                else
                    tempObj.callBack.call(tempObj.thisObj);
            }

        }
    }
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值