html游戏引擎,createJs框架
声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢!
createJs网上的中文教程挺少的,以前UC有个Xcanvas的论坛有createJs的详细教程,但是随着XCanvas团队的解散,那个网 站也关闭了。。网上的大部分都是非常基础的教程,有点千遍一律的感觉。所以楼主就去把createJs下载下来,硬着头皮看英文文档了。凭着楼主这英语六 级只考了三百多分的渣渣来说,看起来很费力啊,不过还是勉强摸索出了大概的用法。所以现在就是学了多少就记录多少,之后或许也会不定期更新一下该框架的新 的学习心得。毕竟对自己以后还是有帮助的。
闲话说到这,直接进入主题。
楼主用createJs写了个简单的跑酷游戏DEMO,就拿它做例子吧。 看DEMO戳我。
createJs的由来,基础什么的就不说了,就直接说createJs的用法吧。
接下来开始分析代码:
1.<script src='easeljs-0.7.1.min.js'></script>2.<script src='preloadjs-0.4.1.min.js'></script>01.function init(){02.stage = new createjs.Stage('cas');03.C_W = stage.canvas.width;04.C_H = stage.canvas.height;05. 06.var manifest = [07.{src:'image/man.png' , id:'man'},08.{src:'image/ground.png' , id:'ground'},09.{src:'image/bg.png' , id:'bg'},10.{src:'image/high.jpg' , id:'high'},11.{src:'image/coins.png' , id:'coin'}12.]13. 14.loader = new createjs.LoadQueue(false);15.loader.addEventListener('complete' , handleComplete);16.loader.loadManifest(manifest);17. 18.drawLoading();19.}01.function handleComplete(){ //当图片素材load完后执行该方法02.var manImage = loader.getResult('man'),03.lowground = loader.getResult('ground'),04.highground = loader.getResult('high'),05.bgImage = loader.getResult('bg'),06.coins = loader.getResult('coin');07. 08.sky = new createjs.Shape();09.sky.graphics.bf(bgImage).drawRect(0,0,C_W,C_H);10.sky.setTransform(0, 0, 1 , C_H/bgImage.height);11.stage.addChild(sky);12. 13.man = createMan(200,326,manImage);14. 15.//该框为判定角色的判定区域16.kuang = new createjs.Shape();17.kuang.graphics.beginStroke('rgba(255,0,0,0.5)').drawRect(0 , 0 , man.size().w , man.picsize().h*1.5);18.// stage.addChild(kuang);19. 20.mapHandle(lowground , highground , coins);21. 22.createjs.Ticker.timingMode = createjs.Ticker.RAF;//设置循环方法,可以是requestAnimationFrame或者是setTimeout23.createjs.Ticker.setFPS(30);//舞台帧率控制24.createjs.Ticker.addEventListener('tick', tick);//绑定舞台每一帧的逻辑发生函数25. 26.window.addEventListener('keydown' , function(event){27.event = event||window.event;28.if(event.keyCode===32&&man.jumpNum<man.jumpMax){29.man.jump();30.}31.})32.}然后进行舞台循环设置,上面有注释了,就不说了。
001.(function(w){002.var FRAME_RATE = 13, //精灵表播放速度003.SCALE_X = 1.5, //X轴缩放004.SCALE_Y = 1.5, //Y轴缩放005.GRAVITY = 3, //重力加速度006.JUMP_SPEED = 2.6, //垂直速度007.WIDTH = 40,008.HEIGHT = 96,009.PICWIDTH = 64,010.PICHEIGHT = 64,011.PROPORTION = 150/1; //游戏与实际的距离比例012. 013.var Man = function(x , y , img){014.this.x = x;015.this.y = y;016.this.endy = y;017.this.vx = 0.5;018.this.vy = 0;019.this.ground = [];020.this.state = 'run';021.this.jumpNum = 0;022.this.jumpMax = 1;023.this.init(img);024.}025. 026.Man.prototype = {027.constructors:Man,028. 029.init:function(img){030.var manSpriteSheet = new createjs.SpriteSheet({ //实例化精灵表绘制器031.'images':[img],032.'frames':{'regX':0,'height':PICWIDTH,'count':45,'regY':1,'width':PICHEIGHT},033.'animations':{034.'run':{035.frames:[21,20,19,18,17,16,15,14,13,12], //精灵表每一帧的位置036.next:'run', //当精灵表循环完后的下一步动作037.speed:1, //精灵表播放速度038.},039.'jump':{040.frames:[34,35,36,37,38,39,40,41,42,43],041.next:'run',042.speed:1,043.},044.'die':{045.frames:[8,7,6,5,4,3,2,1,0],046.next:'die',047.speed:1,048.}049.}050.});051.this.sprite = new createjs.Sprite(manSpriteSheet , this.state); //实例化精灵052.this.sprite.framerate = FRAME_RATE; //精灵表绘制速率053.this.sprite.setTransform(this.x, this.y, SCALE_X, SCALE_Y); //设置精灵的位置054.stage.addChild(this.sprite); //添加到舞台055.},056. 057.update:function(){058.var sprite = this.sprite;059.var time = createjs.Ticker.getInterval()/1000; //获取当前帧与上一帧的时间间隔060. 061.if(this.state==='run'){ 062.if(sprite.x<this.x){063.sprite.x +=this.vx;064.}else {065.sprite.x = this.x066.}067.}068.if(this.endy>sprite.y||this.state==='jump'){ //角色的动作处理069.var nexty = sprite.y+time*this.vy*PROPORTION;070.this.vy += time*GRAVITY;071.sprite.y += time*this.vy*PROPORTION;072.if(Math.abs(sprite.y-this.endy)<10&&this.vy>0){073.this.state = 'run';074.sprite.y=this.endy;075.this.vy = 0;076.}077.}078. 079.if(sprite.x+(PICWIDTH*SCALE_X-WIDTH)/2<0||sprite.y>C_H+200){080.this.die();081.createjs.Ticker.reset();082.alert('you are Die!');083.}084. 085.switch(this.state){086.case 'run':087.this.jumpNum = 0;088.break;089.case 'die':090.if(sprite.currentFrame===0){091.sprite.paused = true;092.}093.break;094.}095.},096. 097.run:function(){098.this.sprite.gotoAndPlay('run')099.},100. 101.jump:function(){102.this.vy = -JUMP_SPEED;103.this.state = 'jump';104.this.sprite.gotoAndPlay('jump'); //让精灵表播放特定的动画105.this.jumpNum++;106.},107. 108.die:function(){109.this.state = 'die';110.this.sprite.gotoAndPlay('die')111.},112. 113.size:function(){114.return {115.w:WIDTH,116.h:HEIGHT117.}118.},119. 120.picsize:function(){121.return {122.w:PICWIDTH,123.h:PICHEIGHT124.}125.}126.}127. 128.w.createMan = function(x , y , img){129.return new Man(x , y , img)130.};131.})(window)下面贴出封装的石头以及金币模块,简单说下背景的循环,预先实例化一堆石头和金币,然后移动响应的石头,当石头移动到超出舞台区域时,把他的visible属性置为false,再重新添加一个石头在最后的位置进行新的一次移动。
001.(function(w){002.var SPEED = 4,003.COIN_STAY_X = 20,004.COIN_STAY_Y = 20,005.COIN_STAY_WIDTH = 30,006.COIN_STAY_HEIGHT = 30,007.COIN_SCALE_X = 0.08,008.COIN_SCALE_Y = 0.08;009. 010.//地上的石头类011. 012.var Stone = function(x,kind,allImage){013.this.x = x;014.this.kind = kind;015.this.allImage = allImage;016.this.init();017.}018. 019.var sp = Stone.prototype;020. 021.sp.init=function(){022.this.shape = new createjs.Shape();023.if(this.kind!=='C'){024.this.h = this.allImage[this.kind].height;025.this.w = this.allImage[this.kind].width*2;026.this.y = C_H - this.h;027.this.shape.graphics.beginBitmapFill(this.allImage[this.kind]).drawRect(0, 0, this.w, this.h);028.this.shape.setTransform(this.x, this.y, 1, 1);029.}else {030.this.h = -1000;031.this.w = 170;032.this.y = C_H - this.h;033.this.shape.graphics.beginFill('#000').drawRect(0, 0, this.w, this.h);034.this.shape.setTransform(this.x, this.y, 1, 1);035.}036.this.shape.visible = false;037.this.shape.cache(0 , 0 , this.w , this.h);038.stage.addChild(this.shape);039.}040. 041.sp.update=function(){042.this.shape.x -= SPEED;043.}044. 045.//金币类046.var Coin = function(image){047.this.sizeX = COIN_SCALE_X;048.this.sizeY = COIN_SCALE_Y;049. 050.this.isget = false;051.this.init = function(){052.this.shape = new createjs.Shape();053.this.shape.graphics.beginBitmapFill(image).drawRect(0, 0, image.width, image.height);054.this.shape.setTransform(0, 0, COIN_SCALE_X, COIN_SCALE_Y);055.this.shape.visible = false;056.stage.addChild(this.shape);057.}058.this.init();059. 060.this.update = function(){061.if(this.isget){062.this.sizeX = this.sizeX + ((COIN_STAY_WIDTH/image.width) - this.sizeX)*0.1;063.this.sizeY = this.sizeY + ((COIN_STAY_HEIGHT/image.height) - this.sizeY)*0.1;064.this.shape.setTransform(065.this.shape.x + (COIN_STAY_X - this.shape.x)*0.1,066.this.shape.y + (COIN_STAY_Y - this.shape.y)*0.1,067.this.sizeX,068.this.sizeY069.);070. 071.if(Math.abs(this.shape.x-COIN_STAY_X)<0.5&&Math.abs(this.shape.y-COIN_STAY_Y)<0.5){072.this.shape.visible = false;073.this.isget = false;074.this.sizeX = COIN_SCALE_X;075.this.sizeY = COIN_SCALE_Y;076.this.shape.setTransform(0,0,this.sizeX,this.sizeY);077.}078.} else{079.this.shape.x -= SPEED;080.if(this.shape.x<-image.width*COIN_SCALE_X){081.this.shape.visible = false;082.}083.}084.}085. 086.this.size = function(){087.return {088.w:image.width*COIN_SCALE_X,089.h:image.height*COIN_SCALE_Y090.}091.}092.}093. 094.w.createCoin = function(image){095.return new Coin(image)096.}097. 098.w.createStone = function(x,kind,allImage){099.return new Stone(x,kind,allImage);100.}101.})(window)最后是舞台逐帧处理的tick方法:
01.function tick(event){ //舞台逐帧逻辑处理函数02.man.update();03. 04.kuang.x = man.sprite.x+(man.picsize().w*1.5-man.size().w)/2; //参考框05.kuang.y = man.sprite.y;06. 07.man.ground.length=0;08.var cg = stoneHandle();09. 10.if(man.ground[0]&&!cg) {11.man.ground.sort(function(a,b){return b.h-a.h});12.man.endy = man.ground[0].y-man.picsize().h*1.5;13.}14. 15.allCoins.forEach(function(cc , index){16.if(cc.shape.visible){17.if(18.Math.abs((kuang.x+man.size().w/2) - (cc.shape.x+cc.size().w/2)) <= (man.size().w+cc.size().w)/2&&19.Math.abs((kuang.y+man.size().h/2) - (cc.shape.y+cc.size().h/2)) <= (man.size().h+cc.size().h)/2&&20.!cc.isget21.){22.cc.isget = true;23.countCoin.innerHTML = parseInt(countCoin.innerHTML)+124.}25.cc.update();26.}27.})28. 29.document.getElementById('showFPS').innerHTML = man.endy30.stage.update(event)31.}在每一帧的处理,就像自己写游戏一样啦,就是把舞台里的所有对象逐个进行逻辑运算,进行相应处理。
主页面:
001.<!doctype
html>002.<html
lang='en'>003.<head>004.<meta
charset='UTF-8'>005.<style>006./*#cas{margin:auto;display:
block;}*/007..view{width:
700px;height:500px;position: relative;}008.#coins{width:90px;height:
70px;line-height: 70px;position:absolute;left:0px;top:0;padding-left:
60px;background:url(image/coins.png) no-repeat;background-size:30px
30px;background-position:20px 20px;font-size: 34px;color: #FFF;}
009.</style>010.<title>跑酷游戏</title>011.<script
src='easeljs-0.7.1.min.js'></script>012.<script
src='preloadjs-0.4.1.min.js'></script>013.<script
src='person.js'></script>014.<script
src='otherThings.js'></script>015.</head>016.<body>017.<div class='view'>018.<canvas
id='cas' width='700' height='500'>您的<a
href="http://www.it165.net/edu/ewl/" target="_blank" class="keylink">浏览器</a>不支持canvas</canvas>019.<div
id='coins'>0</div>020.</div>021.<div
id='showFPS' style='display:
none;'></div>022.<script>023.var
fps = document.getElementById('showFPS'),024.countCoin
= document.getElementById('coins');025.var
stage , C_W , C_H , loader;026.var
man , ground , sky;027. 028.function
init(){029.stage
= new createjs.Stage('cas');030.C_W
= stage.canvas.width;031.C_H
= stage.canvas.height;032. 033.var
manifest = [034.{src:'image/man.png' ,
id:'man'},035.{src:'image/ground.png' ,
id:'ground'},036.{src:'image/bg.png' ,
id:'bg'},037.{src:'image/high.jpg' ,
id:'high'},038.{src:'image/coins.png' ,
id:'coin'}039.]040. 041.loader
= new createjs.LoadQueue(false);042.loader.addEventListener('complete' ,
handleComplete);043.loader.loadManifest(manifest);044. 045.drawLoading();046.}047. 048.function
drawLoading(){049.var
ctx = stage.canvas.getContext('2d');050.ctx.textAlign
= 'center';051.ctx.textBaseline
= 'middle';052.ctx.fillStyle
= '#000';053.ctx.fillRect(0,0,C_W,C_H);054.ctx.fillStyle
= '#FFF';055.ctx.font
= '25px
微软雅黑';056.ctx.fillText('Loading...',C_W/2,C_H/2)057.}058. 059.//地图数据,mapData为石头数据,coinCode为金币数据060.var
mapData = [061.'AAAACBBAAACABBAAACAABBBAAAABAAAAAACABCABCABCAAAABBBBBBAAAAACAAAAAAAAAAAABBBBBBAAAAAACACACACACAAAABBBBAAAAACAAAAAAAAAAAABBBBBBAAAAAACACACACACAABBAAAAAAABBA',062.'AAAAAAAACAABAAAAAAAAAAAAAAABBBBBBCBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAACACACACACACACACACACBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBCBCBCBCAAAAAAAAAAAAAAAAAA',063.'AAAAAAAACAABAAAAAAAAAAAACACACACACACACACABAABABABABABABABACBCBCBCBCBCBCBCBCBCBCBCBCBCBCBCABABACBCBCACACACACACACACACACACACACACACACACACACACACACAAAAAAAAAAAAAAAA'064.],065.coinCode
= [066.'--------##########----------------############-#--#---##############-----------------##########-#-#-#-#-#-#-#-##-------################-------------###',067.'--#--#-------####----------##----###-----####-#--#---####-#-#-#-######------####------#####-#-#-#-#-#-#-#-##-------################---############--###',068.'-------#--#-------####----------##----##--##############---------######------####------#####-#-#-#-#-#-#-#-##----------################-------------###'069.]070. 071.function
handleComplete(){ //当图片素材load完后执行该方法072.var
manImage = loader.getResult('man'),073.lowground
= loader.getResult('ground'),074.highground
= loader.getResult('high'),075.bgImage
= loader.getResult('bg'),076.coins
= loader.getResult('coin');077. 078.sky
= new createjs.Shape();079.sky.graphics.bf(bgImage).drawRect(0,0,C_W,C_H);080.sky.setTransform(0, 0, 1 ,
C_H/bgImage.height);081.stage.addChild(sky);082. 083.man
= createMan(200,326,manImage);084. 085.//该框为判定角色的判定区域086.kuang
= new createjs.Shape();087.kuang.graphics.beginStroke('rgba(255,0,0,0.5)').drawRect(0 , 0 ,
man.size().w , man.picsize().h*1.5);088.//
stage.addChild(kuang);089. 090.mapHandle(lowground
, highground , coins);091. 092.createjs.Ticker.timingMode
= createjs.Ticker.RAF;093.createjs.Ticker.setFPS(30);094.createjs.Ticker.addEventListener('tick',
tick);095. 096.window.addEventListener('keydown' ,
function(event){097.event
= event||window.event;098.if(event.keyCode===32&&man.jumpNum<man.jumpMax){099.man.jump();100.}101.})102.}103. 104. 105.var
mapIndex = 0, //地图序列106.Mix
= 0, //地图数组的索引107.allStones
= [], //存放所有的石头108.allCoins
= [], //所有金币109.showSt
= []; //存放显示出来的石头110. 111.function
mapHandle(lowground , highground , coins){ //初始化地图112.allStones.length
= 0;113.var
stoneImage = {'A':lowground
, 'B':highground},kind
= null;114.for(var
i=0;i<30;i++){ //把需要用到的石头预先放入容器中准备好115.switch(i){116.case 0:kind='A';break;117.case 10:kind='B';break;118.case 20:kind='C';break;119.}120.var
st = createStone(C_W , kind , stoneImage);121.allStones.push(st)122.}123. 124.for(var
i=0;i<10;i++){ //把需要用到的金币预先放入容器中125.var
coin = createCoin(coins);126.allCoins.push(coin);127.}128. 129.Mix
= Math.floor(Math.random()*mapData.length); //随机地图序列130.for(var
i=0;i<8;i++){131.setStone(false)132.}133.}134. 135.function
setStone(remove){ //添加陆地的石头136.var
arg = mapData[Mix].charAt(mapIndex),137.coarg
= coinCode[Mix].charAt(mapIndex),138.cc
= null;139. 140.if(coarg==='#'){141.for(var
i=0;i<allCoins.length;i++){142.if(!allCoins[i].shape.visible){143.cc
= allCoins[i];144.cc.shape.visible
= true;145.break;146.}147.}148.}149. 150.for(var
z=0;z<allStones.length;z++){151.if(!allStones[z].shape.visible&&allStones[z].kind===arg){152.var
st = allStones[z];153.st.shape.visible
= true;154.st.shape.x
= showSt.length===0?0:showSt[showSt.length-1].shape.x+showSt[showSt.length-1].w;155. 156.if(cc){157.cc.shape.x
= showSt.length===0?allStones[z].w/2-cc.size().w/2:showSt[showSt.length-1].shape.x+showSt[showSt.length-1].w+allStones[z].w/2-cc.size().w/2;158.cc.shape.y
= arg==='C'?
C_H-loader.getResult('high').height-50 :
allStones[z].shape.y-cc.size().h/2-50;159.}160. 161.if(remove)
showSt.shift();162.showSt.push(st);163.break;164.}165.}166. 167.mapIndex++;168.if(mapIndex>=mapData[Mix].length){169.Mix
= Math.floor(Math.random()*mapData.length)170.mapIndex=0;171.}172.}173. 174.function
tick(event){ //舞台逐帧逻辑处理函数175.man.update();176. 177.kuang.x
= man.sprite.x+(man.picsize().w*1.5-man.size().w)/2; //参考框178.kuang.y
= man.sprite.y;179. 180.man.ground.length=0;181.var
cg = stoneHandle();182. 183.if(man.ground[0]&&!cg)
{184.man.ground.sort(function(a,b){return b.h-a.h});185.man.endy
= man.ground[0].y-man.picsize().h*1.5;186.}187. 188.allCoins.forEach(function(cc
, index){189.if(cc.shape.visible){190.if(191.Math.abs((kuang.x+man.size().w/2)
- (cc.shape.x+cc.size().w/2))
<= (man.size().w+cc.size().w)/2&&192.Math.abs((kuang.y+man.size().h/2)
- (cc.shape.y+cc.size().h/2))
<= (man.size().h+cc.size().h)/2&&193.!cc.isget194.){195.cc.isget
= true;196.countCoin.innerHTML
= parseInt(countCoin.innerHTML)+1197.}198.cc.update();199.}200.})201. 202.document.getElementById('showFPS').innerHTML
= man.endy203.stage.update(event)204.}205. 206. 207.function
stoneHandle(){ //石头的逐帧处理
cg为判断当前角色的位置是否被阻挡,overStone是保存离开stage的石头块208.var
cg = false ,
overStone = null;209.allStones.forEach(function(s){ //遍历石头,确定玩家落点210.if(s.shape.visible){211.s.update();212. 213.if(s.shape.visible&&s.shape.x<=-s.w){214.overStone
= s;215.}216. 217.var
juli = Math.abs((kuang.x+man.size().w/2)-(s.shape.x+s.w/2));218.if(juli<=(man.size().w+s.w)/2 &&
man.ground.indexOf(s)===-1){219.man.ground.push(s);220. 221.if((s.shape.x+s.w/2)>(kuang.x+man.size().w/2)&&s.y<(kuang.y+man.size().h-10)){222.man.sprite.x
= s.shape.x-man.picsize().w-8;223.cg
= true;224.}225.}226.}227.});228.if(overStone)
{229.setStone(true);230.overStone.shape.visible
= false;231.}232. 233.return cg;234.}235. 236.init();237.</script>238.</body>239.</html>人物模块:
001.(function(w){002.var
FRAME_RATE = 13, //精灵表播放速度003.SCALE_X
= 1.5, //X轴缩放004.SCALE_Y
= 1.5, //Y轴缩放005.GRAVITY
= 3, //重力加速度006.JUMP_SPEED
= 2.6, //垂直速度007.WIDTH
= 40,008.HEIGHT
= 96,009.PICWIDTH
= 64,010.PICHEIGHT
= 64,011.PROPORTION
= 150/1; //游戏与实际的距离比例012. 013.var
Man = function(x , y , img){014.this.x
= x;015.this.y
= y;016.this.endy
= y;017.this.vx
= 0.5;018.this.vy
= 0;019.this.ground
= [];020.this.state
= 'run';021.this.jumpNum
= 0;022.this.jumpMax
= 1;023.this.init(img);024.}025. 026.Man.prototype
= {027.constructors:Man,028. 029.init:function(img){030.var
manSpriteSheet = new createjs.SpriteSheet({031.'images':[img],032.'frames':{'regX':0,'height':PICWIDTH,'count':45,'regY':1,'width':PICHEIGHT},033.'animations':{034.'run':{035.frames:[21,20,19,18,17,16,15,14,13,12],036.next:'run',037.speed:1,038.},039.'jump':{040.frames:[34,35,36,37,38,39,40,41,42,43],041.next:'run',042.speed:1,043.},044.'die':{045.frames:[8,7,6,5,4,3,2,1,0],046.next:'die',047.speed:1,048.}049.}050.});051.this.sprite
= new createjs.Sprite(manSpriteSheet
, this.state);052.this.sprite.framerate
= FRAME_RATE;053.this.sprite.setTransform(this.x, this.y,
SCALE_X, SCALE_Y);054.stage.addChild(this.sprite);055.},056. 057.update:function(){058.var
sprite = this.sprite;059.var
time = createjs.Ticker.getInterval()/1000;060. 061.if(this.state==='run'){062.if(sprite.x<this.x){063.sprite.x
+=this.vx;064.}else {065.sprite.x
= this.x066.}067.}068.if(this.endy>sprite.y||this.state==='jump'){069.var
nexty = sprite.y+time*this.vy*PROPORTION;070.this.vy
+= time*GRAVITY;071.sprite.y
+= time*this.vy*PROPORTION;072.if(Math.abs(sprite.y-this.endy)<10&&this.vy>0){073.this.state
= 'run';074.sprite.y=this.endy;075.this.vy
= 0;076.}077.}078. 079.if(sprite.x+(PICWIDTH*SCALE_X-WIDTH)/2<0||sprite.y>C_H+200){080.this.die();081.createjs.Ticker.reset();082.alert('you
are Die!');083.}084. 085.switch(this.state){086.case 'run':087.this.jumpNum
= 0;088.break;089.case 'die':090.if(sprite.currentFrame===0){091.sprite.paused
= true;092.}093.break;094.}095.},096. 097.run:function(){098.this.sprite.gotoAndPlay('run')099.},100. 101.jump:function(){102.this.vy
= -JUMP_SPEED;103.this.state
= 'jump';104.this.sprite.gotoAndPlay('jump');105.this.jumpNum++;106.},107. 108.die:function(){109.this.state
= 'die';110.this.sprite.gotoAndPlay('die')111.},112. 113.size:function(){114.return {115.w:WIDTH,116.h:HEIGHT117.}118.},119. 120.picsize:function(){121.return {122.w:PICWIDTH,123.h:PICHEIGHT124.}125.}126.}127. 128.w.createMan
= function(x , y , img){129.return new Man(x
, y , img)130.};131.})(window)物品模块:
001.(function(w){002.var
SPEED = 4,003.COIN_STAY_X
= 20,004.COIN_STAY_Y
= 20,005.COIN_STAY_WIDTH
= 30,006.COIN_STAY_HEIGHT
= 30,007.COIN_SCALE_X
= 0.08,008.COIN_SCALE_Y
= 0.08;009. 010.//地上的石头类011. 012.var
Stone = function(x,kind,allImage){013.this.x
= x;014.this.kind
= kind;015.this.allImage
= allImage;016.this.init();017.}018. 019.var
sp = Stone.prototype;020. 021.sp.init=function(){022.this.shape
= new createjs.Shape();023.if(this.kind!=='C'){024.this.h
= this.allImage[this.kind].height;025.this.w
= this.allImage[this.kind].width*2;026.this.y
= C_H - this.h;027.this.shape.graphics.beginBitmapFill(this.allImage[this.kind]).drawRect(0, 0, this.w, this.h);028.this.shape.setTransform(this.x, this.y, 1, 1);029.}else {030.this.h
= -1000;031.this.w
= 170;032.this.y
= C_H - this.h;033.this.shape.graphics.beginFill('#000').drawRect(0, 0, this.w, this.h);034.this.shape.setTransform(this.x, this.y, 1, 1);035.}036.this.shape.visible
= false;037.this.shape.cache(0 , 0 , this.w
, this.h);038.stage.addChild(this.shape);039.}040. 041.sp.update=function(){042.this.shape.x
-= SPEED;043.}044. 045.//金币类046.var
Coin = function(image){047.this.sizeX
= COIN_SCALE_X;048.this.sizeY
= COIN_SCALE_Y;049. 050.this.isget
= false;051.this.init
= function(){052.this.shape
= new createjs.Shape();053.this.shape.graphics.beginBitmapFill(image).drawRect(0, 0,
image.width, image.height);054.this.shape.setTransform(0, 0,
COIN_SCALE_X, COIN_SCALE_Y);055.this.shape.visible
= false;056.stage.addChild(this.shape);057.}058.this.init();059. 060.this.update
= function(){061.if(this.isget){062.this.sizeX
= this.sizeX
+ ((COIN_STAY_WIDTH/image.width) - this.sizeX)*0.1;063.this.sizeY
= this.sizeY
+ ((COIN_STAY_HEIGHT/image.height) - this.sizeY)*0.1;064.this.shape.setTransform(065.this.shape.x
+ (COIN_STAY_X - this.shape.x)*0.1,066.this.shape.y
+ (COIN_STAY_Y - this.shape.y)*0.1,067.this.sizeX,068.this.sizeY069.);070. 071.if(Math.abs(this.shape.x-COIN_STAY_X)<0.5&&Math.abs(this.shape.y-COIN_STAY_Y)<0.5){072.this.shape.visible
= false;073.this.isget
= false;074.this.sizeX
= COIN_SCALE_X;075.this.sizeY
= COIN_SCALE_Y;076.this.shape.setTransform(0,0,this.sizeX,this.sizeY);077.}078.} else{079.this.shape.x
-= SPEED;080.if(this.shape.x<-image.width*COIN_SCALE_X){081.this.shape.visible
= false;082.}083.}084.}085. 086.this.size
= function(){087.return {088.w:image.width*COIN_SCALE_X,089.h:image.height*COIN_SCALE_Y090.}091.}092.}093. 094.w.createCoin
= function(image){095.return new Coin(image)096.}097. 098.w.createStone
= function(x,kind,allImage){099.return new Stone(x,kind,allImage);100.}101.})(window)html游戏引擎,createJs框架的更多相关文章
- 排名前10的H5、Js 3D游戏引擎和框架
由于很多人都在用JavaScript.HTML5和WebGL技术创建基于浏览器的3D游戏,所有JavaScript 3D游戏引擎是一个人们主题.基于浏览器的游戏最棒的地方是平台独立,它们能在iOS.A ...
- 转:高层游戏引擎——基于OGRE所实现的高层游戏引擎框架
高层游戏引擎——基于OGRE所实现的高层游戏引擎框架 这是意念自己的毕业论文,在一个具体的实践之中,意念主要负责的是物件和GUI之外的其他游戏系统.意念才学疏陋,望众位前辈不吝赐教.由于代码质量不高. ...
- 游戏引擎网络开发者的 64 做与不做 | Part 1 | 客户端方面
摘要:纵观过去 10 年的游戏领域,单机向网络发展已成为一个非常大的趋势.然而,为游戏添加网络支持的过程中往往存在着大量挑战,这里将为大家揭示游戏引擎网络开发者的 64 个做与不做. [编者按]时下, ...
- 开源战棋 SLG 游戏框架设计思考(一)简介和游戏引擎
战棋 SLG 游戏 SLG(Simulation Game)游戏是模拟游戏的简称.战棋类的SLG有两种:一种是 War Game 中的兵棋推演分支,常见的游戏有战争艺术3(TOAW3 — The Op ...
- 20款最受欢迎的HTML5游戏引擎收集
在“最火HTML5 JavaScript游戏引擎”系列文章国外篇(一)中,我们盘点了当下备受开发者推崇的非国产HTML5和JavaScript游戏引擎.在各种2D小游戏逆袭的今天,用HTML5和Jav ...
- QQ空间玩吧HTML5游戏引擎使用比例分析
GameLook报道/“Cocos 2015开发者大会(春季)”于4月2日在国家会议中心圆满落下帷幕.在会上全新的3D编辑器,Cocos Runtime等产品重磅公布,给业界带来了Cocos这款国产引 ...
- HTML5游戏引擎深度测评
https://zhuanlan.zhihu.com/p/20768495 最近看到网上一篇文章,标题叫做<2016年 最火的 15 款 HTML5 游戏引擎>.目前针对HTML5游戏的解 ...
- UWP简单示例(三):快速开发2D游戏引擎
准备 IDE:VisualStudio 2015 Language:VB.NET/C# 图形API:Win2D MSDN教程:UWP游戏开发 游戏开发涉及哪些技术? 游戏开发是一门复杂的艺术,编码方面 ...
- 八款常见的Android游戏引擎
原文地址:http://bbs.csdn.net/topics/380203732 1.Angle Angle是一款专为Android平台设计的,敏捷且适合快速开发的2D游戏引擎,基于OpenGL ...
- 控制台游戏引擎CGE——贪吃蛇
今天我也来发一个控制台游戏.先看图: 缘起 LZ是一个有严重拖延症的人,表现的形式就是隔一段时间就要刷一刷博客园. 这不前几天,看到了魏大师<使用Lua脚本语言开发出高扩展性的系统...> ...
随机推荐
- 今天工作中遇到的根据用户id取得产品大类和相关小类的问题
今天做了一个项目,需求是客户登陆后,可以从会员中心发布详细信息(包括联系信息和公司信息),插入到数据库后在将来生成一个公司页面模板,一般的产品大类+小类 用repeater嵌套就可以了,但是这个涉及到 ...
- 使用DataSet数据集插入记录
使用INSERT语句能够完成数据插入,使用DataSet对象也可以完成数据插入.为了将数据库的数据填充到DataSet中,则必须先使用DataAdapter对象的方法实现填充,当数据填充完成后,开发人 ...
- Mysql中natural join和inner join的区别
假设有如下两个表TableA,TableB TableA TableB Column1 Column2 Column1 Column3 1 2 1 3 TableA的Column1列名和TableB的 ...
- windows下配置lamp环境(5)---配置MySQL5.6
开始配置mysql 1.创建配置文件my.ini 1.进入C:\wamp\MySQL 2.把my-default.ini 另存一份:my.ini 3.开始编辑mysql的配置文件,打开my ...
- HTML&CSS基础学习笔记1.16-单元格间距和表格主体
上一篇讲html学习笔记,讲过了合并单元格,那么今天就来介绍下如何控制单元格的间距,以及表格主体的相关知识. 单元格间距 在上个知识点的显示结果中你可能发现了,单元格与单元格之间有一小段空白.这是由& ...
- C程序设计语言练习题1-1
练习1-1 在你自己的系统中运行"hello, world"程序.再有意去掉程序中的部分内容,看看会得到什么出错信息. 代码如下: #include <stdio.h> ...
- Kafka笔记--监控系统KafkaOffsetMonitor
KafkaOffsetMonitor下载链接: http://download.csdn.net/detail/changong28/7930337github官方:https://github.co ...
- 关于split splice slice 的一些事
学的知识很久不用总会忘记,更何况这三个的拼写都差不多,在这里特意写下自己的一些见解,以便以后可以更好地理解. slice : 定义:接收一个或两个参数,它可以创建一个由当前数组中的一项或多项组成的新 ...
- 一个ajax的后台controller
@RequestMapping("/api/merBrand") @ResponseBody public ResultBrand merBrand(HttpServletRequ ...
- HADOOP都升级到2.5啦~~~
经过前年的初次接触,现在已大约能理解整个体系啦.MAPREDUCE都改成YARN啦. 不过,还得继续往前走,再能实用... HIVE,HBASE,ZOOKEEPER,, 思路如下: 安装系统,配置网络 ...