1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ゲーム制作3日目!!!

Posted at

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

#本文
クラス化は以下のあたりを参考にやっていきました。
#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);
				}
			});

#今日の成果
現状へとびます
左右キーで曲がることができます。
下キーで成長(増殖?)します。

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?