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

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

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

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

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

1回答

2937閲覧

シューティングゲームで、当たり判定を実装したい

wotuyu

総合スコア2

Java

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

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2021/07/28 02:22

編集2021/07/28 02:30

processingのjavaを使用して、シューティングゲームを制作しています。
自機の操作、敵の出現、弾の発射まではできた状態です。
ここから、自分が発射した弾に敵が当たった時に敵と弾が消滅するような処理を加えたいです。
色々調べてみたり、試行錯誤はしてみたのですが、どこに入れればよいのか、また具体的にどのような処理を行えば良いのかがわからず、苦戦しています。よろしくお願い致します。

ENEMY enemy[]; HIKOU hikou; HAIKEI haikei[]; ArrayList<SHOT> shotList = new ArrayList<SHOT>(); PImage png; int N = 100; int n = 5; void setup() { size(300, 600); frameRate(30); rectMode(CENTER); noCursor(); png = loadImage("hikou.png"); png = loadImage("enemy.png"); hikou = new HIKOU(); haikei = new HAIKEI[N]; for (int i = 0; i < N; i++) { haikei[i] = new HAIKEI(); } enemy = new ENEMY[n]; for (int i = 0; i < n; i++) { enemy[i] = new ENEMY(); } } void draw() { background(0); for (int i = 0; i < N; i++) { haikei[i].draw(); } for (int i = 0; i < n; i++) { enemy[i].draw(); } for (int i=shotList.size ()-1; i>=0; i--) { SHOT t = shotList.get(i); if (t.isAlive()) { t.move(); t.display(); } else { shotList.remove(i); } } hikou.move(mouseX, mouseY); hikou.display(); PImage hikoupng = loadImage("hikou.png"); image(hikoupng, mouseX - 15, mouseY - 32); } void mousePressed() { shotList.add(new SHOT(hikou.x, hikou.y)); } class HIKOU { float x, y; float size; HIKOU() { size = 10; } void move(float _x, float _y) { x = _x; y = _y; } void display() { } } class SHOT { float x; float y; float size; float speed; SHOT(float _x, float _y) { x = _x; y = _y; size = 6; speed = 15; } void move() { y -= speed; } void display() { stroke(0); fill(255, 0, 0); rect(x, y, size, size); } boolean isAlive() { if (x+size/2<0 || width<x-size/2 || y+size/2<0 || height<y-size/2) { return false; } return true; } } class HAIKEI { float y; float x; float vy = 10; float len; HAIKEI() { init(); y = random(-height, height); } void init() { y = random(-2*height, -1); x = random(0, width); vy = random(10, 18); len = random(15, 25); } void draw() { stroke(200);//color line(x, y, x, y+len); update(); } void update() { y += vy; if (height < y+len) { init(); } } } class ENEMY { float y; float x; float vy = 5; float len; ENEMY() { init(); y = random(-2 * height, -height); } void init() { y = random(-20); x = random(20, width - 20); len = random(20, 35); } void draw() { PImage enemypng = loadImage("enemy.png"); image(enemypng, x, y); update(); } void update() { y += vy; if (height + 40 < y+len) { init(); } } }

HIKOU
ENEMY

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

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

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

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

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

AbeTakashi

2021/07/28 02:58 編集

「色々調べてみたり、試行錯誤はしてみた」の結果を質問文に反映した方がいいでしょう。まずは調べた結果を元にしてコードを少しでも組み込んでみてはどうでしょう(正しく動かなくてもよく、やろうとしてることを示すのが大事)。オブジェクトの衝突判定に関する情報はネット上にいっぱいあると思います。現状だと作業依頼に近い感じで、アドバイスするにしてもとっかかりがない感じです。 あと、ソースコードのインデントが効いてないので、現状だと回答者の方がソースコードを読む気にならないと思います。こちらも合わせて修正された方が良いと思います。
wotuyu

2021/07/28 03:05

ご意見ありがとうございます。 おっしゃる通りです。もう一度一から調べ直して、自己解決できるよう努力してみます。
AbeTakashi

2021/07/28 03:23

自己解決までしなくても、まずは回答者がアドバイスできるところまででいいと思いますよ。調べた内容、そしてそれをソースコード内に組み込む方法を自分なりに考えて、それを質問文内で表現すれば何かしらの回答は来ると思います。
wotuyu

2021/07/28 03:28

ご返信ありがとうございます。 了解です。もう少し考えて、質問し直したいと思います。 ご迷惑おかけしました。
thkana

2021/07/28 23:24

質問のテンプレートに「試したこと」とあるのは、決して「ボク頑張りました」のアピールのためではなく、 「こういうことを試したら」「こういう結果が得られた」 という情報が解決に役立つことがあるからです。 「調べた」「試行錯誤した」だけではなく、 何を調べたのか、それについてどう考えたのか 何を試行錯誤したのか、その時なにが起こったか を書いてください。
wotuyu

2021/07/29 02:07

ご返信ありがとうございます。 了解です。考えがまとまりましたら、修正したいと思います。
guest

回答1

0

ベストアンサー

そもそも「当たる」とはプログラム上ではどういう現象というか状態のことでしょう。
また、「敵と弾が消滅する」とはどうなることでしょう。

そこを整理せずにいきなりプログラムをいじっても多分成果は得られません。まずは、日本語で説明してみるとどうなりますか


プログラムって、結局コンピュータにあなたのやりたいことを伝えるための命令書だから、コンピュータに何をやらせるかがちゃんとわかっていないとプログラムにならない。コンピュータに何をやらせるかがわからないと、どんなにプログラム言語に精通した人であってもやはりプログラムは組めない。

真面目に考えるなら、SHOTで描く円とENEMYで描く敵の不透明な部分が少しでも重なるなら「当たり」。ENEMYの中心と弾の円の中心との関係を考えれば求まるけど、ちょっと面倒(まぁ、ほぼ一次関数なんで難しくはない)。

私だったら、多少の正確さを犠牲にして、ENEMYの占める範囲を、ENEMYの中心を中心とする直径40の円ということに「してしまう」。そうすると、ENEMYの中心と弾の中心との距離が23より大きければ当たっていない、23以下なら当たっている、という「ことになる」。

「消す」について言えば、今のプログラムでも画面の外に出た敵や弾を「消して」いるのだからそれと何らかわらないと思うけど...ここまで製作したのなら、きっとできると思いますけれどどうかしら。

投稿2021/07/28 23:20

編集2021/07/29 13:39
thkana

総合スコア7629

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

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

wotuyu

2021/07/29 02:04

ご意見ありがとうございます。 今回、「当たる」と「消滅する」いう表現を使わせて頂きました。おっしゃられる通り、抽象的すぎたと反省しております。 自分の中での「こういう方法でやりたい」をもう少し具体的に説明致します。 【当たる】 随時発射された弾の座標を受け取り、敵の当たり判定の範囲に入った時に、正の値を返す。 if{}&&{}のような条件式を使用するところまでは理解しています。しかし、どのようにして弾の座標と自機の座標を組み込むのかが理解できていません。 【消滅する】 先程の「当たる」で返ってきた値を毎秒判別し、①画面で見えなくなる②その後、ゲームに干渉しなくなる 状態を「消滅する」と表現致しました。 間違えているところがありましたら、申し訳ありません。
wotuyu

2021/07/29 23:29

ご返信ありがとうございます。 教えて頂いた内容で、もう少し考えてみようと思います。 また躓いた時に、より具体的な質問として再びあげさせて頂きます。 不鮮明な質問にお付き合い頂き、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問