前回は、Heroクラスのアニメーション設定とイベントの追加を紹介しました。
今回は、Enemy、Platform/MovingPlatform、Coinクラスの紹介です。
Heroクラスの紹介記事でも、前準備として登場しているPlatformクラスは
地面や壁、又は空中に配置する足場といった、オブジェクトの土台を生成するためのクラスです。
//地面作成 var ground:Platform = new Platform("ground", { width : stage.stageWidth, height : 10, x : stage.stageWidth * 0.5, y : stage.stageHeight - 5 }); add( ground ); //左壁作成 var leftWall:Platform = new Platform("leftWall", { width : 5, height : stage.stageHeight, x : 2.5, y : stage.stageHeight * 0.5 }); add( leftWall ); //右壁作成 var rightWall:Platform = new Platform("rightWall", { width : 5, height : stage.stageHeight, x : stage.stageWidth - 2.5, y : stage.stageHeight * 0.5 }); add( rightWall );
サンプルコードでは行っていませんが、Heroクラス同様にPlatformクラスがもつviewプロパティに、StarlingのDisplayObjectを設定する事が出来ます。
次は、MovingPlatformクラスになります。
こちらは、クラス名にPlatformとついていることから、土台を生成するクラスということはおわかりになると思いますが、
Platformクラスとの違いは、座標を指定すると土台オブジェクトが一定間隔で自動的に移動するということです。
生成方法は通常のPlatformクラスに、移動の始点と終点を追加で設定するだけです。
移動速度は、speedプロパティで変更する事が出来ます。
//MovingPlatform生成 var mov:Quad = new Quad( 100, 10, 0xFFFFFF ); var mPlatform:MovingPlatform = new MovingPlatform("movingPlatform", { width : mov.width, height : mov.height, x : stage.stageWidth * 0.1, y : 500, startX : stage.stageWidth * 0.1, startY : 500, endX : stage.stageWidth * 0.9, endY : 300, view:mov }); add(mPlatform); //移動速度を変更 mPlatform.speed = 3;
次に、Enemyクラスの紹介です。
Enemyクラスは、自動で移動する敵オブジェクトを生成するクラスです。
前回の記事で、紹介させて頂いたHeroクラスの「攻撃/被弾」イベントのトリガーとなるクラスで
横から衝突した、又はされた場合には「被弾」、上から衝突された場合は「攻撃」のイベントをコールします。
MovingPlatform同様、speedプロパティによって移動速度が変更可能で
leftBound/rightBoundプロパティを設定する事で、移動範囲を制限することが出来ます。
例えば、leftBound:200, rightBound:500と設定した場合は、x座標200〜500の範囲で反復横移動を自動的に行う事となります。
//Enemyオブジェクト生成 var quad:Quad = new Quad( 50, 50, 0x03C39E ); var enemy:Enemy = new Enemy("enemy", { width : quad.width, height : quad.height, x : stage.stageWidth - quad.width * 0.5, y : stage.stageHeight - quad.height * 0.5, leftBound : 200, rightBound : 500, view : quad }); add( enemy );
最後に、Coinクラスの紹介です。
オブジェクトの生成方法は、これまで紹介してきたオブジェクトと同様です。
Heroクラスとの衝突によって、自動的にステージから削除され、衝突時に実行されるイベントを登録する事が出来ます。
高得点を狙うのが目的のようなスコアゲームは、簡単に実装する事が出来るので、とても便利なクラスです。
var coinTexture:Texture = Texture.fromBitmap( new CoinBitmap() );
for( var i = 0; i < 50; i++ ){
var x:Number = Math.floor( Math.random() * stage.stageWidth * 0.8 + 50 );
var y:Number = Math.floor( Math.random() * stage.stageHeight * 0.8 + 50 );
var coin:Coin = new Coin("coin",
{ x:x,
y:y,
view:coinTexture
});
add( coin );
//衝突時のイベント登録
coin.onBeginContact.addOnce( getCoinEvent );
}
//衝突イベント
function getCoinEvent( contact:b2Contact ):void
{
trace( "コインゲット!!" );
}
[/as3]
簡単なご紹介となりましたが、以上で本記事は終了となります。
最後まで御覧いただきありがとうございました。
<CitrusTest.as>
package {
//Starling及び、Box2Dのインポート
import citrus.core.starling.StarlingState;
import citrus.physics.box2d.Box2D;
import citrus.objects.platformer.box2d.Enemy;
import citrus.objects.platformer.box2d.Hero;
import citrus.objects.platformer.box2d.MovingPlatform;
import citrus.objects.platformer.box2d.Platform;
import citrus.objects.platformer.box2d.Coin;
import citrus.view.starlingview.AnimationSequence;
import citrus.objects.Box2DPhysicsObject;
import org.osflash.signals.Signal;
import starling.display.Quad;
import starling.textures.Texture;
import starling.textures.TextureAtlas;
import starling.events.Event;
import Box2D.Dynamics.Contacts.b2Contact;
//StarlingStateを継承する
public class CitrusTest extends StarlingState {
[Embed(source=”../../../assets/Hero.png”)]
private var heroBitmap:Class;
[Embed(source=”../../../assets/Hero.xml”, mimeType=”application/octet-stream”)]
private var heroXml:Class;
[Embed(source=”../../../assets/coin.png”)]
private var CoinBitmap:Class;
//コンストラクタ
public function CitrusTest()
{
super();
}
//初期化処理のところで色々と配置する
override public function initialize():void
{
super.initialize();
//Box2d空間の作成
var box2D:Box2D = new Box2D(“box2d”);
add(box2D);
//地面作成
var ground:Platform = new Platform(“ground”,
{ width : stage.stageWidth,
height : 10,
x : stage.stageWidth * 0.5,
y : stage.stageHeight – 5
});
add( ground );
//左壁作成
var leftWall:Platform = new Platform(“leftWall”,
{ width : 5,
height : stage.stageHeight,
x : 2.5,
y : stage.stageHeight * 0.5
});
add( leftWall );
//右壁作成
var rightWall:Platform = new Platform(“rightWall”,
{ width : 5,
height : stage.stageHeight,
x : stage.stageWidth – 2.5,
y : stage.stageHeight * 0.5
});
add( rightWall );
//MovingPlatform生成
var mov:Quad = new Quad( 100, 10, 0xFFFFFF );
var mPlatform:MovingPlatform = new MovingPlatform(“movingPlatform”,
{ width : mov.width,
height : mov.height,
x : stage.stageWidth * 0.1,
y : 500,
startX : stage.stageWidth * 0.1,
startY : 500,
endX : stage.stageWidth * 0.9,
endY : 300,
view:mov
});
add(mPlatform);
mPlatform.speed = 5;
//テクスチャアトラス生成
var texture:Texture = Texture.fromBitmap( new heroBitmap() );
var xml:XML = XML( new heroXml() );
var textureAtlas:TextureAtlas = new TextureAtlas( texture, xml );
var animNames:Array = [“idle”, “walk”, “die”, “jump”, “hurt”, “duck”];
var animationSequence:AnimationSequence = new AnimationSequence( textureAtlas, animNames, animNames[ 0 ], 12, true );
//Heroオブジェクト生成
var hero:Hero = new Hero(“hero”,
{ width : animationSequence.width,
height : animationSequence.height,
x : 100,
y : stage.stageHeight – 90,
view : animationSequence
});
add( hero );
//Enemyオブジェクトview用のオブジェクト生成
var quad:Quad = new Quad( 50, 50, 0x03C39E );
//Enemyオブジェクト生成
var enemy:Enemy = new Enemy(“enemy”,
{ width : quad.width,
height : quad.height,
x : stage.stageWidth – quad.width * 0.5,
y : stage.stageHeight – quad.height * 0.5,
leftBound : 200,
rightBound : 500,
view : quad
});
add( enemy );
//Coinオブジェクト生成
var coinTexture:Texture = Texture.fromBitmap( new CoinBitmap() );
for( var i = 0; i < 50; i++ ){
var x:Number = Math.floor( Math.random() * stage.stageWidth * 0.8 + 50 );
var y:Number = Math.floor( Math.random() * stage.stageHeight * 0.8 + 50 );
var coin:Coin = new Coin("coin",
{ x:x,
y:y,
view:coinTexture
});
add( coin );
coin.onBeginContact.addOnce( getCoinEvent );
}
}
/**
* コイン獲得時
*/
private function getCoinEvent( contact:b2Contact ):void
{
trace(" getCount ");
}
}
}
[/as3]
<次回の更新について>
次回は、StarlingCameraクラスをご紹介致します。
弊社では全国各地の請負い(ご自宅)で作業協力頂ける、フリーランスエンジニアの方を常時探しております。
ご興味ある方は、お気軽にお問い合わせ下さい。