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

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

ただいまの
回答率

90.54%

  • Java

    15532questions

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

  • Eclipse

    1878questions

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

敵を順番に出現させたい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 574

taiyokarasu

score 19

クラス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クラスのプログラムを載せてみます。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2017/02/02 08:47

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

    キャンセル

  • taiyokarasu

    2017/02/02 09:16

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

    キャンセル

  • taiyokarasu

    2017/02/02 09:17 編集

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

    キャンセル

  • 退会済みユーザー

    2017/02/02 13:53

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 3

checkベストアンサー

0

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/02 09:41

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

    キャンセル

  • 2017/02/02 10:22

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Java

    15532questions

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

  • Eclipse

    1878questions

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