updated 添加能量豆功能
This commit is contained in:
parent
5f6c155b3a
commit
ab45455c7b
51
game.js
51
game.js
@ -59,7 +59,7 @@ function Game(id,params){
|
|||||||
height:20, //高
|
height:20, //高
|
||||||
type:0, //对象类型,0表示普通对象(不与地图绑定),1表示玩家控制对象,2表示程序控制对象
|
type:0, //对象类型,0表示普通对象(不与地图绑定),1表示玩家控制对象,2表示程序控制对象
|
||||||
color:'#F00', //标识颜色
|
color:'#F00', //标识颜色
|
||||||
status:1, //对象状态,0表示隐藏,1表示正常,2表示暂停
|
status:1, //对象状态,0表示未激活/结束,1表示正常,2表示暂停,3表示临时,4表示异常
|
||||||
orientation:0, //当前定位方向,0表示右,1表示下,2表示左,3表示上
|
orientation:0, //当前定位方向,0表示右,1表示下,2表示左,3表示上
|
||||||
speed:0, //移动速度
|
speed:0, //移动速度
|
||||||
//地图相关
|
//地图相关
|
||||||
@ -108,6 +108,8 @@ function Game(id,params){
|
|||||||
stage:null, //布景
|
stage:null, //布景
|
||||||
x_length:0, //二维数组x轴长度
|
x_length:0, //二维数组x轴长度
|
||||||
y_length:0, //二维数组y轴长度
|
y_length:0, //二维数组y轴长度
|
||||||
|
frames:1, //速度等级,内部计算器times多少帧变化一次
|
||||||
|
times:0, //刷新画布计数(用于循环动画状态判断)
|
||||||
update:function(){}, //更新地图数据
|
update:function(){}, //更新地图数据
|
||||||
draw:function(){}, //绘制地图
|
draw:function(){}, //绘制地图
|
||||||
};
|
};
|
||||||
@ -148,7 +150,8 @@ function Game(id,params){
|
|||||||
var defaults = {
|
var defaults = {
|
||||||
map:null,
|
map:null,
|
||||||
start:{},
|
start:{},
|
||||||
end:{}
|
end:{},
|
||||||
|
type:'path'
|
||||||
};
|
};
|
||||||
var options = _extend({},defaults,params);
|
var options = _extend({},defaults,params);
|
||||||
var result = [];
|
var result = [];
|
||||||
@ -159,18 +162,37 @@ function Game(id,params){
|
|||||||
var y_length = options.map.length;
|
var y_length = options.map.length;
|
||||||
var x_length = options.map[0].length;
|
var x_length = options.map[0].length;
|
||||||
var steps = []; //步骤的映射
|
var steps = []; //步骤的映射
|
||||||
|
var steps_length = 0;
|
||||||
for(var y=y_length;y--;){
|
for(var y=y_length;y--;){
|
||||||
steps[y] = [];
|
steps[y] = [];
|
||||||
for(var x=x_length;x--;){
|
for(var x=x_length;x--;){
|
||||||
steps[y][x] = 0;
|
steps[y][x] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var _render = function(list){
|
var _getValue = function(x,y){ //获取地图上的值
|
||||||
|
if(options.map[y]&&typeof options.map[y][x]!='undefined'){
|
||||||
|
return options.map[y][x];
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
};
|
||||||
|
var _next = function(to){ //判定是非可走,可走放入列表
|
||||||
|
var value = _getValue(to.x,to.y);
|
||||||
|
if(value<1){
|
||||||
|
if(value==-1){
|
||||||
|
to.x = (to.x+x_length)%x_length;
|
||||||
|
to.y = (to.y+y_length)%y_length;
|
||||||
|
to.change = 1;
|
||||||
|
}
|
||||||
|
if(!steps[to.y][to.x]){
|
||||||
|
result.push(to);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var _render = function(list){//找线路
|
||||||
var new_list = [];
|
var new_list = [];
|
||||||
var next = function(from,to){
|
var next = function(from,to){
|
||||||
if(!finded){
|
var value = _getValue(to.x,to.y);
|
||||||
var value = options.map[to.y]&&typeof options.map[to.y][to.x] !='undefined'?options.map[to.y][to.x]:-1;
|
if(value<1){ //当前点是否可以走
|
||||||
if(value!=1){ //当前点是否可以走
|
|
||||||
if(value==-1){
|
if(value==-1){
|
||||||
to.x = (to.x+x_length)%x_length;
|
to.x = (to.x+x_length)%x_length;
|
||||||
to.y = (to.y+y_length)%y_length;
|
to.y = (to.y+y_length)%y_length;
|
||||||
@ -184,7 +206,6 @@ function Game(id,params){
|
|||||||
new_list.push(to);
|
new_list.push(to);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
};
|
};
|
||||||
for(var i=0,len=list.length;i<len;i++){
|
for(var i=0,len=list.length;i<len;i++){
|
||||||
var current = list[i];
|
var current = list[i];
|
||||||
@ -200,10 +221,17 @@ function Game(id,params){
|
|||||||
_render([options.start]);
|
_render([options.start]);
|
||||||
if(finded){
|
if(finded){
|
||||||
var current=options.end;
|
var current=options.end;
|
||||||
|
if(options.type=='path'){
|
||||||
while(current.x!=options.start.x||current.y!=options.start.y){
|
while(current.x!=options.start.x||current.y!=options.start.y){
|
||||||
result.unshift(current);
|
result.unshift(current);
|
||||||
current=steps[current.y][current.x];
|
current=steps[current.y][current.x];
|
||||||
}
|
}
|
||||||
|
}else if(options.type=='next'){
|
||||||
|
_next({x:current.x+1,y:current.y});
|
||||||
|
_next({x:current.x,y:current.y+1});
|
||||||
|
_next({x:current.x-1,y:current.y});
|
||||||
|
_next({x:current.x,y:current.y-1});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
@ -211,7 +239,7 @@ function Game(id,params){
|
|||||||
var Stage = function(params){
|
var Stage = function(params){
|
||||||
this._params = params||{};
|
this._params = params||{};
|
||||||
this._settings = {
|
this._settings = {
|
||||||
status:0, //布景状态,0表示未激活,1表示正常,2表示暂停,3表示中断或异常,4表示结束
|
status:0, //布景状态,0表示未激活/结束,1表示正常,2表示暂停,3表示临时,4表示异常
|
||||||
maps:[], //地图队列
|
maps:[], //地图队列
|
||||||
audio:[], //音频资源
|
audio:[], //音频资源
|
||||||
images:[], //图片资源
|
images:[], //图片资源
|
||||||
@ -312,7 +340,10 @@ function Game(id,params){
|
|||||||
}
|
}
|
||||||
if(stage.update()!=false){ //update返回false,则不绘制
|
if(stage.update()!=false){ //update返回false,则不绘制
|
||||||
if(stage.maps.length){
|
if(stage.maps.length){
|
||||||
stage.maps.forEach(function(map,index){
|
stage.maps.forEach(function(map){
|
||||||
|
if(!(f%map.frames)){
|
||||||
|
map.times = f/map.frames; //计数器
|
||||||
|
}
|
||||||
map.update();
|
map.update();
|
||||||
map.draw(_context);
|
map.draw(_context);
|
||||||
});
|
});
|
||||||
@ -322,7 +353,7 @@ function Game(id,params){
|
|||||||
if(!(f%item.frames)){
|
if(!(f%item.frames)){
|
||||||
item.times = f/item.frames; //计数器
|
item.times = f/item.frames; //计数器
|
||||||
}
|
}
|
||||||
if(stage.status==1&&item.status==1){ //对象及布景状态都处于正常状态下
|
if(stage.status==1&&item.status!=2){ //对象及布景状态都处于正常状态下
|
||||||
if(item.location){
|
if(item.location){
|
||||||
item.coord = item.location.position2coord(item.x,item.y);
|
item.coord = item.location.position2coord(item.x,item.y);
|
||||||
}
|
}
|
||||||
|
285
index.js
285
index.js
@ -104,24 +104,28 @@
|
|||||||
})();
|
})();
|
||||||
//游戏主程序
|
//游戏主程序
|
||||||
(function(){
|
(function(){
|
||||||
var stage = game.createStage({
|
var stage,map,goods,beans,player,times;
|
||||||
|
stage = game.createStage({
|
||||||
update:function(){
|
update:function(){
|
||||||
var stage = this;
|
var stage = this;
|
||||||
if(stage.status==1){
|
if(stage.status==1){ //场景正常运行
|
||||||
var player = stage.getItemsByType(1)[0];
|
items.forEach(function(item){
|
||||||
var items = stage.getItemsByType(2);
|
|
||||||
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&&item.status!=4){ //物体检测
|
||||||
|
if(item.status==3){
|
||||||
|
item.status = 4;
|
||||||
|
_SCORE += 10;
|
||||||
|
}else{
|
||||||
stage.status = 3;
|
stage.status = 3;
|
||||||
stage.timeout = 30;
|
stage.timeout = 30;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
if(JSON.stringify(goods.data).indexOf(0)<0){
|
if(JSON.stringify(beans.data).indexOf(0)<0){ //当没有物品的时候,进入结束画面
|
||||||
game.nextStage();
|
game.nextStage();
|
||||||
}
|
}
|
||||||
}else if(stage.status==3){
|
}else if(stage.status==3){ //场景暂停状态
|
||||||
if(!stage.timeout){
|
if(!stage.timeout){
|
||||||
_LIFE--;
|
_LIFE--;
|
||||||
if(_LIFE){
|
if(_LIFE){
|
||||||
@ -135,7 +139,7 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
//绘制地图
|
//绘制地图
|
||||||
var map = stage.createMap({
|
map = stage.createMap({
|
||||||
x:60,
|
x:60,
|
||||||
y:10,
|
y:10,
|
||||||
data:_DATA,
|
data:_DATA,
|
||||||
@ -232,21 +236,35 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
//物品地图
|
//物品地图
|
||||||
var goods = stage.createMap({
|
goods = {
|
||||||
|
'1,3':1,
|
||||||
|
'26,3':1,
|
||||||
|
'1,23':1,
|
||||||
|
'26,23':1
|
||||||
|
};
|
||||||
|
beans = stage.createMap({
|
||||||
x:60,
|
x:60,
|
||||||
y:10,
|
y:10,
|
||||||
data:_DATA,
|
data:_DATA,
|
||||||
|
frames:8,
|
||||||
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++){
|
||||||
if(!this.get(i,j)){
|
if(!this.get(i,j)){
|
||||||
var pos = this.coord2position(i,j);
|
var pos = this.coord2position(i,j);
|
||||||
context.fillStyle = "#F5F5DC";
|
context.fillStyle = "#F5F5DC";
|
||||||
|
if(goods[i+','+j]){
|
||||||
|
context.beginPath();
|
||||||
|
context.arc(pos.x,pos.y,3+this.times%2,0,2*Math.PI,true);
|
||||||
|
context.fill();
|
||||||
|
context.closePath();
|
||||||
|
}else{
|
||||||
context.fillRect(pos.x-2,pos.y-2,4,4);
|
context.fillRect(pos.x-2,pos.y-2,4,4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
});
|
});
|
||||||
//得分
|
//得分
|
||||||
stage.createItem({
|
stage.createItem({
|
||||||
@ -288,7 +306,7 @@
|
|||||||
height:30,
|
height:30,
|
||||||
draw:function(context){
|
draw:function(context){
|
||||||
for(var i=0;i<_LIFE-1;i++){
|
for(var i=0;i<_LIFE-1;i++){
|
||||||
var x=this.x+36*i,y=this.y;
|
var x=this.x+40*i,y=this.y;
|
||||||
context.fillStyle = '#FFE600';
|
context.fillStyle = '#FFE600';
|
||||||
context.beginPath();
|
context.beginPath();
|
||||||
context.arc(x,y,this.width/2,.15*Math.PI,-.15*Math.PI,false);
|
context.arc(x,y,this.width/2,.15*Math.PI,-.15*Math.PI,false);
|
||||||
@ -298,8 +316,147 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
//NPC
|
||||||
|
for(var i=0;i<4;i++){
|
||||||
|
stage.createItem({
|
||||||
|
width:30,
|
||||||
|
height:30,
|
||||||
|
orientation:3,
|
||||||
|
color:_COLOR[i],
|
||||||
|
location:map,
|
||||||
|
coord:{x:12+i,y:14},
|
||||||
|
vector:{x:12+i,y:14},
|
||||||
|
type:2,
|
||||||
|
frames:10,
|
||||||
|
speed:1,
|
||||||
|
timeout:Math.floor(Math.random()*120),
|
||||||
|
update:function(){
|
||||||
|
var new_map;
|
||||||
|
if(this.status==3&&!this.timeout){
|
||||||
|
this.status = 1;
|
||||||
|
}
|
||||||
|
if(!this.coord.offset){ //到达坐标中心时计算
|
||||||
|
if(this.status==1){
|
||||||
|
if(!this.timeout){ //定时器
|
||||||
|
new_map = JSON.parse(JSON.stringify(map.data).replace(/2/g,0));
|
||||||
|
var index = this.index;
|
||||||
|
items.forEach(function(item){
|
||||||
|
if(item.index!=index&&item.status==1){ //NPC将其它所有还处于正常状态的NPC当成一堵墙
|
||||||
|
new_map[item.coord.y][item.coord.x]=1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.path = map.finder({
|
||||||
|
map:new_map,
|
||||||
|
start:this.coord,
|
||||||
|
end:player.coord
|
||||||
|
});
|
||||||
|
if(this.path.length){
|
||||||
|
this.vector = this.path[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else if(this.status==3){
|
||||||
|
new_map = JSON.parse(JSON.stringify(map.data).replace(/2/g,0));
|
||||||
|
var index = this.index;
|
||||||
|
items.forEach(function(item){
|
||||||
|
if(item.index!=index){
|
||||||
|
new_map[item.coord.y][item.coord.x]=1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
this.path = map.finder({
|
||||||
|
map:new_map,
|
||||||
|
start:player.coord,
|
||||||
|
end:this.coord,
|
||||||
|
type:'next'
|
||||||
|
});
|
||||||
|
if(this.path.length){
|
||||||
|
this.vector = this.path[Math.floor(Math.random()*this.path.length)];
|
||||||
|
}
|
||||||
|
}else if(this.status==4){
|
||||||
|
new_map = JSON.parse(JSON.stringify(map.data).replace(/2/g,0));
|
||||||
|
this.path = map.finder({
|
||||||
|
map:new_map,
|
||||||
|
start:this.coord,
|
||||||
|
end:this._params.coord
|
||||||
|
});
|
||||||
|
if(this.path.length){
|
||||||
|
this.vector = this.path[0];
|
||||||
|
}else{
|
||||||
|
this.status = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//是否转变方向
|
||||||
|
if(this.vector.change){
|
||||||
|
this.coord.x = this.vector.x;
|
||||||
|
this.coord.y = this.vector.y;
|
||||||
|
var pos = map.coord2position(this.coord.x,this.coord.y);
|
||||||
|
this.x = pos.x;
|
||||||
|
this.y = pos.y;
|
||||||
|
}
|
||||||
|
//方向判定
|
||||||
|
if(this.vector.x>this.coord.x){
|
||||||
|
this.orientation = 0;
|
||||||
|
}else if(this.vector.x<this.coord.x){
|
||||||
|
this.orientation = 2;
|
||||||
|
}else if(this.vector.y>this.coord.y){
|
||||||
|
this.orientation = 1;
|
||||||
|
}else if(this.vector.y<this.coord.y){
|
||||||
|
this.orientation = 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.x += this.speed*_COS[this.orientation];
|
||||||
|
this.y += this.speed*_SIN[this.orientation];
|
||||||
|
},
|
||||||
|
draw:function(context){
|
||||||
|
var isSick = false;
|
||||||
|
if(this.status==3){
|
||||||
|
isSick = this.timeout>80||this.times%2?true:false;
|
||||||
|
}
|
||||||
|
if(this.status!=4){
|
||||||
|
context.fillStyle = isSick?'#BABABA':this.color;
|
||||||
|
context.beginPath();
|
||||||
|
context.arc(this.x,this.y,this.width*.5,0,Math.PI,true);
|
||||||
|
switch(this.times%2){
|
||||||
|
case 0:
|
||||||
|
context.lineTo(this.x-this.width*.5,this.y+this.height*.4);
|
||||||
|
context.quadraticCurveTo(this.x-this.width*.4,this.y+this.height*.5,this.x-this.width*.2,this.y+this.height*.3);
|
||||||
|
context.quadraticCurveTo(this.x,this.y+this.height*.5,this.x+this.width*.2,this.y+this.height*.3);
|
||||||
|
context.quadraticCurveTo(this.x+this.width*.4,this.y+this.height*.5,this.x+this.width*.5,this.y+this.height*.4);
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
context.lineTo(this.x-this.width*.5,this.y+this.height*.3);
|
||||||
|
context.quadraticCurveTo(this.x-this.width*.25,this.y+this.height*.5,this.x,this.y+this.height*.3);
|
||||||
|
context.quadraticCurveTo(this.x+this.width*.25,this.y+this.height*.5,this.x+this.width*.5,this.y+this.height*.3);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
context.fill();
|
||||||
|
context.closePath();
|
||||||
|
}
|
||||||
|
context.fillStyle = '#FFF';
|
||||||
|
if(isSick){
|
||||||
|
context.beginPath();
|
||||||
|
context.arc(this.x-this.width*.15,this.y-this.height*.21,this.width*.08,0,2*Math.PI,false);
|
||||||
|
context.arc(this.x+this.width*.15,this.y-this.height*.21,this.width*.08,0,2*Math.PI,false);
|
||||||
|
context.fill();
|
||||||
|
context.closePath();
|
||||||
|
}else{
|
||||||
|
context.beginPath();
|
||||||
|
context.arc(this.x-this.width*.15,this.y-this.height*.21,this.width*.12,0,2*Math.PI,false);
|
||||||
|
context.arc(this.x+this.width*.15,this.y-this.height*.21,this.width*.12,0,2*Math.PI,false);
|
||||||
|
context.fill();
|
||||||
|
context.closePath();
|
||||||
|
context.fillStyle = '#000';
|
||||||
|
context.beginPath();
|
||||||
|
context.arc(this.x-this.width*(.15-.04*_COS[this.orientation]),this.y-this.height*(.21-.04*_SIN[this.orientation]),this.width*.07,0,2*Math.PI,false);
|
||||||
|
context.arc(this.x+this.width*(.15+.04*_COS[this.orientation]),this.y-this.height*(.21-.04*_SIN[this.orientation]),this.width*.07,0,2*Math.PI,false);
|
||||||
|
context.fill();
|
||||||
|
context.closePath();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
items = stage.getItemsByType(2);
|
||||||
//主角
|
//主角
|
||||||
var player = stage.createItem({
|
player = stage.createItem({
|
||||||
width:30,
|
width:30,
|
||||||
height:30,
|
height:30,
|
||||||
type:1,
|
type:1,
|
||||||
@ -326,9 +483,17 @@
|
|||||||
this.y -= map.size*(map.y_length-1)*_SIN[this.orientation];
|
this.y -= map.size*(map.y_length-1)*_SIN[this.orientation];
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
if(!goods.get(this.coord.x,this.coord.y)){
|
if(!beans.get(this.coord.x,this.coord.y)){ //吃豆
|
||||||
_SCORE++;
|
_SCORE++;
|
||||||
goods.set(this.coord.x,this.coord.y,1);
|
beans.set(this.coord.x,this.coord.y,1);
|
||||||
|
if(goods[this.coord.x+','+this.coord.y]){ //吃到能量豆
|
||||||
|
items.forEach(function(item){
|
||||||
|
if(item.status==1){ //如果NPC为正常状态,则置为临时状态
|
||||||
|
item.timeout = 450;
|
||||||
|
item.status = 3;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
this.x += this.speed*_COS[this.orientation];
|
this.x += this.speed*_COS[this.orientation];
|
||||||
this.y += this.speed*_SIN[this.orientation];
|
this.y += this.speed*_SIN[this.orientation];
|
||||||
@ -337,13 +502,13 @@
|
|||||||
draw:function(context){
|
draw:function(context){
|
||||||
context.fillStyle = '#FFE600';
|
context.fillStyle = '#FFE600';
|
||||||
context.beginPath();
|
context.beginPath();
|
||||||
if(stage.status<3){
|
if(stage.status!=3){ //玩家正常状态
|
||||||
if(this.times%2){
|
if(this.times%2){
|
||||||
context.arc(this.x,this.y,this.width/2,(.5*this.orientation+.20)*Math.PI,(.5*this.orientation-.20)*Math.PI,false);
|
context.arc(this.x,this.y,this.width/2,(.5*this.orientation+.20)*Math.PI,(.5*this.orientation-.20)*Math.PI,false);
|
||||||
}else{
|
}else{
|
||||||
context.arc(this.x,this.y,this.width/2,(.5*this.orientation+.01)*Math.PI,(.5*this.orientation-.01)*Math.PI,false);
|
context.arc(this.x,this.y,this.width/2,(.5*this.orientation+.01)*Math.PI,(.5*this.orientation-.01)*Math.PI,false);
|
||||||
}
|
}
|
||||||
}else{
|
}else{ //玩家被吃
|
||||||
if(stage.timeout) {
|
if(stage.timeout) {
|
||||||
context.arc(this.x,this.y,this.width/2,(.5*this.orientation+1-.02*stage.timeout)*Math.PI,(.5*this.orientation-1+.02*stage.timeout)*Math.PI,false);
|
context.arc(this.x,this.y,this.width/2,(.5*this.orientation+1-.02*stage.timeout)*Math.PI,(.5*this.orientation-1+.02*stage.timeout)*Math.PI,false);
|
||||||
}
|
}
|
||||||
@ -353,94 +518,6 @@
|
|||||||
context.fill();
|
context.fill();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
//NPC
|
|
||||||
for(var i=0;i<4;i++){
|
|
||||||
stage.createItem({
|
|
||||||
width:30,
|
|
||||||
height:30,
|
|
||||||
orientation:3,
|
|
||||||
color:_COLOR[i],
|
|
||||||
location:map,
|
|
||||||
coord:{x:12+i,y:14},
|
|
||||||
vector:{x:12+i,y:14},
|
|
||||||
type:2,
|
|
||||||
frames:10,
|
|
||||||
speed:1,
|
|
||||||
timeout:Math.floor(Math.random()*120),
|
|
||||||
update:function(){
|
|
||||||
if(!this.coord.offset){
|
|
||||||
if(!this.timeout){
|
|
||||||
var new_map = JSON.parse(JSON.stringify(map.data).replace(/2/g,0));
|
|
||||||
var items = stage.getItemsByType(2);
|
|
||||||
var index = this.index;
|
|
||||||
items.forEach(function(item){
|
|
||||||
if(item.index!=index){
|
|
||||||
new_map[item.coord.y][item.coord.x]=1;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
this.path = map.finder({
|
|
||||||
map:new_map,
|
|
||||||
start:this.coord,
|
|
||||||
end:player.coord
|
|
||||||
});
|
|
||||||
if(this.path.length){
|
|
||||||
this.vector = this.path[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(this.vector.change){ //是否转变方向
|
|
||||||
this.coord.x = this.vector.x;
|
|
||||||
this.coord.y = this.vector.y;
|
|
||||||
var pos = map.coord2position(this.coord.x,this.coord.y);
|
|
||||||
this.x = pos.x;
|
|
||||||
this.y = pos.y;
|
|
||||||
}
|
|
||||||
if(this.vector.x>this.coord.x){
|
|
||||||
this.orientation = 0;
|
|
||||||
}else if(this.vector.x<this.coord.x){
|
|
||||||
this.orientation = 2;
|
|
||||||
}else if(this.vector.y>this.coord.y){
|
|
||||||
this.orientation = 1;
|
|
||||||
}else if(this.vector.y<this.coord.y){
|
|
||||||
this.orientation = 3;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.x += this.speed*_COS[this.orientation];
|
|
||||||
this.y += this.speed*_SIN[this.orientation];
|
|
||||||
},
|
|
||||||
draw:function(context){
|
|
||||||
context.fillStyle = this.color;
|
|
||||||
context.beginPath();
|
|
||||||
context.arc(this.x,this.y,this.width*.5,0,Math.PI,true);
|
|
||||||
switch(this.times%2){
|
|
||||||
case 0:
|
|
||||||
context.lineTo(this.x-this.width*.5,this.y+this.height*.4);
|
|
||||||
context.quadraticCurveTo(this.x-this.width*.4,this.y+this.height*.5,this.x-this.width*.2,this.y+this.height*.3);
|
|
||||||
context.quadraticCurveTo(this.x,this.y+this.height*.5,this.x+this.width*.2,this.y+this.height*.3);
|
|
||||||
context.quadraticCurveTo(this.x+this.width*.4,this.y+this.height*.5,this.x+this.width*.5,this.y+this.height*.4);
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
context.lineTo(this.x-this.width*.5,this.y+this.height*.3);
|
|
||||||
context.quadraticCurveTo(this.x-this.width*.25,this.y+this.height*.5,this.x,this.y+this.height*.3);
|
|
||||||
context.quadraticCurveTo(this.x+this.width*.25,this.y+this.height*.5,this.x+this.width*.5,this.y+this.height*.3);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
context.fill();
|
|
||||||
context.closePath();
|
|
||||||
context.fillStyle = '#FFF';
|
|
||||||
context.beginPath();
|
|
||||||
context.arc(this.x-this.width*.15,this.y-this.height*.21,this.width*.12,0,2*Math.PI,false);
|
|
||||||
context.arc(this.x+this.width*.15,this.y-this.height*.21,this.width*.12,0,2*Math.PI,false);
|
|
||||||
context.fill();
|
|
||||||
context.closePath();
|
|
||||||
context.fillStyle = '#000';
|
|
||||||
context.beginPath();
|
|
||||||
context.arc(this.x-this.width*(.15-.04*_COS[this.orientation]),this.y-this.height*(.21-.04*_SIN[this.orientation]),this.width*.07,0,2*Math.PI,false);
|
|
||||||
context.arc(this.x+this.width*(.15+.04*_COS[this.orientation]),this.y-this.height*(.21-.04*_SIN[this.orientation]),this.width*.07,0,2*Math.PI,false);
|
|
||||||
context.fill();
|
|
||||||
context.closePath();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
//事件绑定
|
//事件绑定
|
||||||
stage.bind('keydown',function(e){
|
stage.bind('keydown',function(e){
|
||||||
switch(e.keyCode){
|
switch(e.keyCode){
|
||||||
|
Loading…
x
Reference in New Issue
Block a user