前回の記事を見直したら、ソース記述しただけで
特に説明を記載してませんでした。。
すみません。
攻撃実装
今回は2機のミサイルと、ミサイルの移動を実装します。
■MainScene
[java]
@Override
public void init(){
・・・省略・・・
weponMainLeftSprite();
weponMainRightSprite();
registerUpdateHandler(timerHandler);
}
// ※2
TimerHandler timerHandler = new TimerHandler(1 / 60f, true, new ITimerCallback() {
public void onTimePassed(TimerHandler pTimerHandler) {
List<Rectangle> removeLeftWepon = new ArrayList<Rectangle>();
for(Rectangle rect : weponLeftList){
if(rect.getY() < -10){
removeLeftWepon.add(rect);
rect.detachSelf();
rect.dispose();
}else {
rect.setPosition(rect.getX(), rect.getY() – 3);
}
}
weponLeftList.removeAll(removeLeftWepon);
List<Rectangle> removeRightWepon = new ArrayList<Rectangle>();
for(Rectangle rect : weponRightList){
if(rect.getY() < -10){
removeRightWepon.add(rect);
rect.detachSelf();
rect.dispose();
}else {
rect.setPosition(rect.getX(), rect.getY() – 3);
}
}
weponRightList.removeAll(removeRightWepon);
}
});
// ※1
private void weponMainLeftSprite(){
mainLeftSprite.registerEntityModifier(new SequenceEntityModifier(
new DelayModifier(0.5f, new IEntityModifier.IEntityModifierListener() {
@Override
public void onModifierFinished(
IModifier<IEntity> pModifier, IEntity pItem) {
final Rectangle rect = new Rectangle(mainLeftSprite.getX() + mainLeftSprite.getWidth(), mainLeftSprite.getY(), 5, 5, getBaseActivity().getVertexBufferObjectManager());
attachChild(rect);
rect.setColor(convertRGB(200), convertRGB(200), convertRGB(200));
rect.setPosition(mainLeftSprite.getX() + mainLeftSprite.getWidth() / 2, mainLeftSprite.getY());
rect.setZIndex(10);
weponLeftList.add(rect);
weponMainLeftSprite();
}
@Override
public void onModifierStarted(IModifier<IEntity> pModifier,
IEntity pItem) {
}
})));
}
private void weponMainRightSprite(){
mainRightSprite.registerEntityModifier(new SequenceEntityModifier(
new DelayModifier(0.5f, new IEntityModifier.IEntityModifierListener() {
@Override
public void onModifierFinished(
IModifier<IEntity> pModifier, IEntity pItem) {
final Rectangle rect = new Rectangle(mainRightSprite.getX() + mainRightSprite.getWidth(), mainRightSprite.getY(), 5, 5, getBaseActivity().getVertexBufferObjectManager());
attachChild(rect);
rect.setColor(convertRGB(200), convertRGB(200), convertRGB(200));
rect.setPosition(mainRightSprite.getX() + mainRightSprite.getWidth() / 2, mainRightSprite.getY());
rect.setZIndex(10);
weponRightList.add(rect);
weponMainRightSprite();
}
@Override
public void onModifierStarted(IModifier<IEntity> pModifier,
IEntity pItem) {
}
})));
}
private float convertRGB(int val){
return val / 255f;
}
[/java]
■説明!!
※1
initメソッドからweponMainLeftSprite / weponMainRightSpriteを呼び出します。
weponMainLeftSpriteメソッドで、
・mainLeftSprite.registerEntityModifier(Spriteへの変更処理を設定します。)
・SequenceEntityModifier(指定した変更処理を順番に処理するように設定します。)
・DelayModifier(0.5f, new IEntityModifier.IEntityModifierListener(0.5秒たってからメソッド内の処理をするように設定します。)
// 5dp四方の画像を描画します。
final Rectangle rect = new Rectangle(mainLeftSprite.getX() + mainLeftSprite.getWidth(), mainLeftSprite.getY(), 5, 5, getBaseActivity().getVertexBufferObjectManager());
attachChild(rect);
// 色を指定
rect.setColor(convertRGB(200), convertRGB(200), convertRGB(200));
// ポジションの指定をします。
// 【mainLeftSprite.getX() + mainLeftSprite.getWidth() / 2】でSpriteのX座標の中央値を指定します。
rect.setPosition(mainLeftSprite.getX() + mainLeftSprite.getWidth() / 2, mainLeftSprite.getY());
rect.setZIndex(10);
// 機体のミサイルをリストで保持します。(ミサイルの画像を移動するのに使用します。)
weponLeftList.add(rect);
// 再帰的に呼び出して常に0.5秒事にミサイルを発射するようにする。
weponMainLeftSprite();
※2
initメソッドからtimerHandlerをregisterUpdateHandlerにセットして毎秒60回(1 / 60f)呼び出すようにします。
ここのメソッドで敵(未実装)の移動やミサイルの移動、あたり判定を行う予定です。
[java]
// 削除用のリストを用意(for文で回している最中に要素を削除するとエラーとなるので削除対象を保持する)
List<Rectangle> removeLeftWepon = new ArrayList<Rectangle>();
// 左機のミサイルを移動する。画面から外れたミサイルは削除する。
for(Rectangle rect : weponLeftList){
// 画面上部から-10のところまでミサイルがきたら不要なので、削除用リストに保持
if(rect.getY() < -10){
removeLeftWepon.add(rect);
// 画像をクリア
rect.detachSelf();
rect.dispose();
}else {
// 画像を移動する。上方向に-3の速度で移動
rect.setPosition(rect.getX(), rect.getY() – 3);
}
}
// 削除対象をリストから除去
weponLeftList.removeAll(removeLeftWepon);
[/java]
■上記の処理をすると2機からミサイルが発射されます!
こんな感じ
次回は自動で発射されるミサイルの一時停止と必殺ボタンを実装したいと思います。