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

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

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

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

Java

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

VirtualBox

VirtualBoxは、現在米オラクル社が開発している、 x86仮想化ソフトウェア・パッケージの一つです。

Q&A

1回答

2235閲覧

Java シューティングゲームで複数個の弾を発射する方法

URO

総合スコア2

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

Java

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

VirtualBox

VirtualBoxは、現在米オラクル社が開発している、 x86仮想化ソフトウェア・パッケージの一つです。

0グッド

1クリップ

投稿2021/11/23 15:39

引用テキスト### 前提・実現したいこと

Javaでシューティングゲームを作成しています。
マウスをクリックすると弾が発射されます。
敵のうち、一体だけは弾が3発当たらないと倒せなくなっています。

弾を5発ずつ発射できるようにしたいのですが、1発しか表示されません。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

java

1ソースコード 2 3(中略) 4 // 自機の弾の初期設定 5 m=5; 6 k=0; 7 jiki_tama_x=new int[m]; 8 jiki_tama_y=new int[m]; 9 jiki_tama_flg=new int[m]; 10 for(int j=0;j<m;j++){ 11 jiki_tama_x[j] = jiki_tama_y[j] = -100; 12 jiki_tama_flg[j] = 0; 13 } 14 15(中略) 16 /* MouseListener に関連するメソッド */ 17 public void mouseClicked(MouseEvent e) {//マウスがクリックされたら自機の弾をチェック 18 19 if (jiki_tama_flg[k]==0) { 20 jiki_tama_x[k] = jiki_x + jiki_w/2; 21 jiki_tama_y[k] = 400; 22 jiki_tama_flg[k] = 1; 23 24 } 25 2627 (中略) 28 29 30 /* ActionListener に関連するメソッド */ 31 public void actionPerformed(ActionEvent e) { 32 Dimension d = getSize(); 33 if (e.getSource()==timer) { 34 // 敵機を水平方向に動かす 35 for (int i=0; i<n; i++) { 36 teki_x[i] += teki_u[i]; 37 if (teki_x[i]<0 || teki_x[i]>(d.width-teki_w)) teki_u[i] = -teki_u[i]; 38 } 39 40 41 // 自機の弾を動かす 42 43 if (jiki_tama_flg[k]==1) { 44 jiki_tama_y[k] -= 10; 45 46 for(int i=0;i<(n-1);i++){//全ての敵機(1回で倒せる)について判定していく 47 if(teki_alive[i]==1&& 48 teki_x[i]<jiki_tama_x[k]&&teki_x[i]+teki_w>jiki_tama_x[k]&& 49 teki_y[i]<jiki_tama_y[k]&&teki_y[i]+teki_h>jiki_tama_y[k]){ 50 51 teki_alive[i]=0;//敵の生存状態を破壊(0)にする 52 jiki_tama_flg[k] = 0;//次の弾が打てるように待機中(0)にする 53 } 54 } 55 //3回で倒す敵の判定 56 if(teki_alive[12]==3||teki_alive[12]==2||teki_alive[12]==1&& 57 teki_x[12]<jiki_tama_x[k]&&teki_x[12]+teki_w>jiki_tama_x[k]&& 58 teki_y[12]<jiki_tama_y[k]&&teki_y[12]+teki_h>jiki_tama_y[k]){ 59 60 teki_alive[12]-=1;//敵の生存状態を一つ減らす 61 jiki_tama_flg[k] = 0;//次の弾が打てるように待機中(0)にする 62 63 } 64 65 k+=1; 66 67 68 if(k>=5){ 69 k=0; 70 } 71 if (jiki_tama_y[k]<0) jiki_tama_flg[k] = 0; 72 } 73 74 75 (中略) 76 77 78 } 79 80 /* 画面描画に関連するメソッド */ 81 public void paintComponent(Graphics g) { 82 super.paintComponent(g); 83 84 (中略) 85 86 // 自機の弾の描画 87 88 if (jiki_tama_flg[k]==1) { 89 g.setColor(Color.yellow); 90 g.fillOval(jiki_tama_x[k], jiki_tama_y[k], 5, 10); 91 } 92 93 (中略) 94 95 } 96} 97} 98

試したこと

弾の描画の部分を

for(int l=0;l<m;l++){
g.setColor(Color.yellow);
g.fillOval(jiki_tama_x[l], jiki_tama_y[l], 5, 10);
}

としてみましたがうまく出来ませんでした。
複数の弾を描画する方法について教えていただきたいです。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

jimbe

2021/11/23 17:37

まさか、全てを含む 1 クラスで作っているのでしょうか。 だとしたら、まずクラス分けを覚えられた方が良いかと思います。 Jiki クラス、Teki クラス、Tama クラス等に分け、それぞれに x,y や w,h、alive, flag 等の属性を入れ、その上でそれぞれの動きや衝突判定のメソッドを加えていくと、もう少し見通し良くなると思います。
URO

2021/11/29 14:10

ありがとうございます。クラス分けを実践してみます。
guest

回答1

0

とりあえず自機の移動(A,Dキー)と弾発射だけしてみました。
参考に・・・なるかどうか分かりません。
敵機は入れるとまた大きくなりすぎるので、やめました。

java

1package teratail_java.q370706; 2 3import java.awt.*; 4import java.awt.event.*; 5import java.util.ArrayList; 6import java.util.Iterator; 7import java.util.List; 8 9import javax.swing.JFrame; 10import javax.swing.JPanel; 11import javax.swing.Timer; 12 13public class Q370706 extends JFrame { 14 public static void main(String[] args) { 15 new Q370706().setVisible(true); 16 } 17 Q370706() { 18 super("Q370706"); 19 setDefaultCloseOperation(EXIT_ON_CLOSE); 20 21 GamePanel panel = new GamePanel(); 22 add(panel); 23 pack(); 24 25 panel.start(); 26 } 27} 28 29class GamePanel extends JPanel { 30 public static final int WIDTH = 300; 31 public static final int HEIGHT = 300; 32 33 private Jiki jiki; 34 private Controller controller; 35 36 private List<Tama> tamaList = new ArrayList<Tama>(); 37 GamePanel() { 38 super(null); 39 setPreferredSize(new Dimension(WIDTH,HEIGHT)); 40 setMinimumSize(getPreferredSize()); 41 setFocusable(true); 42 setBackground(Color.BLACK); 43 44 jiki = new Jiki(this, (WIDTH-Jiki.WIDTH)/2, HEIGHT-50); 45 46 controller = new Controller(); 47 addMouseListener(controller); 48 addKeyListener(controller); 49 } 50 51 void start() { 52 new Timer(100, new ActionListener() { 53 public void actionPerformed(ActionEvent evt) { 54 int dx = controller.getDeltaX(); 55 jiki.setDeltaX(dx); 56 jiki.move(); 57 if(intersect(jiki)) { //外に出そうなら戻す 58 jiki.setDeltaX(-dx); 59 jiki.move(); 60 } 61 if(controller.fire) { 62 jiki.fire(); 63 controller.fire = false; 64 } 65 synchronized (tamaList) { 66 for(Iterator<Tama> ite=tamaList.iterator(); ite.hasNext(); ) { 67 Tama tama = ite.next(); 68 tama.move(); 69 if(!contains(tama)) ite.remove(); 70 } 71 } 72 repaint(); 73 } 74 }).start(); 75 } 76 //一部でもパネルの中 77 boolean contains(GameObject obj) { 78 return 0 <= obj.x+obj.w && obj.x < WIDTH && 79 0 <= obj.y+obj.h && obj.y < HEIGHT; 80 } 81 //一部(以上)パネルの外 82 boolean intersect(GameObject obj) { 83 return obj.x < 0 || WIDTH < obj.x+obj.w || 84 obj.y < 0 || HEIGHT < obj.y+obj.h; 85 } 86 87 int countTama(IFF iff) { 88 int count = 0; 89 for(Tama tama : tamaList) if(tama.iff == iff) count++; 90 return count; 91 } 92 void add(Tama tama) { 93 tamaList.add(tama); 94 } 95 void remove(Tama tama) { 96 tamaList.remove(tama); 97 } 98 99 @Override 100 public void paintComponent(Graphics g) { 101 super.paintComponent(g); 102 103 Graphics2D g2 = (Graphics2D)g; 104 jiki.draw(g2); 105 synchronized (tamaList) { 106 for(Tama tama : tamaList) tama.draw(g2); 107 } 108 } 109 110 class Controller extends MouseAdapter implements KeyListener { 111 private static final int LEFT_KEY = KeyEvent.VK_A; 112 private static final int RIGHT_KEY = KeyEvent.VK_D; 113 private static final int DELTA = 10; 114 115 private boolean left, right; 116 private boolean fire; 117 118 void setLeft(boolean left) { this.left = left; } 119 void setRight(boolean right) { this.right = right; } 120 void setFire(boolean fire) { this.fire = fire; } 121 122 int getDeltaX() { 123 return left == right ? 0 : right ? DELTA : -DELTA; 124 } 125 126 @Override 127 public void mouseClicked(MouseEvent e) { 128 setFire(true); 129 } 130 131 @Override 132 public void keyTyped(KeyEvent e) {} //ignore 133 @Override 134 public void keyReleased(KeyEvent e) { 135 if(e.getKeyCode() == LEFT_KEY) setLeft(false); 136 if(e.getKeyCode() == RIGHT_KEY) setRight(false); 137 } 138 @Override 139 public void keyPressed(KeyEvent e) { 140 if(e.getKeyCode() == LEFT_KEY) setLeft(true); 141 if(e.getKeyCode() == RIGHT_KEY) setRight(true); 142 } 143 } 144 145 enum IFF { 146 A, B; 147 } 148 149 abstract class GameObject { 150 protected GamePanel world; 151 protected int x, y; //左上座標 152 protected int w, h; //幅, 高さ 153 protected int dx, dy; //移動距離 154 protected IFF iff; //敵味方識別 155 156 GameObject(GamePanel world, IFF iff, int x, int y, int w, int h) { 157 this.world = world; 158 this.iff = iff; 159 this.x = x; 160 this.y = y; 161 this.w = w; 162 this.h = h; 163 } 164 165 void move() { 166 x += dx; 167 y += dy; 168 } 169 170 abstract void draw(Graphics2D g); 171 } 172 173 abstract class GameTarget extends GameObject { 174 GameTarget(GamePanel world, IFF iff, int x, int y, int w, int h) { 175 super(world, iff, x, y, w, h); 176 } 177 178 void fire() { 179 Tama tama = createTama(world.countTama(iff)); 180 if(tama != null) world.add(tama); 181 } 182 183 abstract Tama createTama(int count); 184 } 185 186 class Jiki extends GameTarget { 187 public static final int WIDTH = 20; 188 public static final int HEIGHT = 20; 189 private static final int TAMA_MAX = 5; 190 191 private int nPoints = 3; 192 private int[] xPoints = new int[nPoints]; 193 private int[] yPoints = new int[nPoints]; 194 195 Jiki(GamePanel world, int x, int y) { 196 super(world, IFF.A, x, y, WIDTH, HEIGHT); 197 setPolygon(); 198 } 199 200 void setDeltaX(int dx) { 201 this.dx = dx; 202 } 203 204 void setPolygon() { 205 xPoints[0] = x+10; 206 yPoints[0] = y; 207 xPoints[1] = x; 208 yPoints[1] = y+20; 209 xPoints[2] = x+20; 210 yPoints[2] = y+20; 211 } 212 213 @Override 214 Tama createTama(int count) { 215 if(count >= TAMA_MAX) return null; 216 return new Tama(world, iff, x+(WIDTH-Tama.WIDTH)/2, y-Tama.HEIGHT, -10); 217 } 218 @Override 219 void draw(Graphics2D g) { 220 g.setColor(Color.GREEN); 221 setPolygon(); 222 g.fillPolygon(xPoints, yPoints, nPoints); 223 } 224 } 225 226 //class Teki extends GameTarget { 227 //} 228 229 class Tama extends GameObject { 230 public static final int WIDTH = 5; 231 public static final int HEIGHT = 10; 232 233 Tama(GamePanel world, IFF iff, int x, int y, int dy) { 234 super(world, iff, x, y, WIDTH, HEIGHT); 235 this.dy = dy; 236 } 237 238 @Override 239 void draw(Graphics2D g) { 240 g.setColor(Color.YELLOW); 241 g.fillOval(x, y, w, h); 242 } 243 } 244}

投稿2021/11/24 05:26

編集2021/11/24 07:59
jimbe

総合スコア12646

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問