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

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

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

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

Q&A

解決済

4回答

1419閲覧

Javaコードないの座標

Chandler_Bing

総合スコア673

Java

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

0グッド

0クリップ

投稿2019/01/07 19:10

以下の二つのコードから、宇宙船が宇宙を動くキーボードゲームを作成しています(途中)
二つ目のコードの真ん中付近にコード(yAsteroids[pos] = yAsteroids[pos] = -widthAsteroids[pos])
をマイナスにしている理由に、参考書には画面の一番上のY座標が0なのでマイナスにしないと惑星が上から流れてきているように見えないとあります。(この動作は確認しました。)この画面の上がY座標0は決まりなのですか。このコード内でどこがY座標0という指定はしていますか。(私は見つけられません)

動作中の状況画像を下に貼っておきます。

Java

1package keyboardgame; 2 3import java.awt.BorderLayout; 4 5import javax.swing.JFrame; 6 7/** 8 * フレームクラス 9 */ 10public class ARFrame extends JFrame { 11 12 private ARPanel panel = null; 13 14 /** 15 * ここからはじまります 16 */ 17 public static void main(String[] args) { 18 ARFrame mg01 = new ARFrame(); 19 } 20 21 /** 22 * コンストラクタ 23 */ 24 public ARFrame() { 25 26 // スーパークラスを呼び出す 27 super(); 28 29 // Xボタンが押されたら終了する 30 super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 31 // レイアウト設定 32 super.setLayout(new BorderLayout()); 33 34 // パネルを生成する 35 panel = new ARPanel(); 36 37 // フレームのコンテントペイントを置き換える 38 super.setContentPane(panel); 39 40 // フレームを表示 41 super.setVisible(true); 42 // サイズを最適化する 43 super.pack(); 44 45 // フォーカスを当てる 46 super.requestFocus(); 47 panel.requestFocus(); 48 49 } // end ARFrame 50 51} 52

Java

1package keyboardgame; 2 3import java.awt.Color; 4import java.awt.Dimension; 5import java.awt.Graphics; 6import java.awt.event.KeyAdapter; 7import java.awt.event.KeyEvent; 8import java.awt.image.BufferedImage; 9import java.io.InputStream; 10import java.util.TimerTask; 11 12import javax.imageio.ImageIO; 13import javax.swing.JOptionPane; 14import javax.swing.JPanel; 15 16/** 17 * パネルクラス 18 */ 19public class ARPanel extends JPanel { 20 21 /** キーアダプタ*/ 22 private MGKeyAdapter mgka = null; 23 24 /** キーを押している状態*/ 25 private boolean[] keyPressTbl = null; 26 27 /** 背景1位置 */ 28 private int yBackground1 = 0; 29 /** 背景2位置 */ 30 private int yBackground2 = 0; 31 32 /** 宇宙船位置*/ 33 private int x = 0; 34 private int y = 0; 35 36 /** 速度 */ 37 private int mx = 0; 38 39 /** 宇宙船の向き */ 40 private int muki = 0; 41 42 /** 小惑星位置 */ 43 private int[] xAsteroids = new int[100]; 44 private int[] yAsteroids = new int[100]; 45 46 /** 小惑星速度 */ 47 private int[] mxAsteroids = new int[100]; 48 private int[] myAsteroids = new int[100]; 49 50 /** 小惑星大きさ */ 51 private int[] widthAsteroids = new int[100]; 52 53 /** 背景1 */ 54 private BufferedImage imageBackground1 = null; 55 /** 背景2 */ 56 private BufferedImage imageBackground2 = null; 57 /** 宇宙船 */ 58 private BufferedImage[] imageShips = null; 59 /** 小惑星 */ 60 private BufferedImage imageAsteroid = null; 61 62 /** タイマー */ 63 private java.util.Timer timerThis = null; 64 /** 経過時間 */ 65 private int time = 0; 66 67 /** 68 * コンストラクタ 69 */ 70 public ARPanel() { 71 72 // スーパークラスを呼び出す 73 super(); 74 75 try { 76 77 // パネルサイズ 78 super.setPreferredSize(new Dimension(800, 800)); 79 // レイアウト設定 80 super.setLayout(null); 81 82 // キー押下状況一覧を生成 83 keyPressTbl = new boolean[256]; 84 85 // 背景1を読み込む(星) 86 InputStream isBackground1 = this.getClass().getResourceAsStream("imageBackground1.gif"); 87 imageBackground1 = ImageIO.read(isBackground1); 88 isBackground1.close(); 89 90 // 背景2を読み込む(止まっている小さい浮流物のようなもの) 91 InputStream isBackground2 = this.getClass().getResourceAsStream("imageBackground2.gif"); 92 imageBackground2 = ImageIO.read(isBackground2); 93 isBackground2.close(); 94 95 // 宇宙船を読み込む 96 imageShips = new BufferedImage[3]; 97       //下に貼った宇宙船の画像です 98 InputStream is0 = this.getClass().getResourceAsStream("imageShip0.gif"); 99 imageShips[0] = ImageIO.read(is0); 100 is0.close(); 101       //宇宙船が右に進んでる時の画像です 102 InputStream is1 = this.getClass().getResourceAsStream("imageShipR.gif"); 103 imageShips[1] = ImageIO.read(is1); 104 is1.close(); 105       //宇宙船が左に進んでる時の画像です 106 InputStream is2 = this.getClass().getResourceAsStream("imageShipL.gif"); 107 imageShips[2] = ImageIO.read(is2); 108 is1.close(); 109 110 // 小惑星を読み込む 111 InputStream isA = this.getClass().getResourceAsStream("imageAsteroid.gif"); 112 imageAsteroid = ImageIO.read(isA); 113 isA.close(); 114 115 // キーアダプタを生成 116 mgka = new MGKeyAdapter(); 117 // パネルにキーリスナーを追加する 118 this.addKeyListener(mgka); 119 120 // 初期化を処理 121 init(); 122 123 // タイマーを生成 124 timerThis = new java.util.Timer(); 125 126 // タイマーをスタート 127 timerThis.scheduleAtFixedRate(new TimerActionListener(), 1000l, 8l); 128 129 } catch (Exception ex) { 130 ex.printStackTrace(); 131 JOptionPane.showMessageDialog(this, "ERROR : " + ex.toString()); 132 } 133 134 } // end ARPanel 135 136 /** 137 * 初期化処理 138 */ 139 public void init() { 140 141 // 時間 142 time = 0; 143 144 // 位置 145 x = 384; 146 y = 640; 147 148 // 小惑星を初期化 149 for (int i = 0; i < 100; i++) { 150 yAsteroids[i] = -9999; 151 } 152 153 } // end init 154 155 /** 156 * 実行 157 */ 158 public void run() { 159 160 // 時間+1 161 time++; 162 163 // 背景1移動タイミング(黒) 164 if (time % 5 == 0) { 165 166 // 背景を進める(黒) 167 yBackground1++; 168 if (yBackground1 > 0) { 169 yBackground1 = -800; 170 } 171 172 } // end if 背景1移動タイミング 173 174 // 背景2移動タイミング(白) 175 if (time % 2 == 0) { 176 177 // 背景を進める(白) 178 yBackground2 = yBackground2 + 1; 179 if (yBackground2 > 0) { 180 yBackground2 = -800; 181 } 182 183 } // end if 背景2移動タイミング 184 185 // 宇宙船移動タイミング 186 if (time % 6 == 0) { 187 188 // 向きを初期化 189 muki = 0; 190 191 // 左の場合 192 if (isKeyCodePressed(KeyEvent.VK_LEFT)) { 193 // 左向きにする 194 muki = 2; 195 // 加速する 196 mx = mx - 1; 197 } 198 199 // 右の場合 200 if (isKeyCodePressed(KeyEvent.VK_RIGHT)) { 201 // 右向きにする 202 muki = 1; 203 // 加速する 204 mx = mx + 1; 205 } 206 207 } // end if 宇宙船移動タイミング 208 209 // 移動タイミング 210 if (time % 2 == 0) { 211 212 // 移動する 213 x = x + mx; 214 215 // 1番左に来た場合 216 if (x < 0) { 217 x = 0; 218 mx = 0; 219 220 // 1番右にきた場合 221 } else if (x > this.getWidth() - 32) { 222 x = this.getWidth() - 32; 223 mx = 0; 224 } 225 226 // 小惑星を作る? 227 if (Math.random() < 0.02) { 228 229 // 空いている小惑星を探す 230 int pos = -1; 231 for (int i = 0; i < 100; i++) { 232 if (yAsteroids[i] == -9999) { 233 pos = i; 234 break; 235 } 236 } 237 // 小惑星を初期化 238 widthAsteroids[pos] = (int) (Math.random() * 150) + 30; 239 xAsteroids[pos] = (int) (Math.random() * 800); 240 yAsteroids[pos] = yAsteroids[pos] = -widthAsteroids[pos];/*質問です*/ 241 mxAsteroids[pos] = 3 - (int) (Math.random() * 6); 242 myAsteroids[pos] = 5 + (int) (Math.random() * 5); 243 } // end if 小惑星を作る? 244 245 // 小惑星一覧分、ループ 246 for (int i = 0; i < 100; i++) { 247 // 小惑星が存在する? 248 if (yAsteroids[i] != -9999) { 249 // 移動する 250 xAsteroids[i] = xAsteroids[i] + mxAsteroids[i]; 251 yAsteroids[i] = yAsteroids[i] + myAsteroids[i]; 252 // 外に出たら 253 if (yAsteroids[i] > 800) { 254 // 小惑星削除 255 yAsteroids[i] = -9999; 256 } 257 } // 小惑星が存在する? 258 } // end for 小惑星一覧分、ループ 259 260 // 表示タイミング 261 } else { 262 263 // 再描画 264 repaint(); 265 266 } 267 268 } // end run 269 270 /** 271 * 描画メソッド 272 * <pre> 273 * ペイントする必要がある時にこのメソッドが呼び出されます 274 * </pre> 275 */ 276 public void paint(Graphics g) { 277 278 // 画面を塗りつぶす 279 g.setColor(Color.black); 280 g.fillRect(0, 0, 800, 800); 281 282 // 背景1を描画する 283 g.drawImage(imageBackground1, 0, yBackground1, 800, 800, this); 284 g.drawImage(imageBackground1, 0, yBackground1 + 800, 800, 800, this); 285 286 // 背景2を描画する 287 g.drawImage(imageBackground2, 0, yBackground2, 800, 800, this); 288 g.drawImage(imageBackground2, 0, yBackground2 + 800, 800, 800, this); 289 290 // 小惑星一覧分、ループ 291 for (int i = 0; i < 100; i++) { 292 // 小惑星が存在する? 293 if (yAsteroids[i] != -9999) { 294 // 小惑星を描画する 295 g.drawImage(imageAsteroid, xAsteroids[i], yAsteroids[i], widthAsteroids[i], widthAsteroids[i], this); 296 } // 小惑星が存在する? 297 } // end for 小惑星一覧分、ループ 298 299 // 宇宙船を描画する 300 g.drawImage(imageShips[muki], x, y, 32, 40, this); 301 302 } // end paint 303 304 /** 305 * キー押下中かどうかチェック 306 */ 307 public boolean isKeyCodePressed(int keyCode) { 308 309 return keyPressTbl[keyCode]; 310 311 } // end isKeyCodePressed 312 313 /** 314 * キーアダプタクラス 315 */ 316 private class MGKeyAdapter extends KeyAdapter { 317 318 /** 319 * キーを押した時に呼ばれます 320 */ 321 @Override 322 public void keyPressed(KeyEvent ke) { 323 int code = ke.getKeyCode(); 324 if (code < 256) { 325 keyPressTbl[code] = true; 326 } 327 } 328 329 /** 330 * キーを離した時に呼ばれます 331 */ 332 @Override 333 public void keyReleased(KeyEvent ke) { 334 int code = ke.getKeyCode(); 335 if (code < 256) { 336 keyPressTbl[code] = false; 337 } 338 } 339 340 } // MGKeyAdapter 341 342 /** 343 * タイマークラス 344 */ 345 private class TimerActionListener extends TimerTask { 346 347 /** 348 * 実行 349 */ 350 @Override 351 public void run() { 352 353 // 実行メソッドを呼び出し 354 ARPanel.this.run(); 355 356 } // end actionPerformed 357 358 } // end TimerActionListener 359 360}

イメージ説明

イメージ

イメージ説明

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

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

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

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

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

guest

回答4

0

いろいろとツッコみたい点は多いですが、初心者なので見逃します。
主に小惑星を配列にしているあたりに...

yAsteroids[pos] = yAsteroids[pos] = -widthAsteroids[pos];/質問です/

なぜ = の演算子が2つもあるのか理由を知りたいです。-widthAsteroids[pos];

x軸の様にランダムで初期化する場合は、このようにしてみてはいかがでしょうか?
yAsteroids[pos] = ( -widthAsteroids[pos] * 2 ) - (int) (Math.random() * 800);
*2はなんとなくなので気にしないで下さい。

投稿2019/01/08 01:02

stdio

総合スコア3307

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

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

guest

0

左上が原点(0,0)になるのでソースコード上では明記的に記載されていないと思います。

投稿2019/01/08 01:05

ronin

総合スコア89

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

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

guest

0

文言をよく理解しましょう。

** 画面の一番上のY座標が0**なのでマイナスにしないと惑星が上から流れてきているように見えない

太字にした箇所そのままの意味です。
コードで書いてあるわけではないので見つけられるはずもないです。
これは基本的な概念。画面枠左上隅がx:0 y:0です。
※Javaとかに限らずWebにおいても左上隅が0です

投稿2019/01/08 01:04

編集2019/01/08 01:04
m.ts10806

総合スコア80850

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

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

guest

0

ベストアンサー

Graphicsで左上の座標がx=0、y=0なのはデフォルト値だからです。
変更することは可能で、その場合translateメソッドを使用します。

Graphics API仕様:
https://docs.oracle.com/javase/jp/8/docs/api/java/awt/Graphics.html#translate-int-int-

投稿2019/01/08 01:02

take_3306

総合スコア242

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問