声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢!
最近flyppybird很流行啊,今天中午闲着没事干,就用现有的素材写了个flyppyPeople,因为角色是个人,所以就叫People啦,哈哈
上链接:http://whxaxes.github.io/canvas-test/src/Game-demo/FlppyPeople/index.html。。。。。。。
最近在看createJs,所以就用了createJs来写啦。
起跳落下用了简单的*落体运动公式。动画是通过createJS的精灵表绘制器实现的,话说用框架就是舒服啊,都给你封装好了,哪像楼主写的上一篇博文里的打飞机游戏,精灵表绘制器之类的还得自己手动写。。。。造*虽然好玩,不过如果赶时间还是尽量用别人的*吧。
= =游戏原理很简单。如果园友无聊。。。就可以玩玩
游戏有个我故意留的bug,因为楼主玩flyppybird的时候最高只有十分,所以留了那个bug,为了分高一点。。。。仅此而已 = =绝对不是因为楼主懒。。。 = =有人说有bug不好玩,于是还是修复了。。。
代码直接贴啦(因为是随便写来玩的,很多东西可能没考虑完全,性能之类的,将就下吧):
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<style>
/*#cas{margin:auto;display: block;}*/
.view{width: 700px;height: 500px;margin:auto;position: relative;}
#onceAgain{width: 152px;text-align: center;border:1px solid;background-color: #FFF;position: absolute;left: 270px;top: 190px;display: none;cursor: pointer;padding:20px 0 20px 0;}
#points{position: absolute;left: 20px;top: 20px;font-size: 20px;color: #FFF;}
</style>
<title>FlyppyPeople</title>
<script src="easeljs-0.7.1.min.js"></script>
<script src="preloadjs-0.4.1.min.js"></script>
<script src="person.js"></script>
<script src="stone.js"></script>
</head>
<body>
<div class="view">
<canvas id="cas" width="700" height="500">您的浏览器不支持canvas</canvas>
<div id="onceAgain"></div>
<div id="points">得分:0</div>
<div style="position: absolute;bottom:-30px;">按空格进行起跳</div>
</div>
<div id="showFPS"></div>
<script>
var fps = document.getElementById("showFPS")
var stage , w , h , loader;
var man , ground , sky , high;
var stones = [] , again = document.getElementById("onceAgain") , pt = document.getElementById("points"); function init(){
stage = new createjs.Stage("cas");
w = stage.canvas.width;
h = stage.canvas.height; var manifest = [
{src:"image/man.png" , id:"man"},
{src:"image/ground.png" , id:"ground"},
{src:"image/bg.png" , id:"bg"},
] loader = new createjs.LoadQueue(false);
loader.addEventListener("complete" , handleComplete);
loader.loadManifest(manifest);
} function handleComplete(){
var manImage = loader.getResult("man");
var groundImage = loader.getResult("ground");
var bgImage = loader.getResult("bg")
ground = new createjs.Shape();
sky = new createjs.Shape();
sky.graphics.bf(bgImage).drawRect(0,0,w,h); ground.graphics.beginBitmapFill(groundImage).drawRect(0, 0, w+groundImage.width, groundImage.height);
ground.tileW = groundImage.width;
ground.y = h-groundImage.height;
ground.activity = true;
ground.action = {
run:function(){
if(ground.activity){
ground.x = ground.x-3;
if(ground.x<-groundImage.width){
ground.x=0;
}
}
}
} stage.addChild(sky , ground , high); for(var i=0;i<10;i++){
stones.push(new stone(w+5 , groundImage));
} man = new Man(200,326,manImage); kuang = new createjs.Shape();
kuang.graphics.beginStroke("rgba(255,0,0,0.5)").drawRect(23 , 0 , 50 , 96);
stage.addChild(kuang) createjs.Ticker.timingMode = createjs.Ticker.RAF;
createjs.Ticker.setFPS(60);
createjs.Ticker.addEventListener("tick", tick); window.addEventListener("keydown" , function(event){
event = event||window.event;
if(event.keyCode===32&&man.state!=="die"){
man.jump();
}
}); again.onclick = function(){
for(var i=0;i<stones.length;i++){
stones[i].visible = false;
stones[i].x = w+5;
stones[i].update();
} man.run();
ground.activity = true;
stst = false;
again.style.display="none"; point = 0;
pt.innerHTML = "得分:"+point;
}
} var tt = true,stst=false,point=0,lastStone=null;
function tick(event){
var deltaS = event.delta/1000;
var grantW = man.sprite.getBounds().width*man.scaleX; ground.action.run();
man.update(); if(tt&&!stst){
tt = false;
for(var i=0;i<stones.length;i++){
if(!stones[i].visible){
stones[i].visible = true;
stones[i].x = w;
stones[i].build();
break;
}
} setTimeout(function(){
tt = true;
},2000)
} for(var i=0;i<stones.length;i++){
if(stones[i].visible&&man.state!=="die"){
if(!stst) stones[i].update(); for(var j=0;j<stones[i].bones.length;j++){
var sbx = stones[i].bones[j].x+stones[i].getStoneSize()/2,
sby = stones[i].bones[j].y+stones[i].getStoneSize()/2,
manx = man.sprite.x+48,
many = man.sprite.y+48; if(Math.abs(manx-sbx)<25+stones[i].getStoneSize()/2 && Math.abs(many-sby)<48+stones[i].getStoneSize()/2){
man.die();
ground.activity = false;
stst = true;
again.style.display="block";
again.innerHTML = "你的得分:"+point+"<br>再来一遍"
break;
}else if(Math.abs(manx-sbx)<25+stones[i].getStoneSize()/2 && lastStone!==stones[i]){
point++;
pt.innerHTML = "得分:"+point;
lastStone=stones[i];
}
}
}
} kuang.x = man.sprite.x;
kuang.y = man.sprite.y; stage.update(event)
} init();
</script>
</body>
</html>
下面是人物处理js:就是对createJs的sprite对象进行进一步抽象成一个man对象。
(function(w){
var FRAME_RATE = 13, //精灵表播放速度
SCALE_X = 1.5, //X轴缩放
SCALE_Y = 1.5, //Y轴缩放
GRAVITY = 9.8, //重力加速度
JUMP_SPEED = 2.5, //垂直速度
PROPORTION = 200/1; //游戏与实际的距离比例 w.Man = function(x , y , img){
this.x = x;
this.y = y;
this.vy = 0;
this.state = "run";
this.init(img);
} Man.prototype = {
constructors:Man, init:function(img){
var manSpriteSheet = new createjs.SpriteSheet({
"images":[img],
"frames":{"regX":0,"height":64,"count":45,"regY":1,"width":64},
"animations":{
"run":{
frames:[21,20,19,18,17,16,15,14,13,12],
next:"run",
speed:1,
},
"jump":{
frames:[34,35,36,37,38,39,40,41,42,43],
next:"run",
speed:1,
},
"die":{
frames:[8,7,6,5,4,3,2,1,0],
next:"die",
speed:1,
},
}
});
this.sprite = new createjs.Sprite(manSpriteSheet , this.state);
this.sprite.framerate = FRAME_RATE;
this.sprite.setTransform(this.x, this.y, SCALE_X, SCALE_Y);
stage.addChild(this.sprite);
}, update:function(){
var sprite = this.sprite;
var time = createjs.Ticker.getInterval()/1000;
switch(this.state){
case "jump":
sprite.y += time*this.vy*PROPORTION;
this.vy += time*GRAVITY;
if(sprite.y > this.y && this.vy > 0){
sprite.state = "run";
sprite.y=this.y;
this.vy = 0;
}
break; case "die":
sprite.y += time*this.vy*PROPORTION;
this.vy += time*GRAVITY;
if(sprite.y > this.y && this.vy > 0){
sprite.y=this.y;
this.vy = 0;
}
if(sprite.currentFrame===0){
sprite.paused = true;
}
break;
}
}, jump:function(){
this.vy = -JUMP_SPEED;
this.state = "jump";
this.sprite.gotoAndPlay("jump")
}, die:function(){
this.state = "die";
this.sprite.gotoAndPlay("die")
}, run:function(){
this.state = "run";
this.sprite.gotoAndPlay("run")
}
}
})(window)
还有阻碍物的js:(就是分成上跟下两部分,总共的石头三块,然后取随机数,让它一个一个出来就行了)
(function(w){
var STONE_SIZE = 70,
STONE_NUM = 3,
STONE_SPEED = 3; w.stone = function(x , img){
this.x = x;
this.y = 0;
this.img = img
this.visible = false;
this.bones = []; this.init();
} var s = stone.prototype; s.init = function(){
for(var g=0;g<STONE_NUM;g++){
bone = new createjs.Shape();
bone.graphics.s("#000").f("#59554D").drawRect(0 , 0 , STONE_SIZE , STONE_SIZE);
bone.x = this.x;
stage.addChild(bone)
this.bones.push(bone);
}
} s.getStoneSize = function(){
return STONE_SIZE;
} s.update = function(){
var index=0;
for(var z=0;z<this.top;z++){
this.bones[index].x = this.x;
this.bones[index].y = z*STONE_SIZE;
index++;
} for(var t=0;t<this.bottom;t++){
this.bones[index].x = this.x;
this.bones[index].y = h-this.img.height-(t+1)*STONE_SIZE;
index++;
} if(this.visible){
if(this.x<=-STONE_SIZE){
this.visible = false;
}
this.x -= STONE_SPEED;
}
} s.build = function(){
this.top = parseInt(Math.random()*STONE_NUM);
this.bottom = STONE_NUM-this.top;
}
})(window)
源码地址:
https://github.com/whxaxes/canvas-test/tree/gh-pages/src/Game-demo/FlppyPeople