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

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

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

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

Q&A

1回答

2248閲覧

java衝突判定(再投稿)

tokucha

総合スコア8

Java

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

0グッド

0クリップ

投稿2016/10/28 02:15

javaで簡単なアプリケーションを作ろうと思っています。
上からものが落ちてきて、それをよけるといったものなのですが、衝突判定で躓いてしまっています。
上から落ちてくるものは
drawImageで設定した画像3枚、fillrectで設定した箱のようなもの3つです。
したでよけるものもdrawimageで設定し、keyeventでキー入力を受け付けています。

現在は避けるところまで進みましたが、衝突しても反応がない状況です。
いろいろなページを調べてみましたが、なかなかうまくはいきませんでした。

どなたかお詳しい方、回答お願いします。

package

1 2import javax.swing.*; 3import java.awt.*; 4import java.awt.event.KeyEvent; 5import java.awt.event.KeyListener; 6 7class MyPanel extends JPanel implements KeyListener 8 9{ 10 int x = 390, y = 700, dir = 0, num = 0; 11/*赤箱赤箱*/ 12 int REx1=130,REx2=170,REx3=130,REx4=170; 13 int REy1= 20,REy2= 20,REy3= 60,REy4= 60; 14 int REwidth=40,REheight=40; 15/*青箱青箱*/ 16 int BLx1=380,BLx2=420,BLx3=380,BLx4=420; 17 int BLy1= 20,BLy2= 20,BLy3= 60,BLy4= 60; 18 int BLwidth=40,BLheight=40; 19/*緑箱緑箱*/ 20 int GRx1=630,GRx2=670,GRx3=630,GRx4=670; 21 int GRy1 =20,GRy2 =20,GRy3 =60,GRy4 =60; 22 int GRwidth = 40,GRheight = 40; 23/*猫111*/ 24 int cat1x1=130,cat1x2=170,cat1x3=130,cat1x4=170; 25 int cat1y1= 20,cat1y2= 20,cat1y3= 60,cat1y4= 60; 26 int cat1width=40,cat1height=40; 27/*猫222*/ 28 int cat2x1=380,cat2x2=420,cat2x3=380,cat2x4=420; 29 int cat2y1= 20,cat2y2= 20,cat2y3= 60,cat2y4= 60; 30 int cat2width=40,cat2height=40; 31/*てふてふ*/ 32 int tefux1=630,tefux2=670,tefux3=630,tefux4=670; 33 int tefuy1= 20,tefuy2= 20,tefuy3= 60,tefuy4= 60; 34 int tefuwidth=40,tefuheight=40; 35 36 public MyPanel() { 37 setBackground(Color.BLACK); 38 39 Thread th = new RefreshThread(this); 40 th.start(); 41public void paintComponent(Graphics g) { 42 super.paintComponent(g); 43 44 Image cat1 = getToolkit().getImage("I:\\tetris05^こ\\pic\\100-100.jpg"); 45 Image cat2 = getToolkit().getImage("I:\\tetris05^こ\\pic\\100-100-2.jpg"); 46 Image tefutefu = getToolkit().getImage("I:\\tetris05^こ\\pic\\100-100-3.jpg"); 47 Image kkkkkkkk = getToolkit().getImage("I:\\tetris05^こ\\1.JPG"); // �� 48 Image roooooad = getToolkit().getImage("I:\\tetris05^こ\\miti.png"); 49 50 51 g.drawImage(roooooad, 0, 0, this); 52 g.drawImage(cat1, cat1x1, cat1y1, this); 53 g.drawImage(cat2, cat2x1, cat2y1, this); 54 g.drawImage(tefutefu, tefuwidth, tefuheight, this); 55 g.setColor(Color.RED); 56 g.fillRect(REx1, REy1, REwidth, REheight); 57 g.setColor(Color.BLUE); 58 g.fillRect(BLx1, BLy1, BLwidth, BLheight); 59 g.setColor(Color.GREEN); 60 g.fillRect(GRx1, GRy1, GRwidth, GRheight); 61 g.drawImagekkkkkkkk x, y, this); 62 } 63 64 65 public void keyPressed(KeyEvent e) { 66 switch (e.getKeyCode()) { 67 case KeyEvent.VK_RIGHT: 68 x = x + 280; 69 dir = 1; 70 break; 71 case KeyEvent.VK_LEFT: 72 x = x - 280; 73 dir = 3; 74 break; 75 } 76 if (x > 670) { 77 x = 670; 78 } 79 if (x < 110) { 80 x = 110; 81 } 82 num ^= 1; 83 repaint(); 84 85 } 86 87 88 public void keyReleased(KeyEvent e) { 89 } 90 91 public void keyTyped(KeyEvent e) { 92 } 93 94 95 96public class MovingBox extends JFrame { 97 public MovingBox() { 98 setBounds(100, 50, 800, 850); 99 setTitle("Moving Box"); 100 getContentPane().add(new MyPanel()); 101 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 102 } 103} 104 105 public void main(String args[]) { 106 JFrame f = new MovingBox(); 107 f.setVisible(true); 108 } 109} 110 111 112package target; 113 114 115スレッド 116 117public class RefreshThread extends Thread { 118 MyPanel p; 119 public RefreshThread(MyPanel p) { 120 this.p = p; 121 } 122 123 public void run() { 124 while(true) { 125 p.REy1 = p.REy1 + 15; 126 p.BLy1= p.BLy1 + 30; 127 p.GRy1 = p.GRy1 + 45; 128 p.cat1y1 = p.cat1y1 + 30; 129 p.cat2y1 = p.cat2y1 + 30; 130 p.tefuy1 = p.tefuy1 + 90; 131 132 try { 133 Thread.sleep(50); // 134 } catch(Exception e) { 135 } 136 p.repaint(); 137 } 138 } 139} 140 setFocusable(true); 141 addKeyListener(this); 142 143 } 144] 145コード

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

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

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

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

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

guest

回答1

0

質問の意図を、衝突処理を書く位置が分からない、と取りました。

タイマーで処理をぐるぐる回しつつ、パネルを動かしているのが、
RefreshThreadなので、この中で、落ちる処理(座標に加減算)してた後、
各座標の重複で衝突と判定すればよさそうです。

ただ、処理するにはもうちょっと、座標やパネルをクラスに
束ねたりして処理しやすくしたほうがいいかもです。

投稿2016/10/28 02:44

編集2016/10/28 02:46
akio221

総合スコア716

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

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

akio221

2016/10/28 02:56

また、衝突後に反発したり、動かせないような処理をするのであれば、 実座標1つしか保持せずに加減算するとちょっと不便です。 現座標と、移動予定座標の2座標をもっておき、 現座標から、タイマーで  ・ 移動予定座標(動く予想の位置)を出し、  ・ そこで衝突が発生するかを計算し  ・ 衝突が発生するのであれば現座標は衝突後の座標を与える    発生しなければ移動予定座標に動かす といった具合でしょうか。
tokucha

2016/10/28 14:31

プログラミング初心者中の初心者なので、お話がなかなか理解できないのですが、 移動予定とは上から落ちはじめのx,y座標と下で当たるであろうx,y座標の二箇所でしょうか? また判定はif文でもbooleanでも、できますでしょうか?
akio221

2016/10/28 21:03

その通りです。 つまりイメージに与える座標値でそのまま計算せず、いったん別変数で計算したほうがよろしいかと。 判定は普通にif文でよいかと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問