AndEngineを使用して
以前の記事を既にレビューしましたか?
パート1
パート2
それでは続けましょう。
今日は、ゲームオブジェクトのマップを扱います。 彼女はどんな人ですか? 13x7の寸法のゲームオブジェクトの2次元配列。 サイズは少し奇妙ですが、64x64のセルサイズではかなり論理的に見え始めます。
ステップ1.必要な定数とフィールドを設定します。
public class GameObjectsMap {
public static final int HEIGHT = 7;
public static final int WIDTH = 13;
public static final float CELL_SIZE_X = 64f;
public static final float CELL_SIZE_Y = 64f;
public static final int LASER_LAYER = 0;
public static final int GAME_OBJECTS_LAYER = LASER_LAYER + 1;
private GameObject[][] mMap = new GameObject[WIDTH][HEIGHT];
private Textures mTextures;
GameObjectsMap(final Textures textures) {
mTextures = textures;
}
}
* This source code was highlighted with Source Code Highlighter .
ステップ2.オブジェクトを追加します。
便宜上、オブジェクトをフィールドに追加するメソッドが必要です。
public void add(Type type, final int posH, final int posW, final int angle) {
GameObject object = null ;
switch (type) {
case lasergun:
object = new LaserGun(posH, posW, angle, mTextures
.getLaserGun());
break ;
case mirror:
break ;
case target:
break ;
default :
break ;
}
mMap[posH][posW] = object ;
}
* This source code was highlighted with Source Code Highlighter .
ステップ3.オブジェクトを表示します。
注意深い読者は、GameObjectクラスの説明の前の投稿で列挙型を見ることができます。 addメソッドでは、オブジェクトのタイプ、位置、回転角度を渡します。その後、オブジェクトは配列に表示されますが、表示されません。 ゲームオブジェクトを表示するには、次のメソッドが必要です。
public void addToScene(Scene scene) {
for ( int i = 0; i < mMap.length; i++) {
for ( int j = 0; j < mMap[i].length; j++) {
GameObject o = mMap[i][j];
if (o != null ) {
o.attachTo(scene);
}
}
}
}
* This source code was highlighted with Source Code Highlighter .
とても簡単です。 念のため:
public void clear() {
for ( int i = 0; i < mMap.length; i++) {
Arrays.fill(mMap[i], null );
}
}
* This source code was highlighted with Source Code Highlighter .
これで、単純で明確なタイプの構造を使用して、オブジェクトをシーンに追加できます。
mGameObjectsMap.add(Type.lasergun、0、0、3);
手順4. [処理中]をタッチします。
それでも同じように、私たちはゲームを作成し、ユーザーとのやり取りがなければ、まったくそれを行うことはできません。 残念ながら、Entityクラスには標準のハンドラがないため、通常どおりに動作します。
scene.setOnSceneTouchListener(mGameObjectsController);
mGameObjectsControllerがIOnSceneTouchListenerインターフェイスを実装する場所。 実際、通常のOnTouchListenerとそれほど違いはありません。 そして、私の場合、次のようになります。
public boolean onSceneTouchEvent(final Scene pScene, TouchEvent pSceneTouchEvent) {
if (pSceneTouchEvent.isActionDown()) {
float x = pSceneTouchEvent.getX();
float y = pSceneTouchEvent.getY();
int cellNumX = ( int ) ((x - x % GameObjectsMap.CELL_SIZE_X)
/ GameObjectsMap.CELL_SIZE_X);
int cellNumY = ( int ) ((y - y % GameObjectsMap.CELL_SIZE_X)
/ GameObjectsMap.CELL_SIZE_X);
DynamicGameObject object = (DynamicGameObject)mMap.getMap()[cellNumX][cellNumY];
if ( object != null ) {
//
}
}
return false ;
}
* This source code was highlighted with Source Code Highlighter .
はい、同意します。セルの位置を異なる方法で計算できますが、このオプションは機能し、気に入っています。
今日は以上です。 私のプロジェクトの一部をここで見つけることができます。 質問、提案、建設的な批判はいつでも歓迎します。
PSソースコードはまだそこにあります。
PPSの続き。