ゲーム制作3日目！！！

#今日のメニュー
・キャラクターのクラス化
・追従機能を一般化しクラスに実装
・追従機能を用いて任意個数の数珠つなぎができるようにする
・クラスの整頓

#本文
クラス化は以下のあたりを参考にやっていきました。
・[#10 クラスを作ってみよう](http://dotinstall.com/lessons/basic_enchant_js_v2/11510)
・[Tips: クラスを継承する](http://enchantjs.com/ja/2012/12/tips-%E3%81%8F%E3%82%89%E3%81%99%E3%82%92/)
・[enchant.js | クマタッチ - 00.クマクラスを生成しよう](http://jsdo.it/phi/nCAK)

クラスは先頭キャラクラスと体キャラクラスを作ります。

先頭キャラクラスは操作が可能であり、速度などの変数を保持しています。
また、このクラスは、一つ分体が長くなる関数を持ちます。
この関数は連続で呼び出されると、動作が不安定になるため、
一定の感覚を開けないと再動作しないようにします。

体キャラクラスは、操作することができません。
先頭キャラのインスタンスを変数として持ち、
先頭キャラの速度に依存して動作します。

二種類のクラスのインスタンスは、変数を介して接続し、
リスト構造のように管理することができます。

以上を実現したのが大体以下の感じ。
当初、二つのクラスは全く別々だったのですが、あまりに冗長であったため、
調べて継承をするようにしました。

```js:クラスの定義
			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);
				}
			});
```

#今日の成果
[現状へとびます](https://dl.dropboxusercontent.com/u/35809589/SnakeGame/index.html)
左右キーで曲がることができます。
下キーで成長（増殖？）します。

#次回予告
明日は、衝突判定をするようにしたいと思います。
体のサイズも変えようかな…
あと、楽しくなってくるとソースにコメント書くのをやめてしまう傾向にあるので、
忘れないうちにコメントを書いておこうと思います。