質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

3回答

1696閲覧

敵を順番に出現させたい

taiyokarasu

総合スコア27

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2017/02/01 23:26

編集2017/02/02 04:36
クラス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クラスのプログラムを載せてみます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2017/02/01 23:47

まず私たちにはこのコード内で使われているメソッドの中身がわからないので回答のしようがありません。
taiyokarasu

2017/02/02 00:16

コード内のメソッドって何ですか?
taiyokarasu

2017/02/02 00:20 編集

どういった情報をつけ加えればいいでしょうか 長すぎるとダメなのかと思い、省略して載せました どういうプログラムを載せると中身がわかるようになりますか?
guest

回答3

0

Enemy4.katasaが0以下ならという条件を付けくわえたらできました

投稿2017/02/02 06:19

taiyokarasu

総合スコア27

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

katasa<=0ならという条件をつけました。しかし、何故か二体の敵が同時に出てきてしまいます。

つまり、if(Enemy4.katasa<=0)が常に成立するということですかね?
であるならEnemy4.katasaの値がどのように変化するかを見返してみてください
常に<=0となるような値しか入らないのではないでしょうか

Enemy4.active=falseというプログラムにすると、エラーが起きてしまいます

そもそもEnemy4.activeはbooleanなのでしょうか?
Enemy4.activeの変数定義がどうなっているかわからないですが、出ているエラーメッセージをそのまま教えていただければ何が問題か回答が得られやすいと思います

投稿2017/02/02 01:19

takito

総合スコア3111

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

メソッドの中身がわからないので推測ですが、両方のifの条件を満たしているためではないですか?
回避するには2つ目の前にelseをつけるとか

投稿2017/02/02 00:36

swordone

総合スコア20649

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

taiyokarasu

2017/02/02 00:41

メソッドの中身とは、全部のプログラム文を載せればいいということですか?
swordone

2017/02/02 01:22

そもそも各変数やフィールド変数の実体もわからないですし、大文字始まりのせいでクラス名からのstaticメンバなのかと考えて、なおさら変数の意味がわからなかったりと、とにかく情報不足です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問