Egret初体验–躲避类小游戏

下面简单介绍一下我这个游戏:
基本上就3个画面(准备再添加一个胜利的界面)
开始画面,一个按钮,点击进入游戏
游戏画面,滚动的背景,触摸移动的老鹰,从天而降的翔,以及右上角的时间条
结束画面,显示结果,关注按钮和重玩一次按钮
  
游戏主文件:GameContainer.ts(游戏逻辑)
4个类文件:GameUtil.ts(功能集合),BgMap.ts(背景滚动),Shit.ts(翔的创建和回收),ScorePanel.ts(结果展示)

/**GameUtil.ts*/
/**基于圆心的碰撞检测*/
        public static hitTestP(obj1:egret.DisplayObject,obj2:egret.DisplayObject):boolean
        {
            var rect2x:number;
            var rect2y:number;
            rect2x = obj2.x + obj2.width/2;
            rect2y = obj2.y + obj2.height/2;
            return obj1.hitTestPoint(rect2x, rect2y);
        }
/**根据name关键字创建一个Bitmap对象。name属性请参考resources/resource.json配置文件的内容。*/
    export function createBitmapByName(name:string):egret.Bitmap {
        var result:egret.Bitmap = new egret.Bitmap();
        var texture:egret.Texture = RES.getRes(name);
        result.texture = texture;
        return result;
    }
/**BgMap.ts*/
/**可滚动的背景*/
    export class BgMap extends egret.DisplayObjectContainer
    {
        /**图片引用*/
        private bmpArr:egret.Bitmap[];
        /**图片数量*/
        private rowCount:number;
        /**stage宽*/
        private stageW:number;
        /**stage高*/
        private stageH:number;
        /**纹理本身的高度*/
        private textureHeight:number;
        /**控制滚动速度*/
        private speed:number = 4;
 
        public constructor() {
            super();
            this.addEventListener(egret.Event.ADDED_TO_STAGE,this.onAddToStage,this);
        }
        /**初始化*/
        private onAddToStage(event:egret.Event){
            this.removeEventListener(egret.Event.ADDED_TO_STAGE,this.onAddToStage,this);
            this.stageW = this.stage.stageWidth;
            this.stageH = this.stage.stageHeight;
            var texture:egret.Texture = RES.getRes("bgImage");
            this.textureHeight = texture.textureHeight;//保留原始纹理的高度,用于后续的计算
            this.rowCount = Math.ceil(this.stageH/this.textureHeight)+1;//计算在当前屏幕中,需要的图片数量
            this.bmpArr = [];
            //创建这些图片,并设置y坐标,让它们连接起来
            for(var i:number=0;i<this.rowCount;i++)
            {
                var bgBmp:egret.Bitmap = AvoidShit.createBitmapByName("bgImage");
                bgBmp.y = this.textureHeight*i-(this.textureHeight*this.rowCount-this.stageH);
                this.bmpArr.push(bgBmp);
                this.addChild(bgBmp);
            }
        }
        /**开始滚动*/
        public start():void {
            this.removeEventListener(egret.Event.ENTER_FRAME,this.enterFrameHandler,this);
            this.addEventListener(egret.Event.ENTER_FRAME,this.enterFrameHandler,this);
        }
        /**逐帧运动*/
        private enterFrameHandler(event:egret.Event):void {
            for(var i:number=0;i<this.rowCount;i++)
            {
                var bgBmp:egret.Bitmap = this.bmpArr[i];
                bgBmp.y+=this.speed;
                //判断超出屏幕后,回到队首,这样来实现循环反复
                if(bgBmp.y > this.stageH) {
                    bgBmp.y = this.bmpArr[0].y-this.textureHeight;
                    this.bmpArr.pop();
                    this.bmpArr.unshift(bgBmp);
                }
            }
        }
        /**暂停滚动*/
        public pause():void {
            this.removeEventListener(egret.Event.ENTER_FRAME,this.enterFrameHandler,this);
        }
    }
/**Shit.ts*/
/**大便,利用对象池*/
    export class Shit extends egret.Bitmap
    {
        private static cacheDict:Object = {};
        /**生产*/
        public static produce(textureName:string):AvoidShit.Shit
        {
            if(AvoidShit.Shit.cacheDict[textureName]==null)
                AvoidShit.Shit.cacheDict[textureName] = [];
            var dict:AvoidShit.Shit[] = AvoidShit.Shit.cacheDict[textureName];
            var shit:AvoidShit.Shit;
            if(dict.length>0) {
                shit = dict.pop();
            } else {
                shit = new AvoidShit.Shit(RES.getRes(textureName));
            }
            shit.textureName = textureName;
            return shit;
        }
        /**回收*/
        public static reclaim(shit:AvoidShit.Shit,textureName:string):void
        {
            if(AvoidShit.Shit.cacheDict[textureName]==null)
                AvoidShit.Shit.cacheDict[textureName] = [];
            var dict:AvoidShit.Shit[] = AvoidShit.Shit.cacheDict[textureName];
            if(dict.indexOf(shit)==-1)
                dict.push(shit);
        }
 
        public textureName:string;
 
        public constructor(texture:egret.Texture) {
            super(texture);
        }
    }
/**ScorePanel.ts*/
/**成绩显示*/
    export class ScorePanel extends egret.Sprite
    {
        private txt:egret.TextField;
        public constructor() {
            super();
            var g:egret.Graphics = this.graphics;
            g.drawRect(0,0,100,100);
            g.endFill();
            this.txt = new egret.TextField();
            this.txt.width = 100;
            this.txt.height = 100;
            this.txt.textAlign = "center";
            this.txt.textColor = 0x00dddd;
            this.txt.size = 24;
            this.txt.y = 60;
            this.addChild(this.txt);
            this.touchChildren = false;
            this.touchEnabled = false;
        }
 
        public showScore(value:number):void {
            var msg:string = value+"";
            this.txt.text = msg;
        }
    }

上面4个源码基本是基于官方的Demo而来,下面是游戏逻辑的代码:(这个代码太长就只贴主要部分)
游戏初始画面就是把标题,按钮都堆积在上面,比较简单,给按钮增加一个点击事件的监听就行了

this.icon.addEventListener(egret.TouchEvent.TOUCH_TAP, this.gameStart, this);

游戏进行界面,主要有三点:时间轴,翔,碰撞检测(GameUtil做了,直接用就行)
时间轴有三部分:背景框,中间的轴,遮罩层。

/**背景框*/
            this.timelinebg = AvoidShit.createBitmapByName("tlbgImage");
            this.timelinebg.x = this.stageW - this.timelinebg.width - 10;
            this.timelinebg.y = 10;
            this.addChild(this.timelinebg);
/**中间的轴*/
            this.timeline = AvoidShit.createBitmapByName("tlImage");
            this.timeline.x = this.stageW - this.timeline.width - 13;
            this.timeline.y = 14;
            this.addChild(this.timeline);
/**遮罩层*/
            this.timelinemask = new egret.Rectangle(0, 0, this.timeline.width, this.timeline.height);
            this.timeline.mask = this.timelinemask;
/*计时器增加遮罩层刷新的方法*/
            this.gameTimer = new egret.Timer(this.timeDelay,this.timeCount);
            this.gameTimer.addEventListener(egret.TimerEvent.TIMER, this.timelineDown, this);
/**遮罩层移动*/
private timelineDown(evt:egret.TimerEvent):void {
            this.timelinemask.y += this.timeline.height/20;
        }

翔的产生和销毁都是调用Shit.ts中的方法

/**创建大便*/
        private createShit(evt:egret.TimerEvent):void{
            var shit:AvoidShit.Shit = AvoidShit.Shit.produce("shitImage");
            shit.x = Math.random()*(this.stageW-shit.width);
            shit.y = -shit.height-Math.random()*300;
            this.addChildAt(shit,this.numChildren-1);
            this.shits.push(shit);
        }
//大便运动
            var theShit:AvoidShit.Shit;
            var enemyFighterCount:number = this.shits.length;
            for(i=0;i<enemyFighterCount;i++) {
                theShit = this.shits[i];
                theShit.y += this.downTimes * speedOffset;
                if(theShit.y>this.stageH)
                    delArr.push(theShit);
            }
            for(i=0;i<delArr.length;i++) {
                theShit = delArr[i];
                this.removeChild(theShit);
                AvoidShit.Shit.reclaim(theShit,"shitImage");
                this.shits.splice(this.shits.indexOf(theShit),1);
            }

游戏结束有两个条件,一是时间到了,二是碰到翔
结束画面就是展示成绩和提供两个按钮
最主要的应该是微信分享功能:
需要用到两个文件libs/WeixinAPI.d.ts和launcher/WeixinAPI.js
并在html页面中增加调用

private doShare(n:number,m:number) {
            WeixinApi.ready(function(api:WeixinApi) {
                var info:WeixinShareInfo = new WeixinShareInfo();
                info.title = "我本卖萌鸟,何处惹尘埃?";
                if (m == 0) {
                    info.desc = "我本卖萌鸟,何处惹尘埃?";
                } else {
                    info.desc = "我本卖萌鸟,何处惹尘埃?屎开,屎开~~我躲过了" + n + "坨大便,你行吗?";
                }
                info.link = "http://games.11wj.com/fly/launcher/release.html";
                info.imgUrl = "http://games.11wj.com/fly/resource/assets/icon.png";
                api.shareToFriend(info);
                api.shareToTimeline(info);
            })
        }
时间: 2024-11-09 00:44:13

Egret初体验–躲避类小游戏的相关文章

WEBGL学习笔记(七):实践练手1-飞行类小游戏之游戏控制

接上一节,游戏控制首先要解决的就是碰撞检测了 这里用到了学习笔记(三)射线检测的内容了 以鸟为射线原点,向前.上.下分别发射3个射线,射线的长度较短大概为10~30. 根据上一节场景的建设,我把y轴设为前进方向,z轴设为高度~ 如果射线返回有结果,那么说明鸟遇到了障碍物.代码如下: var raycaster1 = new THREE.Raycaster(birdmesh.position, new THREE.Vector3(0, 1, 0), 0, 30) var raycaster2 =

你的智商几年级,来体验这款小游戏吧!

数学再不学,脑子都笨了,闲暇的时候,写了一个小游戏,天才帝一步,欢迎大家下载,大人小孩能够比赛的! [技术支持]: 天才帝一步里面的后台数据和官方站点所有由"Bmob移动云服务"提供全套支持,须要了解的同学能够直接登录:www.bmob.cn 或者直接回复你的问题给我. [游戏简单介绍]: 天才帝一步,比比谁速度!自从用了"天才帝一步",妈妈再也不操心我的算术了! 1.经典模式:以最短时间答对20答题,俗称小旋风模式: 2.禅模式:就是20秒内答尽可量多题的模式,磨

微信小游戏入门与实战 引爆朋友圈

第1章 准备工作(需要ES5,ES6基础)学员作品演示:https://pan.baidu.com/s/1gEMWzujg72soj0cEUOtJ2A 密码:uy2n,本章首先介绍课程目标,学习收获等,然后通过与APP.小程序的对比,让大家知道什么是微信小游戏以及微信小游戏前景如何,有哪些特点,然后带大家搭建微信小游戏的开发环境和调试环境,之后会对微信小游戏开发前注意事项与准备工作进行讲解,目...1-1 课程导学1-2 小游戏官方开发工具快速体验1-3 小游戏开发测试环境搭建和工具链使用1-4

使用Laya引擎开发微信小游戏(上)

本文由云+社区发表 使用一个简单的游戏开发示例,由浅入深,介绍了如何用Laya引擎开发微信小游戏. 作者:马晓东,腾讯前端高级工程师. 微信小游戏的推出也快一年时间了,在IEG的游戏运营活动中,也出现了越来越多的以小游戏作为载体运营的活动类型,比如游戏预约,抢先试完等等,都收到了非常良好的效果. 在支持微信小游戏的游戏引擎中,Cocos,Egret,Laya都对小游戏的开发提供了很多强大的支持.前段时间正好抽空研究了一下这块的内容,现做一个总结,针对如何使用Laya引擎开发微信小游戏给大家做一下

微信小游戏入门与实战 刷爆朋友圈

第1章 课程介绍与准备工作本章首先介绍课程目标,学习收获等,然后通过与APP.小程序的对比,让大家知道什么是微信小游戏以及微信小游戏前景如何,有哪些特点,然后带大家搭建微信小游戏的开发环境和调试环境,之后会对微信小游戏开发前注意事项与准备工作进行讲解,目的是为了让大家在开发微信小游戏的时候可以跳过不必要遇到的坑,为后面的小游戏... 第2章 微信小游戏开发原理与JS面向对象初步填坑本章会带大家快速创建第一个微信小游戏项目,并跑起来,让大家快速的体验和熟悉小游戏开发和运行的整体流程,之后会对微信小

微信为什么要搞一个小游戏?

众厂关于 H5 游戏市场的争夺,自 2014 年以来,一直就没有停止过.但一直也没有尘埃落定,最终花落谁家,鹿死谁手现在还不好讲.微信推出小程序,继而推出小游戏,只是腾讯数年来在 H5 市场企业战略的一环. 微信为什么要自定义一套技术,起名为小程序?明明就是原来的 H5 技术,为什么 CSS 不叫 CSS,叫 WXSS:为什么 HTML 不叫 HTML,叫 WXML:为什么明明有 JS.TS,还要自主研发一个 WXS,并且声称"WXS 与 JS 是不同的语言,有自己的语法,并不和 JS 一致&q

小游戏:线圈打方块

线圈打方块 一款射击类小游戏,它和我上一个"线圈切方块"的游戏是同时写的. 玩法说明:游戏开始后,会出现一个随机生成的线圈,一个立方体方块会沿着线圈的轨迹运动. 鼠标左键按下进行射击.鼠标右键拖动可以改变视角.键盘'K'可以改变线圈键盘'X'恢复为默认视角按空格键开始和暂停游戏时间为60秒,切到方块后会有机率地出现小球,切到小球后会加时加子弹. 下载地址: http://files.cnblogs.com/WhyEngine/ShootCubeInCircle..zip 小游戏:线圈打

谋哥:社交小游戏App将是下一个金矿!

[谋哥每天一原创干货,第四十五篇] 移动互联网的机会是非常多的,谁先做谁的机会就更大,所以把握时机非常重要.如今的App市场,各个分类的App已经多得眼花,也就是所谓的红海一片. 那么,在移动浪潮下,是不是还有其他机会?开发者的机会? 社交小游戏就是下一个金矿! 我很早以前,都在群里说我对社交游戏很看好,如今却依然被我看好.为什么呢?我们知道前几天<围住神经猫>火爆之后,很多商家已经闻到这种小游戏容易成功的气息.我也在文章说明这种游戏爆火其实很多专家无法理解,更多的时候是一种涌现,但是!它的突

了解python,利用python来制作日常猜拳,猜价小游戏

初次接触python,便被它简洁优美的语言所吸引,正所谓人生苦短,python当歌.python之所以在最近几年越发的炽手可热,离不开它的一些特点: 1.易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单.2.易于阅读:Python代码定义的更清晰.3.易于维护:Python的成功在于它的源代码是相当容易维护的.4.一个广泛的标准库:Python的最大的优势之一是丰富的库,跨平台的,在UNIX,Windows和Macintosh兼容很好.5.互动模式:互动