クラスObjectPool //敵の配列を確保し、配列の要素分インスタンスを作る enemy3 = new Enemy3[ENEMY3_MAX]; for(int i = 0; i < enemy3.length; i++) { enemy3[i] = new Enemy3(player); } クラスMyCanvas //敵出現間隔 if ((Level.level)==8&&(counter % (200 - 0) == 0)&&(Score.myscore >= 1050)) { ObjectPool.newEnemy4(1 + random.nextInt(1), 0); }
Enemy4はボスキャラを作成したクラスなのですが、何とか一体ずつ出現させるためにMyCanvasのプログラムにしました。
このEnemy4のクラスは、第二形態のボスでこのボスを倒すと、最後の形態のボスが出てくるという仕組みにしたいと思っています。
Enemy4.active==falseにするとエラーになりましたが、エラーを取って実行しても意味がありませんでした。何故か、ゲームを始めるとすぐにCameOverになってしまうのです。
package rol; import java.awt.Color; import java.awt.Graphics; /** *敵クラス<p> *移動処理、描画処理など */ public class Enemy4 extends GameObject { //生存時間(弾を撃つタイミングに使用) int counter = 0; //体力 static int katasa; //種類 int type; //あたり判定フラグ boolean ishit2 = false; //プレイヤーの位置を知っておくため、Playerインスタンスへの参照をを保持 Player player; //打ち始めフラグ boolean startshoot; int shootnum; double speed; int dx,dy; /** * コンストラクタ * @param プレイヤークラスのインスタンス(プレイヤーの位置を把握するため) */ Enemy4(Player iplayer) { //プレイヤーの位置を把握 player = iplayer; //初期化時はactiveでない active = false; } /** * インスタンスを有効にする。インスタンスの使い回しをしているので、 * 初期化処理もここで行う。 * @param ix 生成する位置(X座標) * @param iy 生成する位置(Y座標) */ public void activate(double ix, double iy) { x = ix; y = iy; type = (int)(Math.random());; active = true; //弾のインスタンスを有効にする katasa = 200; counter = 0; boolean ishit2 = false; shootnum = Level.getLevel(); startshoot = false; x=300; y=0; dx=0; dy=1; } /** * プレイヤーの弾と衝突したときの振る舞い */ public void hit() { //体力減らす katasa--; ishit2 = true; if (katasa < 0) { //得られる得点は敵の種類で変わる switch(type) { case 0: Score.addScore(120); break; default: } //スコアに加算 //爆発の生成 ObjectPool.newParticle(x, y, 45, 2); ObjectPool.newParticle(x, y, 135, 2); ObjectPool.newParticle(x, y, 225, 2); ObjectPool.newParticle(x, y, 315, 2); active = false; } } public void hit2() { //体力減らす katasa = katasa-5; ishit2 = true; if (katasa < 0) { //得られる得点は敵の種類で変わる switch(type) { case 0: Score.addScore(120); break; default: } //スコアに加算 //爆発の生成 ObjectPool.newParticle(x, y, 45, 2); ObjectPool.newParticle(x, y, 135, 2); ObjectPool.newParticle(x, y, 225, 2); ObjectPool.newParticle(x, y, 315, 2); active = false; } } /** * 動作を規定する。メインループ1周につき一回呼ばれる */ public void move() { //種類で分岐 switch(type) { case 0: move_enemy0(); break; default: } } /** * 敵その1の動作 */ void move_enemy0() { counter++; if (y == 250 && dx == 0) { dx = 1; dy = 0; } else if (x >= 350) { dx = -1; } else if (x <= 200) { dx = 1; } x += dx; y += dy; //一定間隔で弾を撃つ if ((counter%30)==0) { Bullet4.FireRound(x, y); } //画面外に出たら消去 } /** * 敵その2の動作 */ /** * 描画処理。 * 1ループで一回呼ばれる。 * @param g 描画先グラフィックハンドル */ public void draw(Graphics g) { if(katasa>=0){ //弾が当たっていたら色をオレンジに if (ishit2) { g.setColor(Color.red); //翼 前 g.drawLine((int)x, (int)y, (int)x-150, (int)y-150); g.drawLine((int)x, (int)y, (int)x+150, (int)y-150); //翼 g.drawLine((int)x-150, (int)y-150, (int)x-170, (int)y-200); g.drawLine((int)x+150, (int)y-150, (int)x+170, (int)y-200); g.drawLine((int)x-170, (int)y-200, (int)x-100, (int)y-180); g.drawLine((int)x+170, (int)y-200, (int)x+100, (int)y-180); //後ろの山 g.drawLine((int)x-100, (int)y-180, (int)x-60, (int)y-230); g.drawLine((int)x-60, (int)y-230, (int)x-30, (int)y-200); g.drawLine((int)x+100, (int)y-180, (int)x+60, (int)y-230); g.drawLine((int)x+60, (int)y-230, (int)x+30, (int)y-200); g.drawLine((int)x+30, (int)y-200, (int)x, (int)y-230); g.drawLine((int)x-30, (int)y-200, (int)x, (int)y-230); }else{ switch(type) { case 0: g.setColor(Color.orange); //翼 前 g.drawLine((int)x, (int)y, (int)x-150, (int)y-150); g.drawLine((int)x, (int)y, (int)x+150, (int)y-150); //翼 g.drawLine((int)x-150, (int)y-150, (int)x-170, (int)y-200); g.drawLine((int)x+150, (int)y-150, (int)x+170, (int)y-200); g.drawLine((int)x-170, (int)y-200, (int)x-100, (int)y-180); g.drawLine((int)x+170, (int)y-200, (int)x+100, (int)y-180); //後ろの山 g.drawLine((int)x-100, (int)y-180, (int)x-60, (int)y-230); g.drawLine((int)x-60, (int)y-230, (int)x-30, (int)y-200); g.drawLine((int)x+100, (int)y-180, (int)x+60, (int)y-230); g.drawLine((int)x+60, (int)y-230, (int)x+30, (int)y-200); g.drawLine((int)x+30, (int)y-200, (int)x, (int)y-230); g.drawLine((int)x-30, (int)y-200, (int)x, (int)y-230); g.setColor(Color.yellow); g.drawRect((int)x-50, (int)y-80, 20 ,10); g.drawRect((int)x+30, (int)y-80, 20 ,10); g.setColor(Color.white); g.drawLine((int)x-30, (int)y-200, (int)x-30, (int)y-150); g.drawLine((int)x-30, (int)y-170, (int)x-20, (int)y-170); g.drawLine((int)x-20, (int)y-170, (int)x-20, (int)y-130); g.drawOval((int)x-25, (int)y-130, 10 ,10); g.drawLine((int)x+60, (int)y-230, (int)x+60, (int)y-180); g.drawLine((int)x+60, (int)y-180, (int)x+20, (int)y-180); g.drawLine((int)x+20, (int)y-180, (int)x+20, (int)y-150); g.drawLine((int)x+20, (int)y-160, (int)x+50, (int)y-160); g.drawOval((int)x+50, (int)y-160, 10 ,10); g.drawLine((int)x, (int)y-230, (int)x, (int)y-140); g.drawLine((int)x, (int)y-140, (int)x+30, (int)y-140); g.drawLine((int)x+30, (int)y-140, (int)x+30, (int)y-120); g.drawLine((int)x-60, (int)y-230, (int)x-60, (int)y-180); g.drawRect((int)x-70, (int)y-180, 20 ,10); g.drawRect((int)x-10, (int)y-50, 20 ,10); g.drawLine((int)x-100, (int)y-180, (int)x-100, (int)y-120); g.drawLine((int)x-100, (int)y-150, (int)x-120, (int)y-150); g.drawRect((int)x-120, (int)y-155, 10 ,10); g.drawLine((int)x-100, (int)y-120, (int)x-80, (int)y-120); g.drawRect((int)x-80, (int)y-130, 10 ,20); g.drawLine((int)x+100, (int)y-180, (int)x+100, (int)y-150); g.drawLine((int)x+100, (int)y-150, (int)x+80, (int)y-150); g.drawLine((int)x+80, (int)y-150, (int)x+80, (int)y-130); g.drawRect((int)x+75, (int)y-130, 10 ,10); if(katasa<=100){ if(counter % 10 ==0){ g.setColor(Color.yellow); g.drawLine((int)x-30, (int)y-200, (int)x-30, (int)y-150); g.drawLine((int)x-30, (int)y-170, (int)x-20, (int)y-170); g.drawLine((int)x-20, (int)y-170, (int)x-20, (int)y-130); g.drawLine((int)x+60, (int)y-230, (int)x+60, (int)y-180); g.drawLine((int)x+60, (int)y-180, (int)x+20, (int)y-180); g.drawLine((int)x+20, (int)y-180, (int)x+20, (int)y-150); g.drawLine((int)x+20, (int)y-160, (int)x+50, (int)y-160); g.drawLine((int)x, (int)y-230, (int)x, (int)y-140); g.drawLine((int)x, (int)y-140, (int)x+30, (int)y-140); g.drawLine((int)x+30, (int)y-140, (int)x+30, (int)y-120); g.drawLine((int)x-60, (int)y-230, (int)x-60, (int)y-180); g.drawLine((int)x-100, (int)y-180, (int)x-100, (int)y-120); g.drawLine((int)x-100, (int)y-150, (int)x-120, (int)y-150); g.drawLine((int)x-100, (int)y-120, (int)x-80, (int)y-120); g.drawLine((int)x+100, (int)y-180, (int)x+100, (int)y-150); g.drawLine((int)x+100, (int)y-150, (int)x+80, (int)y-150); g.drawLine((int)x+80, (int)y-150, (int)x+80, (int)y-130); } if(counter % 15 ==0){ g.setColor(Color.cyan); g.fillOval((int)x-25, (int)y-130, 10 ,10); g.fillOval((int)x+50, (int)y-160, 10 ,10); } if(counter % 20 ==0){ g.setColor(Color.red); g.fillRect((int)x-70, (int)y-180, 20 ,10); g.fillRect((int)x-10, (int)y-50, 20 ,10); g.fillRect((int)x-120, (int)y-155, 10 ,10); g.fillRect((int)x-80, (int)y-130, 10 ,20); g.fillRect((int)x+75, (int)y-130, 10 ,10); } } break; default: } } } ishit2 = false; }
一応、Enemy4クラスのプログラムを載せてみます。
回答3件
あなたの回答
tips
プレビュー