前面介绍过了打豆豆小游戏的入口和各个场景之间的切换,这一篇介绍一下Ball.js这个类和GameScene.js这个主要游戏场景这个类。

在游戏中有十种不同颜色的小球,当你点到正确的位置,小球就可以消除,在小球消除的时候有一个掉下来的动画。

下面是Ball.js的源码

(function(window){//Ball这个类继承自Container类,接受一个color参数,表示这个小球是什么颜色function Ball(color){this.Container_constructor();//小球的颜色this.color=color;//tick时间的侦听器,这个变量用于在off的时候移除侦听时间this.tickListener;//小球下落时候的x方向的速度this.speedX;//小球下落时候的y方向的速度this.speedY;//小球下落的加速度this.speedA=4;//根据color这个变量的值,从单列类中的resource中获取到之前加载好的图片,然后创建bitmap对象this.gd=new GlobalData();var ball=new createjs.Bitmap(this.gd.resource.getResult("image"+color));//图片本身比较大,这里做了一下缩小ball.scaleX=0.5;ball.scaleY=0.5;this.addChild(ball);}var p=createjs.extend(Ball,createjs.Container);//小球开始掉落的函数p.beginFall=function(){//添加tick事件侦听,tick事件大概相当于flash中enterFrame事件,在每次舞台更新的时候触发this.tickListener=this.on("tick",this.fall,this);//设置小球的速度this.speedX=-5+10*Math.random();this.speedY=-20;};//在每次tick事件时调用,更新小球的位置,达到小球掉落的效果p.fall=function(e){this.x+=this.speedX;this.y+=this.speedY;this.speedY+=this.speedA;//在检查到小球掉出舞台以后,移除小球,并且移除侦听的事件(用on方法添加的侦听时间,只能用off方法来移除侦听if(this.y>this.gd.canvas.height+50){if(this.parent!=null){this.parent.removeChild(this);this.off("tick",this.tickListener);}}};window.Ball=createjs.promote(Ball,"Container");
}(window));

接下来就是主要的游戏场景,里面包括游戏部分、倒计时条、得分和返回按钮四个部分。

1.首先用Shape类画出了一个30*15的方格背景,如下图

2.记录方格的位置,然后随机排列位置数组,然后在数组的前200个位置上放置小球,这样就做到了小球随机排列的效果(这里没有用数组自带的sort方法,因为自带的方法有bug,而且效率低)

3.侦听点击事件,根据点击事件的坐标,判断点击到了哪个方格上,如果是空白方格就检测方格所在的十字是否有同颜色的小球,如果有的话就调用小球掉落的方法,并且更新分数和播放音效。如果点错了就播放错误的音效,然后扣掉一定的时间

4.倒计时结束后游戏就结束了,看上去游戏很简单,很无聊,但是想要得到200分相当不容易

下面是GameScene.js的源码

(function(window){function GameScene(){//继承自Container类this.Container_constructor();this.squareNumArray;this.squaresInPosition=[];this.tickCount=0;this.tickListener;this.isGameOver=false;this.score=0;this.gd=new GlobalData();this.bg=new createjs.Container();this.bg.x=25;this.bg.y=60;this.addChild(this.bg);this.bgSquares=new createjs.Shape();this.bg.addChild(this.bgSquares);this.bgDownShape=new createjs.Shape();this.bg.addChild(this.bgDownShape);this.bg.on("mousedown",this.onBgMouseDown,this);this.bg.on("pressup",this.onBgMouseUp,this);this.ballContainer=new createjs.Container();this.ballContainer.x=25;this.ballContainer.y=60;this.addChild(this.ballContainer);this.timeBarContainer=new createjs.Container();this.timeBarContainer.x=30;this.timeBarContainer.y=25;this.addChild(this.timeBarContainer);this.timeBar=new createjs.Shape();this.scroeText=new createjs.Text("0", "16px Microsoft Yahei", "#000000");var scoreTitle=new createjs.Text("得分:", "16px Microsoft Yahei", "#000000");scoreTitle.x=400;scoreTitle.y=20;this.addChild(scoreTitle);this.scroeText.x=450;this.scroeText.y=20;this.addChild(this.scroeText);this.backButton=new SHLTextButton("返回",60,30,"#ffffff",14,"#00cfef","#0093d9");this.backButton.x=700;this.backButton.y=20;this.backButton.on("click",this.onBack,this);this.addChild(this.backButton);this.init();this.initTimeBar();this.tickListener=this.on("tick",this.onTick);}var p=createjs.extend(GameScene,createjs.Container);p.init=function(){this.squareNumArray=new Array(GameScene.HENG*GameScene.SHU);var i,j;for(i=0;i<GameScene.HENG;i++){this.squaresInPosition[i]=new Array();for(j=0;j<GameScene.SHU;j++){ this.squareNumArray[i*GameScene.SHU+j]=i*GameScene.SHU+j; var n=i+j; var color; if(n%2==0) { color="#ffffff"; } else { if(i%2) { color="#daf5d7"; } else { color="#fde4eb"; } } this.bgSquares.graphics.beginFill(color).drawRect(i*25,j*25,25,25).endFill(); this.squaresInPosition[i][j]=undefined; }}this.bgSquares.cache(0,0,750,375);this.bgDownShape.graphics.beginFill("#666").drawRect(0,0,25,25).endFill();this.bgDownShape.cache(0,0,25,25);//先放在屏幕外,要显示时放到显示的位置this.bgDownShape.x=-100;this.bgDownShape.y=-100;randomSort(this.squareNumArray);function randomSort(arr){var k;for(k=0;k<arr.length;k++){ var temp; var randomIndex=Math.floor(Math.random()*arr.length); temp=arr[k]; arr[k]=arr[randomIndex]; arr[randomIndex]=temp; }}for(i=0;i<10;i++){var color=i+1;for(j=0;j<20;j++){ var ball=new Ball(color); var p=this.squareNumArray[20*i+j]; var posX=parseInt(p/GameScene.SHU); var posY=p%GameScene.SHU; ball.x=posX*25; ball.y=posY*25; this.squaresInPosition[posX][posY]=ball; this.ballContainer.addChild(ball); }}};p.initTimeBar= function (){var timeText=new createjs.Text("剩余时间", "14px Microsoft Yahei", "#000000");timeText.y=-5;this.timeBarContainer.addChild(timeText);var b=new createjs.Shape();b.x=60;b.graphics.setStrokeStyle(1).beginStroke("#ff9999").beginFill("#ffffff");b.graphics.drawRect(0,0,240,10);b.graphics.endFill();this.timeBarContainer.addChild(b);this.setTimerBar(1);this.timeBar.x=60;this.timeBarContainer.addChild(this.timeBar);};p.setTimerBar=function(p){this.timeBar.graphics.clear();this.timeBar.graphics.beginFill("#ff3333");this.timeBar.graphics.drawRect(1,1,238*p,8);this.timeBar.graphics.endFill();};p.onBgMouseDown=function(e){var posX=parseInt(e.localX/25);var posY=parseInt(e.localY/25);if(this.squaresInPosition[posX][posY]){return;}if(this.isGameOver){return;}this.bgDownShape.x=posX*25;this.bgDownShape.y=posY*25;var isWrong=true;var squareWithBall=this.getTargetBalls(posX,posY);var tempScore=0;for(var i=0;i<squareWithBall.length;i++){ var b=squareWithBall[i]; for(var j=0;j<squareWithBall.length;j++) { var b1=squareWithBall[j]; if(b.color==b1.color&&j!=i) { this.ballContainer.addChild(b); b.beginFall(); this.squaresInPosition[b.x/25][b.y/25]=undefined; isWrong=false; tempScore++; break; } } } if(isWrong) { this.tickCount+=30; this.updateTickCount(); if(this.gd.isSoundOn) { createjs.Sound.play("wrongSound"); } } if(tempScore) { this.score+=tempScore; this.updateScore(); if(this.gd.isSoundOn) { createjs.Sound.play("rightSound"); } } }; p.onBgMouseUp=function(e) { this.bgDownShape.x=-100; this.bgDownShape.y=-100; }; p.getTargetBalls=function(i,j) { var squareWithBall=[]; var n; var s; for(n=j-1;n>=0;n--) { s=this.squaresInPosition[i][n]; if(s) { squareWithBall.push(s); break; } } for(n=j+1;n<GameScene.SHU;n++) { s=this.squaresInPosition[i][n]; if(s) { squareWithBall.push(s); break; } } for(n=i-1;n>=0;n--) { s=this.squaresInPosition[n][j]; if(s) { squareWithBall.push(s); break; } } for(n=i+1;n<GameScene.HENG;n++) { s=this.squaresInPosition[n][j]; if(s) { squareWithBall.push(s); break; } } return squareWithBall; }; p.onTick=function(e) { this.tickCount++; if(this.tickCount%30==0) { this.updateTickCount(); } }; p.updateTickCount=function() { this.setTimerBar(1-this.tickCount/3600); if(this.tickCount>=3600) { this.off("tick",this.tickListener); this.gameOver(); } }; p.updateScore=function() { var gd=new GlobalData(); gd.scroe=this.score; this.scroeText.text=this.score; }; p.gameOver=function() { this.isGameOver=true; this.dispatchEvent(new createjs.Event("gameover")); }; p.onBack=function(e) { this.dispatchEvent(new createjs.Event("backbutton")); }; GameScene.HENG=30; GameScene.SHU=15; window.GameScene=createjs.promote(GameScene,"Container"); }(window));

createjs-打豆豆小游戏制作(3)相关推荐

  1. 基于H5 网页的打豆豆小游戏的设计与实现

    目 录 摘 要 I Abstract II 第1章 绪论 1 1.1研究背景及意义 1 1.2研究现状 2 1.3研究主要内容 3 第2章 技术分析 4 2.1 HTML5简介 4 2.2游戏引擎 4 ...

  2. createjs-打豆豆小游戏制作(1)

    在学习了createjs一段时间以后,自己做了一个打豆豆小游戏.以前玩过flash版的,非常喜欢,于是就自己做了一个. 下面是最终的效果图: 游戏规则: 点击空白方格,在方格所在的十字上,相同颜色的豆 ...

  3. createjs-打豆豆小游戏制作(4)

    在前面游戏的主要部分已经完成了,然后就是一些次要的场景了,包括菜单.游戏得分结果.游戏设置界面(其实只有一个设置音效是否打开)和游戏的说明界面. 1.菜单 菜单这个场景只包含三个按钮,开始游戏.设置和 ...

  4. html游戏开发开题报告,基于H5 网页的打豆豆小游戏的设计与实现毕业论文+开题报告+设计源码...

    摘  要 网页游戏是一个用现实包装的快感反馈引擎,它的根本目的始终是让玩家能够得到舒畅的体验为了娱乐心神,所以开发出大家喜欢的,高品质的休闲游戏会受到人们的普遍欢迎.打豆豆小游戏这款游戏主要是利用cs ...

  5. 基于pygame的射击小游戏制作(一)让飞船动起来

    基于pygame的射击小游戏制作(一)让飞船动起来 一.文件结构 alien_invasion.py 是整个系统的主文件,用来创建游戏中的一系列对象,ai_settings存储设置.screen存储显 ...

  6. 微信小游戏制作坦克大战(四)添加敌方坦克,敌方坦克可以随机移动

    微信小游戏制作坦克大战(四)添加敌方坦克,敌方坦克可以随机移动 首先导入敌方坦克素材 重命名为敌方坦克1 敌方坦克也移动到屏幕外面,后面使用克隆体来显示. 我们给敌方坦克添加事件 好的,现在敌方坦克已 ...

  7. 微信小游戏制作坦克大战(六)碰撞检测,主角坦克碰到敌方坦克、炮弹爆炸

    微信小游戏制作坦克大战(六)碰撞检测,主角坦克碰到敌方坦克.炮弹爆炸 导入坦克爆炸效果的图片和声音素材 给主角坦克添加事件 给爆炸动画添加事件 当主角坦克碰到敌方坦克或者炮弹时显示爆炸效果 下一篇文章 ...

  8. unity小游戏制作之见缝插针

    unity小游戏制作之见缝插针 先看效果图这个游戏是一个入门的小游戏,主要技术就是圆盘的旋转,针跟随圆盘旋转以及分数累加等 游戏先拖入一个圆,更改格式为2D然后建立脚本使其转动 public clas ...

  9. 微信小游戏制作坦克大战(五)敌方坦克可以发射炮弹

    微信小游戏制作坦克大战(五)敌方坦克可以发射炮弹 在资源管理器中复制炮弹,重命名为敌人坦克的炮弹. 修改敌方坦克的积木 给敌方坦克炮弹添加事件 现在,敌方坦克已经可以自动发射炮弹啦. 下一篇文章:微信 ...

最新文章

  1. 重磅!计算机主题征稿,【EI/SCI检索】ICCBD 2021诚邀您投稿参会!
  2. CentOS上编译安装Nginx
  3. 比特币现金社区推出OP_RETURN的4字节前缀指南
  4. WCF 第十三章 可编程站点 所有都与URI相关
  5. libevent中的hash表
  6. Gym - 101972H Beautiful Substrings(思维+模拟)
  7. mysql建表_128、mysql建表和简单sql
  8. 修改so_货代、海运操作、船务操作还分不清?船公司SO文件看不懂?
  9. 连接两个std :: vector
  10. 刘德华2007新歌《一》歌词及在线试听地址
  11. js java 代码格式化_JS代码格式化
  12. 惠普HP LaserJet 1160 驱动
  13. ios备忘录下载安卓版_苹果备忘录app下载
  14. PPT设计思维进阶:提升设计能力
  15. 小松的STM32教程(2)—— OLED显示
  16. 苹果开发者注册了邓白氏编码不能用,查询时提示该组织不存在怎么办?
  17. wifi动不动就断开_WIFI经常自动断网,大多数是因为此原因
  18. [Eclips 安装] eclipse启动不了,出现“Java was...”如何解决
  19. 百度地图——多点标记及路线
  20. 三栏布局的七种实现方式

热门文章

  1. Java数据结构与算法———(55)创建一个哈希表
  2. 华为Q22免拆机卡刷第三方固件(附教程)
  3. 云动超级内存——NVDIMM
  4. Centos 安装rar、unrar、docker
  5. python爬取京东机票,监控机票,机票价格分析
  6. COMSOL——水杯中的自然对流问题
  7. java基础-ascii编码
  8. 王争数据结构与算法之美开篇问题整理
  9. Python网络爬虫之抓取订餐信息
  10. 怎样给计算机的屏幕加锁,电脑怎么上锁,小编教你怎么给电脑屏幕上锁