AndEngineを使用してAndroid用のゲームを作成しています。 パート2

みなさんこんにちは!

約束どおり、記事の第2部。

混乱を避けるため、を読む前に記事の最初の部分を読んでください

審査済みですか? それから、ゲームオブジェクトを読者に紹介するキャットへようこそ。



そして、最初の部分をまとめると、テクスチャをロードして表示する方法を学びましたが、完全なゲームではこれでは十分ではなく、テクスチャ自体はあまり役に立ちません。 テクスチャに必要なすべての処理を行うために、ゲームオブジェクトを作成します。ゲームオブジェクトには、これらのテクスチャが含まれます。



さあ、まず最初に。



ステップ1:エンティティ



エンティティはAndEngineクラスです。なぜ必要なのかについては長々と説明しませんが、 ViewGroupクラスの特定の類似物であるとだけ言います。 ゲームオブジェクトに必要になります。



静的オブジェクトと動的オブジェクトの2種類のオブジェクトがあります。 動的な回転と静的な回転が可能です。



ステップ2:静的オブジェクト



物事をより便利にするために、GameObjectクラスを作成します。



public abstract class GameObject extends Entity {



protected Sprite mSprite;



public GameObject(final int posX, final int posY, final TextureRegion region) {

mSprite = new Sprite(posX * GameObjectsMap.CELL_SIZE, posY

* GameObjectsMap.CELL_SIZE, region);

attachChild(mSprite);

}



protected Sprite getSprite() {

return mSprite;

}



public static enum Type {

lasergun, mirror, target

}



abstract int onLaser( int angle);



abstract void attachTo(Scene scene);



}




* This source code was highlighted with Source Code Highlighter .








onLaserメソッドに注目してください。このメソッドは、レーザーがゲームオブジェクトに当たる角度の値を取得します。 また、オブジェクトから何も反射されない場合は負の値を返し、反対の場合は反射の角度を返します。



ステップ3:動的オブジェクト



上記のクラスは、静的オブジェクトに適しています。 動的な場合は、少し拡張する必要があります。



public abstract class DynamicGameObject extends GameObject {



public static final int DEG_0 = 0;

public static final int DEG_45 = 1;

public static final int DEG_90 = 2;

public static final int DEG_135 = 3;

public static final int DEG_180 = 4;

public static final int DEG_225 = 5;

public static final int DEG_270 = 6;

public static final int DEG_315 = 7;



private static final float ANGLE = 45f;



private int mAngle;



public DynamicGameObject(final int posX, final int posY, final int angle,

final TextureRegion region) {

super(posX, posY, region);

setAngle(angle);

}



public int getAngle() {

return mAngle;

}



public void setAngle( int angle) {

this .mAngle = angle;

rotateSprite();

}



public void rotateLeft() {

mAngle--;

if (mAngle < DEG_0) {

mAngle = DEG_315;

}

rotateSprite();

}



public void rotateRigth() {

mAngle++;

if (mAngle > DEG_315) {

mAngle = DEG_0;

}

rotateSprite();

}



public float getRotationAngle() {

return ANGLE * mAngle;

}



protected void rotateSprite() {

mSprite.setRotation(getRotationAngle());

}



}




* This source code was highlighted with Source Code Highlighter .








これで、すばらしい成果の準備ができました。オブジェクトとそのスプライトを好きなように回転させることができます。 ただし、コードのパフォーマンスを確認するにはまだ長い道のりがあり、レーザーもありません。 レーザーには何が必要ですか? まず、使用するプリミティブを選択します。 明らかに、これは線になりますが、レーザーがオブジェクトから反射されることを考えると、さらに何かが必要です。



ステップ4:複雑なゲームオブジェクト



public class LaserLine extends Entity {



private static final float LINE_WIDTH = 3f;



LinkedList<Point> mPoints;

private final Point mStartPosition;

private int mAngle;



public LaserLine(Point startPosition, int angle) {

init();

mStartPosition = startPosition;

mPoints.add(mStartPosition);

mAngle = angle;

}



public void init() {

mPoints = new LinkedList<Point>();

}



public void clearPoints() {

mPoints.clear();

mPoints.add(mStartPosition);

}



public void addPoint(final int cellNumX, final int cellNumY) {

mPoints.add( new Point(cellNumX, cellNumY));

}



public void addPoint(Point point) {

mPoints.add( new Point(point));

}



public void buildLines() {

detachChildren();

Point previousPoint = null ;

for (Point point : mPoints) {

Ln.i(point.x + " " + point.y);

if (previousPoint != null ) {

attachChild(makeLine(previousPoint, point));

}

previousPoint = point;

}

Ln.i( "-------------" );

}



public final Line makeLine(final Point start, final Point end) {

final Line line = new Line(

(start.x + 0.5f) * GameObjectsMap.CELL_SIZE_X,

(start.y + 0.5f) * GameObjectsMap.CELL_SIZE_Y,

(end.x + 0.5f) * GameObjectsMap.CELL_SIZE_X,

(end.y + 0.5f) * GameObjectsMap.CELL_SIZE_Y);

line.setLineWidth(LINE_WIDTH);

line.setColor(1f, 0.1f, 0.1f, 0.75f);

return line;

}



public Point getStartPosition() {

return mStartPosition;

}



public void setAngle( int angle) {

mAngle = angle;

}



public int getAngle() {

return mAngle;

}

}




* This source code was highlighted with Source Code Highlighter .








ここには興味深いことがたくさんあります。 今後は、すべてのオブジェクトが1つの2次元配列に格納されると言います。 この事実は、CELL_SIZEフィールドの存在と、makeLineメソッドに0.5fを追加する必要性を説明し、セルの真ん中にあることを期待しています。 レーザーを構築するには、ポイントのリストが必要です。 各レーザーセグメントは、LaserLineに「接続」されます。 その結果、オブジェクトをシーンに追加すると、レーザーのすべてのセグメントが表示されます。



作業の結果を確認するために最後に行う必要があるのは、別の小さなクラスを作成することです。



public class LaserGun extends DynamicGameObject {



public LaserGun(final int posX, final int posY, final int angle,

final TextureRegion region) {

super(posX, posY, angle, region);

}



@Override

int onLaser( int angle) {

return -1;

}



@Override

void attachTo(Scene scene) {

scene.getChild(GameObjectsMap.GAME_OBJECTS_LAYER).attachChild(getSprite());

}



}




* This source code was highlighted with Source Code Highlighter .








レーザーは銃から反射されず、スプライトはゲームオブジェクトのレイヤーに表示されます。



ステップ5:オブジェクトを描く



ここで、すべてを表示できるようにするコードをStageActivityに追加します。

public Scene onLoadScene() {

this .mEngine.registerUpdateHandler( new FPSLogger());



final Scene scene = new Scene(NUMBER_OF_LAYERS);

scene.setBackground( new SpriteBackground( new Sprite(0, 0, mTextures

.getBackground())));

LaserLine line = new LaserLine( new Point(3, 3), 0);

line.addPoint( new Point(4, 4));

line.addPoint( new Point(5, 2));

line.buildLines();

scene.getChild(GameObjectsMap.LASER_LAYER).attachChild(line);

LaserGun gun = new LaserGun(3, 3, 4, mTextures.getLaserGun());

gun.attachTo(scene);

return scene;

}




* This source code was highlighted with Source Code Highlighter .






私のヒーローで、私はこの絵を見ました:





ここでコードを探しています。



今日は以上です。 3番目の部分を期待します。



いつものように、希望、建設的な提案、質問は受け入れられます。



PS Heroで私には知らない何らかの理由で、レーザーの厚さは常に1pxなので、怖がらないでください。

PPSコードでは、GameObjectsMapクラスが繰り返し言及されていますが、次の記事でそれについても恐れていません。 そしてここに彼女は



All Articles