この絵は三つのタイルしか持っていませんが、簡単な走行アニメーションには十分です。今回のゲームでは、プレイヤーは自動的に右方向へ走ります。プレイヤーはジャンプ機能を操作します。
public ITiledTextureRegion player_region;
player_region = BitmapTextureAtlasTextureRegionFactory.createTiledFromAsset(gameTextureAtlas, activity, "player.png", 3, 1);
assets/gfx/game ディレクトリ内にプレイヤー画像を配置するのを忘れないでください。 ご覧の通り、読み込んだプレイヤーの画像は3列と1行の構成になっています。
package com.matimdev.object; import org.andengine.engine.camera.Camera; import org.andengine.entity.sprite.AnimatedSprite; import org.andengine.extension.physics.box2d.PhysicsWorld; import org.andengine.opengl.vbo.VertexBufferObjectManager; import com.matimdev.manager.ResourcesManager; /** * @author Mateusz Mysliwiec * @author www.matim-dev.com * @version 1.0 */ public abstract class Player extends AnimatedSprite { // --------------------------------------------- // CONSTRUCTOR // --------------------------------------------- public Player(float pX, float pY, VertexBufferObjectManager vbo, Camera camera, PhysicsWorld physicsWorld) { super(pX, pY, ResourcesManager.getInstance().player_region, vbo); } }
いくつか抽象メソッドを作成するので、このクラスを抽象クラスにします。
前述のように、コンストラクタを少し編集しています。テクスチャ領域として、前に作成したresources managerのテクスチャ領域を使用しています。 camera やPhysics Worldのような、いくつかの新しいパラメータも必要です。
// --------------------------------------------- // VARIABLES // --------------------------------------------- private Body body;
public abstract void onDie();
private boolean canRun = false;
private void createPhysics(final Camera camera, PhysicsWorld physicsWorld) { body = PhysicsFactory.createBoxBody(physicsWorld, this, BodyType.DynamicBody, PhysicsFactory.createFixtureDef(0, 0, 0)); body.setUserData("player"); body.setFixedRotation(true); physicsWorld.registerPhysicsConnector(new PhysicsConnector(this, body, true, false) { @Override public void onUpdate(float pSecondsElapsed) { super.onUpdate(pSecondsElapsed); camera.onUpdate(0.1f); if (getY() <= 0) { onDie(); } if (canRun) { body.setLinearVelocity(new Vector2(5, body.getLinearVelocity().y)); } } }); }
public Player(float pX, float pY, VertexBufferObjectManager vbo, Camera camera, PhysicsWorld physicsWorld) { super(pX, pY, ResourcesManager.getInstance().player_region, vbo); createPhysics(camera, physicsWorld); camera.setChaseEntity(this); }
public void setRunning() { canRun = true; final long[] PLAYER_ANIMATE = new long[] { 100, 100, 100 }; animate(PLAYER_ANIMATE, 0, 2, true); }
public void jump() { body.setLinearVelocity(new Vector2(body.getLinearVelocity().x, 12)); }単純にY軸方向になんらかのlinear velocityを設定してプレイヤーをジャンプさせます。
player.java
ファイルをダウンロード |
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) { if (pSceneTouchEvent.isActionDown()) { } return false; }
setOnSceneTouchListener(this);
private static final Object TAG_ENTITY_ATTRIBUTE_TYPE_VALUE_PLAYER = "player"; private Player player;
else if (type.equals(TAG_ENTITY_ATTRIBUTE_TYPE_VALUE_PLAYER)) { player = new Player(x, y, vbom, camera, physicsWorld) { @Override public void onDie() { // TODO Latter we will handle it. } }; levelObject = player; }
<entity x="60" y="140" type="player"/>
private boolean firstTouch = false;
public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) { if (pSceneTouchEvent.isActionDown()) { if (!firstTouch) { player.setRunning(); firstTouch = true; } else { player.jump(); } } return false; }firstTouchフラグがfalseかどうかを確認し、falseだった場合はプレイヤーを走らせてflag をtrueに変更します。 フラグがtrueの場合は、スクリーンをタッチする度にプレイヤーをジャンプさせます。
camera.setChaseEntity(null);
これがないと、カメラがプレイヤーの位置を追いかけたままになってしまうので、メニューシーンへ戻った後に画面が真っ黒になってしまいます。
この記事はこれで完了です。ゲームコードを実行するとプレイヤーが表示され、初回のタッチ後にプレイヤーが走り始めます。
以降はタッチする度にジャンプします。
注意: 現時点では、最初に地面に降り立った後、プレイヤーは何度も空中ジャンプができてしまいます。
これは、contact listenerについて紹介する次の記事にて修正します。
次の記事では、コインの収集、プレイヤーの死亡、カメラ領域の制限についても実装します。
前の記事 | 次の記事 |