#今日のメニュー
・キャラクターのクラス化
・追従機能を一般化しクラスに実装
・追従機能を用いて任意個数の数珠つなぎができるようにする
・クラスの整頓
#本文
クラス化は以下のあたりを参考にやっていきました。
・#10 クラスを作ってみよう
・Tips: クラスを継承する
・enchant.js | クマタッチ - 00.クマクラスを生成しよう
クラスは先頭キャラクラスと体キャラクラスを作ります。
先頭キャラクラスは操作が可能であり、速度などの変数を保持しています。
また、このクラスは、一つ分体が長くなる関数を持ちます。
この関数は連続で呼び出されると、動作が不安定になるため、
一定の感覚を開けないと再動作しないようにします。
体キャラクラスは、操作することができません。
先頭キャラのインスタンスを変数として持ち、
先頭キャラの速度に依存して動作します。
二種類のクラスのインスタンスは、変数を介して接続し、
リスト構造のように管理することができます。
以上を実現したのが大体以下の感じ。
当初、二つのクラスは全く別々だったのですが、あまりに冗長であったため、
調べて継承をするようにしました。
var PlayerBaseClass=Class.create(Sprite,{
initialize:function(angle,imgName,preX,preY){
Sprite.call(this,32,32);
this.angle=angle;
this.queue=new Array();
this.image=game.assets[imgName];
this.x=preX;
this.y=preY;
this.next=null;
},
setNext:function(next){
this.next=next;
},
getNext:function(){
return this.next;
},
setLast:function(newNode){
this.getLast().setNext(newNode);
},
getLast:function(newNode){
if(this.getNext()!=null){
var last=this.getNext();
while(true){
if(last.getNext()!=null){
last=last.getNext();
}else{
break;
}
}
return(last);
}else{
return (this);
}
},
});
var PlayerClass=Class.create(PlayerBaseClass,{
initialize:function(game,imgName,angle,speed,preX,preY,scene){
PlayerBaseClass.call(this,angle,imgName,preX,preY);
this.speed=speed;
this.creatable=true;
this.onenterframe=function(){
var input = game.input;
if(input.left)this.angle=(this.angle-0.1)%(2*Math.PI);
else if(input.right)this.angle=(this.angle+0.1)%(2*Math.PI);
this.x+=this.speed*Math.cos(this.angle);
this.y+=this.speed*Math.sin(this.angle);
this.queue.push(this.angle);
if(this.next!=null){
this.next.angle=parseFloat(this.queue.shift());
}else{
this.queue.shift();
}
};
for(var i=0;i<32/this.speed;i++){
this.queue.push(angle);
}
scene.addChild(this);
},
createNewNode:function(){
if(this.creatable==true){
this.setLast(new PlayerChildClass(this,'./img/ball00.png'));
this.creatable=false;
}
}
});
var PlayerChildClass=Class.create(PlayerBaseClass,{
initialize:function(head,imgName){
var last=head.getLast();
PlayerBaseClass.call(this,last.angle,imgName,last.x,last.y);
this.head=head;
this.count=32/this.head.speed;
this.onenterframe=function(){
this.queue.push(this.angle);
if(this.count<0){
this.x+=this.head.speed*Math.cos(this.angle);
this.y+=this.head.speed*Math.sin(this.angle);
if(this.next!=null){
this.next.angle=parseFloat(this.queue.shift());
}else{
this.queue.shift();
}
}else{
this.count--;
if(this.count<0){
this.head.creatable=true;
}
}
};
scene.addChild(this);
}
});
#今日の成果
現状へとびます
左右キーで曲がることができます。
下キーで成長(増殖?)します。
#次回予告
明日は、衝突判定をするようにしたいと思います。
体のサイズも変えようかな…
あと、楽しくなってくるとソースにコメント書くのをやめてしまう傾向にあるので、
忘れないうちにコメントを書いておこうと思います。