傾きセンサーを使用した2つのゲームは、ほぼ作り終えたので。
次はシューティングゲームを作ってみようと思います!
タイトルは
【ツインスペースヒーロー!!】
Andengineの「AnalogOnScreenControl」を2つ配置して
二つの機体を同時に操作するシューティングです。
今回はコントローラの配置します。
※ここで記載する内容は「AndEngineでつくるAndroid 2Dゲーム」の参考書の
プロジェクト構成を前提としています。
[java]
public class MainActivity extends MultiSceneActivity implements
SensorEventListener {
// 画面のサイズ。
private int CAMERA_WIDTH = 800;
private int CAMERA_HEIGHT = 480;
public static Camera camera;
public EngineOptions onCreateEngineOptions() {
this.camera = new Camera(0, 0, CAMERA_WIDTH, CAMERA_HEIGHT);
EngineOptions eo = new EngineOptions(true,
ScreenOrientation.LANDSCAPE_FIXED,
new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), camera);
// ふたつコントローラを使用するのでマルチタッチの設定をする。
eo.getTouchOptions().setNeedsMultiTouch(true);
}
}
public class MainScene extends KeyListenScene implements
ButtonSprite.OnClickListener {
private BitmapTextureAtlas mOnScreenControlTexture;
private ITextureRegion mOnScreenControlBaseTextureRegion;
private ITextureRegion mOnScreenControlKnobTextureRegion;
private AnimatedSprite mainLeftSprite;
private AnimatedSprite mainRightSprite;
@Override
public void init(){
// 背景設定
setBackground(new Background(convertRGB(0), convertRGB(0), convertRGB(0)));
// 左側のコントローラエリア作成
final Rectangle rect = new Rectangle(0, 0, 150, 480, getBaseActivity().getVertexBufferObjectManager());
attachChild(rect);
rect.setColor(convertRGB(50), convertRGB(50), convertRGB(50));
rect.setPosition(0, 0);
rect.setZIndex(controlAreaZIndex);
sortChildren();
// 右側のコントローラエリア作成
final Rectangle rect2 = new Rectangle(700, 0, 150, 480, getBaseActivity().getVertexBufferObjectManager());
attachChild(rect2);
rect2.setColor(convertRGB(50), convertRGB(50), convertRGB(50));
rect2.setPosition(650, 0);
rect2.setZIndex(controlAreaZIndex);
sortChildren();
// コントローラの画像登録
this.mOnScreenControlTexture = new BitmapTextureAtlas(getBaseActivity().getTextureManager(), 256, 128, TextureOptions.BILINEAR);
this.mOnScreenControlBaseTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mOnScreenControlTexture, getBaseActivity(), "onscreen_control_base.png", 0, 0);
this.mOnScreenControlKnobTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mOnScreenControlTexture, getBaseActivity(), "onscreen_control_knob.png", 128, 0);
this.mOnScreenControlTexture.load();
// コントローラ描画メソッド
drawAnalogControls();
}
// コントローラとコントローラの操作対象の機体を描画
private void drawAnalogControls(){
// 左の機体を描画
mainLeftSprite = getBaseActivity().getResourceUtil().getAnimatedSprite("main1.png", 1, 2);
mainLeftSprite.setZIndex(mainZIndex);
mainLeftSprite.setPosition(200, 450);
attachChild(mainLeftSprite);
// 左の機体操作用のハンドラー
final PhysicsHandler physicsHandler1 = new PhysicsHandler(mainLeftSprite);
mainLeftSprite.registerUpdateHandler(physicsHandler1);
// 右の機体を描画
mainRightSprite = getBaseActivity().getResourceUtil().getAnimatedSprite("main2.png",1,2);
mainRightSprite.setZIndex(mainZIndex);
mainRightSprite.setPosition(600, 450);
attachChild(mainRightSprite);
// 右の機体操作用のハンドラー
final PhysicsHandler physicsHandler2 = new PhysicsHandler(mainRightSprite);
mainRightSprite.registerUpdateHandler(physicsHandler2);
sortChildren();
// leftControl
final float x1 = 20;
final float y1 = getBaseActivity().getEngine().getCamera().getHeight() – this.mOnScreenControlBaseTextureRegion.getHeight() – 30;
final AnalogOnScreenControl leftControl = new AnalogOnScreenControl(x1, y1, MainActivity.camera, this.mOnScreenControlBaseTextureRegion, this.mOnScreenControlKnobTextureRegion, 0.1f, getBaseActivity().getVertexBufferObjectManager(), new AnalogOnScreenControl.IAnalogOnScreenControlListener() {
@Override
public void onControlChange(final BaseOnScreenControl pBaseOnScreenControl, final float pValueX, final float pValueY) {
// 機体の移動制限
System.out.println("mainLeftSprite:" + mainLeftSprite.getX() + "/" + mainLeftSprite.getY());
boolean backMove = false;
if(mainLeftSprite.getX() < 155) {
physicsHandler1.setVelocity(50, 0);
backMove = true;
}
if(645 < mainLeftSprite.getX() + mainLeftSprite.getWidth()){
physicsHandler1.setVelocity(-50, 0);
backMove = true;
}
if(mainLeftSprite.getY() < 5) {
physicsHandler1.setVelocity(0, 50);
backMove = true;
}
if(475 < mainLeftSprite.getY() + mainLeftSprite.getHeight()){
physicsHandler1.setVelocity(0, -50);
backMove = true;
}
// 機体の移動
if(!backMove){
physicsHandler1.setVelocity(pValueX * 100, pValueY * 100);
}
}
@Override
public void onControlClick(final AnalogOnScreenControl pAnalogOnScreenControl) {
/* Nothing. */
}
});
leftControl.getControlBase().setBlendFunction(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
leftControl.getControlBase().setAlpha(0.5f);
this.setChildScene(leftControl);
// rightControl
final float y2 = y1;
final float x2 = getBaseActivity().getEngine().getCamera().getWidth() – this.mOnScreenControlBaseTextureRegion.getWidth() – 20;
final AnalogOnScreenControl rightControl = new AnalogOnScreenControl(x2, y2, MainActivity.camera, this.mOnScreenControlBaseTextureRegion, this.mOnScreenControlKnobTextureRegion, 0.1f, getBaseActivity().getVertexBufferObjectManager(), new AnalogOnScreenControl.IAnalogOnScreenControlListener() {
@Override
public void onControlChange(final BaseOnScreenControl pBaseOnScreenControl, final float pValueX, final float pValueY) {
System.out.println("mainRightSprite:" + mainRightSprite.getX() + "/" + mainRightSprite.getY());
boolean backMove = false;
if(mainRightSprite.getX() < 155) {
physicsHandler2.setVelocity(50, 0);
backMove = true;
}
if(645 < mainRightSprite.getX() + mainRightSprite.getWidth()){
physicsHandler2.setVelocity(-50, 0);
backMove = true;
}
if(mainRightSprite.getY() < 5) {
physicsHandler2.setVelocity(0, 50);
backMove = true;
}
if(475 < mainRightSprite.getY() + mainRightSprite.getHeight()){
physicsHandler2.setVelocity(0, -50);
backMove = true;
}
if(!backMove){
physicsHandler2.setVelocity(pValueX * 100, pValueY * 100);
}
}
@Override
public void onControlClick(final AnalogOnScreenControl pAnalogOnScreenControl) {
/* Nothing. */
}
});
rightControl.getControlBase().setBlendFunction(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
rightControl.getControlBase().setAlpha(0.5f);
leftControl.setChildScene(rightControl);
}
private float convertRGB(int val){
return val / 255f;
}
}
[/java]
※重要な部分のみコード記載してますので、変数宣言とか一部抜けているかも知れませんがご了承。。
次回以降も随時シューティングゲームの途中経過を記載していきます!