吃豆游戏结束记分
This commit is contained in:
parent
b76fc00f3c
commit
d6524c9480
136
game.js
136
game.js
@ -22,7 +22,7 @@ function Game(id,params){
|
|||||||
var _context = $canvas.getContext('2d'); //画布上下文环境
|
var _context = $canvas.getContext('2d'); //画布上下文环境
|
||||||
var _stages = []; //布景对象队列
|
var _stages = []; //布景对象队列
|
||||||
var _events = {}; //事件集合
|
var _events = {}; //事件集合
|
||||||
var _index, //当前布景索引
|
var _index=0, //当前布景索引
|
||||||
_hander; //帧动画控制
|
_hander; //帧动画控制
|
||||||
//活动对象构造
|
//活动对象构造
|
||||||
var Item = function(params){
|
var Item = function(params){
|
||||||
@ -196,60 +196,9 @@ function Game(id,params){
|
|||||||
};
|
};
|
||||||
_extend(this,this._settings,this._params);
|
_extend(this,this._settings,this._params);
|
||||||
};
|
};
|
||||||
//动画开始
|
//重置物体位置
|
||||||
Stage.prototype.start = function() {
|
Stage.prototype.resetItems = function(){
|
||||||
var requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame ||window.mozRequestAnimationFrame ||window.msRequestAnimationFrame;
|
this.status = 1;
|
||||||
var f = 0; //帧数计算
|
|
||||||
var stage = this;
|
|
||||||
var fn = function(){
|
|
||||||
_context.clearRect(0,0,_.width,_.height); //清除画布
|
|
||||||
f++;
|
|
||||||
if(stage.timeout){
|
|
||||||
stage.timeout--;
|
|
||||||
}
|
|
||||||
stage.update();
|
|
||||||
if(stage.maps.length){
|
|
||||||
stage.maps.forEach(function(map,index){
|
|
||||||
map.update();
|
|
||||||
map.draw(_context);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if(stage.items.length){
|
|
||||||
stage.items.forEach(function(item){
|
|
||||||
if(!(f%item.frames)){
|
|
||||||
item.times = f/item.frames; //计数器
|
|
||||||
}
|
|
||||||
if(stage.status==1&&item.status==1){ //对象及布景状态都处于正常状态下
|
|
||||||
if(item.location){
|
|
||||||
item.coord = item.location.position2coord(item.x,item.y);
|
|
||||||
}
|
|
||||||
if(item.timeout){
|
|
||||||
item.timeout--;
|
|
||||||
}
|
|
||||||
item.update();
|
|
||||||
}
|
|
||||||
item.draw(_context);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
_hander = requestAnimationFrame(fn);
|
|
||||||
};
|
|
||||||
this.stop();
|
|
||||||
_hander = requestAnimationFrame(fn);
|
|
||||||
};
|
|
||||||
//动画结束
|
|
||||||
Stage.prototype.stop = function(){
|
|
||||||
var cancelAnimationFrame = window.cancelAnimationFrame || window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame ||window.msCancelAnimationFrame;
|
|
||||||
_hander&&cancelAnimationFrame(_hander);
|
|
||||||
};
|
|
||||||
//重置
|
|
||||||
Stage.prototype.reset = function(){
|
|
||||||
_extend(this,this._settings,this._params);
|
|
||||||
this.maps.forEach(function(map){
|
|
||||||
_extend(map,map._settings,map._params);
|
|
||||||
map.stage = this;
|
|
||||||
map.y_length = map.data.length;
|
|
||||||
map.x_length = map.data[0].length;
|
|
||||||
}.bind(this));
|
|
||||||
this.items.forEach(function(item,index){
|
this.items.forEach(function(item,index){
|
||||||
_extend(item,item._settings,item._params);
|
_extend(item,item._settings,item._params);
|
||||||
item.index = index;
|
item.index = index;
|
||||||
@ -261,6 +210,23 @@ function Game(id,params){
|
|||||||
}
|
}
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
};
|
};
|
||||||
|
//重置地图
|
||||||
|
Stage.prototype.resetMaps = function(){
|
||||||
|
this.status = 1;
|
||||||
|
this.maps.forEach(function(map){
|
||||||
|
_extend(map,map._settings,map._params);
|
||||||
|
map.data = JSON.parse(JSON.stringify(map._params.data));
|
||||||
|
map.stage = this;
|
||||||
|
map.y_length = map.data.length;
|
||||||
|
map.x_length = map.data[0].length;
|
||||||
|
}.bind(this));
|
||||||
|
};
|
||||||
|
//重置
|
||||||
|
Stage.prototype.reset = function(){
|
||||||
|
_extend(this,this._settings,this._params);
|
||||||
|
this.resetItems();
|
||||||
|
this.resetMaps();
|
||||||
|
};
|
||||||
//添加对象
|
//添加对象
|
||||||
Stage.prototype.createItem = function(options){
|
Stage.prototype.createItem = function(options){
|
||||||
var item = new Item(options);
|
var item = new Item(options);
|
||||||
@ -288,6 +254,7 @@ function Game(id,params){
|
|||||||
Stage.prototype.createMap = function(options){
|
Stage.prototype.createMap = function(options){
|
||||||
var map = new Map(options);
|
var map = new Map(options);
|
||||||
//动态属性
|
//动态属性
|
||||||
|
map.data = JSON.parse(JSON.stringify(map._params.data));
|
||||||
map.stage = this;
|
map.stage = this;
|
||||||
map.y_length = map.data.length;
|
map.y_length = map.data.length;
|
||||||
map.x_length = map.data[0].length;
|
map.x_length = map.data[0].length;
|
||||||
@ -308,6 +275,51 @@ function Game(id,params){
|
|||||||
}
|
}
|
||||||
_events[eventType]['s'+this.index] = callback.bind(this); //绑定事件作用域
|
_events[eventType]['s'+this.index] = callback.bind(this); //绑定事件作用域
|
||||||
};
|
};
|
||||||
|
//动画开始
|
||||||
|
this.start = function() {
|
||||||
|
var requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame ||window.mozRequestAnimationFrame ||window.msRequestAnimationFrame;
|
||||||
|
var f = 0; //帧数计算
|
||||||
|
var fn = function(){
|
||||||
|
var stage = _stages[_index];
|
||||||
|
_context.clearRect(0,0,_.width,_.height); //清除画布
|
||||||
|
f++;
|
||||||
|
if(stage.timeout){
|
||||||
|
stage.timeout--;
|
||||||
|
}
|
||||||
|
if(stage.update()!=false){ //update返回false,则不绘制
|
||||||
|
if(stage.maps.length){
|
||||||
|
stage.maps.forEach(function(map,index){
|
||||||
|
map.update();
|
||||||
|
map.draw(_context);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if(stage.items.length){
|
||||||
|
stage.items.forEach(function(item){
|
||||||
|
if(!(f%item.frames)){
|
||||||
|
item.times = f/item.frames; //计数器
|
||||||
|
}
|
||||||
|
if(stage.status==1&&item.status==1){ //对象及布景状态都处于正常状态下
|
||||||
|
if(item.location){
|
||||||
|
item.coord = item.location.position2coord(item.x,item.y);
|
||||||
|
}
|
||||||
|
if(item.timeout){
|
||||||
|
item.timeout--;
|
||||||
|
}
|
||||||
|
item.update();
|
||||||
|
}
|
||||||
|
item.draw(_context);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_hander = requestAnimationFrame(fn);
|
||||||
|
};
|
||||||
|
_hander = requestAnimationFrame(fn);
|
||||||
|
};
|
||||||
|
//动画结束
|
||||||
|
this.stop = function(){
|
||||||
|
var cancelAnimationFrame = window.cancelAnimationFrame || window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame ||window.msCancelAnimationFrame;
|
||||||
|
_hander&&cancelAnimationFrame(_hander);
|
||||||
|
};
|
||||||
//事件坐标
|
//事件坐标
|
||||||
this.getPosition = function(e){
|
this.getPosition = function(e){
|
||||||
var box = $canvas.getBoundingClientRect();
|
var box = $canvas.getBoundingClientRect();
|
||||||
@ -323,12 +335,18 @@ function Game(id,params){
|
|||||||
_stages.push(stage);
|
_stages.push(stage);
|
||||||
return stage;
|
return stage;
|
||||||
};
|
};
|
||||||
|
//指定布景
|
||||||
|
this.setStage = function(index){
|
||||||
|
_stages[_index].status = 0;
|
||||||
|
_index = index;
|
||||||
|
return _stages[_index];
|
||||||
|
};
|
||||||
//下个布景
|
//下个布景
|
||||||
this.nextStage = function(){
|
this.nextStage = function(){
|
||||||
if(_index<_stages.length-1){
|
if(_index<_stages.length-1){
|
||||||
_stages[_index] = 0;
|
_stages[_index].status = 0;
|
||||||
_index++;
|
_index++;
|
||||||
_stages[_index].start();
|
return _stages[_index];
|
||||||
}else{
|
}else{
|
||||||
throw new Error('unfound new stage.');
|
throw new Error('unfound new stage.');
|
||||||
}
|
}
|
||||||
@ -336,8 +354,6 @@ function Game(id,params){
|
|||||||
//初始化游戏引擎
|
//初始化游戏引擎
|
||||||
this.init = function(){
|
this.init = function(){
|
||||||
_index = 0;
|
_index = 0;
|
||||||
if(_stages[_index]){
|
this.start();
|
||||||
_stages[_index].start();
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
80
index.js
80
index.js
@ -43,14 +43,6 @@
|
|||||||
//启动页
|
//启动页
|
||||||
(function(){
|
(function(){
|
||||||
var stage = game.createStage();
|
var stage = game.createStage();
|
||||||
stage.bind('keydown',function(e){
|
|
||||||
switch(e.keyCode){
|
|
||||||
case 13:
|
|
||||||
case 32:
|
|
||||||
game.nextStage();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
//logo
|
//logo
|
||||||
stage.createItem({
|
stage.createItem({
|
||||||
x:game.width/2,
|
x:game.width/2,
|
||||||
@ -100,6 +92,15 @@
|
|||||||
context.fillText('© passer-by.com',this.x,this.y);
|
context.fillText('© passer-by.com',this.x,this.y);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
//事件绑定
|
||||||
|
stage.bind('keydown',function(e){
|
||||||
|
switch(e.keyCode){
|
||||||
|
case 13:
|
||||||
|
case 32:
|
||||||
|
game.nextStage();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
})();
|
})();
|
||||||
//游戏主程序
|
//游戏主程序
|
||||||
(function(){
|
(function(){
|
||||||
@ -109,7 +110,7 @@
|
|||||||
if(stage.status==1){
|
if(stage.status==1){
|
||||||
var player = stage.getItemsByType(1)[0];
|
var player = stage.getItemsByType(1)[0];
|
||||||
var items = stage.getItemsByType(2);
|
var items = stage.getItemsByType(2);
|
||||||
items.forEach(function(item){
|
items.forEach(function(item){ //物体检测
|
||||||
var dx = item.x-player.x;
|
var dx = item.x-player.x;
|
||||||
var dy = item.y-player.y;
|
var dy = item.y-player.y;
|
||||||
if(dx*dx+dy*dy<750){
|
if(dx*dx+dy*dy<750){
|
||||||
@ -117,10 +118,18 @@
|
|||||||
stage.timeout = 30;
|
stage.timeout = 30;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
if(JSON.stringify(goods.data).indexOf(0)<0){
|
||||||
|
game.nextStage();
|
||||||
|
}
|
||||||
}else if(stage.status==3){
|
}else if(stage.status==3){
|
||||||
if(!stage.timeout){
|
if(!stage.timeout){
|
||||||
_LIFE&&_LIFE--;
|
_LIFE--;
|
||||||
stage.reset();
|
if(_LIFE){
|
||||||
|
stage.resetItems();
|
||||||
|
}else{
|
||||||
|
game.nextStage();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -129,7 +138,7 @@
|
|||||||
var map = stage.createMap({
|
var map = stage.createMap({
|
||||||
x:60,
|
x:60,
|
||||||
y:10,
|
y:10,
|
||||||
data:JSON.parse(JSON.stringify(_DATA)),
|
data:_DATA,
|
||||||
draw:function(context){
|
draw:function(context){
|
||||||
for(var j=0; j<this.y_length; j++){
|
for(var j=0; j<this.y_length; j++){
|
||||||
for(var i=0; i<this.x_length; i++){
|
for(var i=0; i<this.x_length; i++){
|
||||||
@ -226,7 +235,7 @@
|
|||||||
var goods = stage.createMap({
|
var goods = stage.createMap({
|
||||||
x:60,
|
x:60,
|
||||||
y:10,
|
y:10,
|
||||||
data:JSON.parse(JSON.stringify(_DATA)),
|
data:_DATA,
|
||||||
draw:function(context){
|
draw:function(context){
|
||||||
for(var j=0; j<this.y_length; j++){
|
for(var j=0; j<this.y_length; j++){
|
||||||
for(var i=0; i<this.x_length; i++){
|
for(var i=0; i<this.x_length; i++){
|
||||||
@ -432,7 +441,7 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
//布景事件绑定
|
//事件绑定
|
||||||
stage.bind('keydown',function(e){
|
stage.bind('keydown',function(e){
|
||||||
switch(e.keyCode){
|
switch(e.keyCode){
|
||||||
case 13: //回车
|
case 13: //回车
|
||||||
@ -454,6 +463,45 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
})();
|
})();
|
||||||
game.init();
|
//结束画面
|
||||||
game.nextStage(); //*测试*游戏主布景,完成后需关闭
|
(function(){
|
||||||
|
var stage = game.createStage();
|
||||||
|
//游戏结束
|
||||||
|
stage.createItem({
|
||||||
|
x:game.width/2,
|
||||||
|
y:game.height*.35,
|
||||||
|
draw:function(context){
|
||||||
|
context.fillStyle = '#FFF';
|
||||||
|
context.font = 'bold 48px Helvetica';
|
||||||
|
context.textAlign = 'center';
|
||||||
|
context.textBaseline = 'middle';
|
||||||
|
context.fillText('GAME OVER',this.x,this.y);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//记分
|
||||||
|
stage.createItem({
|
||||||
|
x:game.width/2,
|
||||||
|
y:game.height*.5,
|
||||||
|
draw:function(context){
|
||||||
|
context.fillStyle = '#FFF';
|
||||||
|
context.font = '20px Helvetica';
|
||||||
|
context.textAlign = 'center';
|
||||||
|
context.textBaseline = 'middle';
|
||||||
|
context.fillText('FINAL SCORE: '+(_SCORE+50*_LIFE),this.x,this.y);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
//事件绑定
|
||||||
|
stage.bind('keydown',function(e){
|
||||||
|
switch(e.keyCode){
|
||||||
|
case 13: //回车
|
||||||
|
case 32: //空格
|
||||||
|
_SCORE = 0;
|
||||||
|
_LIFE = 3;
|
||||||
|
var st = game.setStage(1);
|
||||||
|
st.reset();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
})();
|
||||||
|
game.init();
|
||||||
})();
|
})();
|
Loading…
x
Reference in New Issue
Block a user