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

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

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

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

Q&A

解決済

1回答

522閲覧

processing 動作済みの弾の初期化と、移動する自機のある時点の座標に向かって移動するコード

AaBb

総合スコア1

Processing

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

1グッド

0クリップ

投稿2023/02/07 07:17

編集2023/02/08 10:02

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • gameReset() に、弾が初期化前と同じ動きになるように初期化するコードを書きたい。
  • 自機の座標の取得を発射時のみにして、自機を追跡し続けるのを止めたい。

前提

・processing で弾幕を避けるゲームを作っています。
gameReset() は、ゲーム終了かリスタート時に動作させるもので、自機の初期化と動作するタイミングなどについては既に完成済みです。
弾の初期化が、うまくいかないのでアドバイスが欲しいです。

・自機の座標を取得して、弾を自機に向かって動かすコードは書けたのですが、自機を追跡し続けてしまう。
自機を動かしても最初に取得した座標に向かうコードについてアドバイスが欲しいです。

該当のソースコード

processing

1import java.util.List; 2import java.util.ArrayList; 3 4List<Unit> unit = new ArrayList<Unit>(); 5List<Unit> b = new ArrayList<Unit>(); 6 7PVector p, v; 8float rad; 9int m, n; 10 11void setup(){ 12 size( 800, 800 ); 13 14 p = new PVector( 0, 0 ); 15 v = new PVector( 0, 0 ); 16 17 unit.add( new User( 1, p, v, color( 255 ) ) ); 18 19 n = 0; 20 m = 0; 21 22} 23 24void draw(){ 25 background( 0 ); 26 translate( width / 2, height / 2 ); //原点を中央に配置 27 28 unit.get( 0 ).move(); //ユーザーを動かす 29 30 if( frameCount % 15 == 0 ){ //0.25秒毎に、弾を生成し連射 31 if( n <= 16 ){ 32 b.add( new Bullet( 2, new PVector( 600 * cos( radians( 22.5 * n ) ), 600 * sin( radians( 22.5 * n ) ) ), new PVector( 0, 0 ), color( 255 ) ) ); 33 n++; 34 } 35 } 36 for( n = 0; n < b.size(); n++ ){ 37 b.get( n ).move(); 38 } 39----------------------------------------------- 40class Bullet extends User{ //ウィンドウの中心を原点にした円周上に配置して、自機の座標に弾を撃つクラス 41 42 Unit u = unit.get( 0 ); //ユーザーのインスタンス呼び出し 43 44 float rad, x, y, r, dr; 45 46 Bullet( int id, PVector p, PVector v, color c ){ 47 super( id, p, v, c ); 48 } 49 50 void setRad( float rad ){ 51 this.rad = rad; 52 } 53 54 @Override 55 void setP( PVector p ){ 56 this.x = super.p.x; 57 this.y = super.p.y; 58 } 59 60 @Override 61 void setV( PVector v ){ 62 this.r = v.x; 63 this.dr = v.y; 64 } 65 66 @Override 67 void myShape(){ 68 fill( super.c ); 69 noStroke(); 70 71 pushMatrix(); 72 ellipse( this.r * cos( this.rad ) + this.x, this.r * sin( this.rad ) + this.y, 15, 15 ); 73 popMatrix(); 74 } 75 76 void Reset(){ 77 if( this.x <= -650 || this.x >= 650 || this.y <= -650 || this.y >= 650 ){ 78 super.id = 0; 79 } 80 if( super.id == 0 ){ 81 super.p.set( 600 * cos( radians( 22.5 * n ) ), 600 * sin( radians( 22.5 * n ) ) ); 82 super.v.set( 0, 0 ); 83 } 84 } 85 86 void update(){ 87 if( super.id == 2 ){ 88 this.setRad( atan2( u.getP().y - this.y, u.getP().x - this.x ) ); 89 this.setP( new PVector( 600 * cos( radians( 22.5 * n ) ), 600 * sin( radians( 22.5 * n ) ) ) ); 90 this.setV( new PVector( r, 10 ) ); 91 } 92 93 this.r += this.dr; 94 } 95 96 void move(){ 97 this.update(); 98 this.myShape(); 99 this.Reset(); 100 } 101 102} 103------------------------------------------------------- 104void gameReset(){ 105 unit.set( 0, new User( 1, p, v, color( 255 ) ) ); 106 //ここに弾の初期化コード 107}

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

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

・processing-4.0.1
・ほかのクラス(自機やゲーム終了やリスタートなど画面遷移、自機の操作等)は完成済み

TN8001👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

・自機の座標を取得して、弾を自機に向かって動かすコードは書けたのですが、自機を追跡し続けてしまう。

ここのことを言ってるんですよね?(提示コードの88行目)

Processing

1this.setRad( atan2( u.getP().y - this.y, u.getP().x - this.x ) );

UsergetPPVector?)もの状態を保持しているんでしょうから、追いかけるような動きになるでしょう。

自機を動かしても最初に取得した座標に向かうコードについてアドバイスが欲しいです。

Bullet生成した瞬間PVectorを覚えておくように変更すればいいんじゃないですかね?(不足コードがあるので確認できないが...)

Processing

1class Bullet extends User { 2 //Unit u = unit.get(0); 3 PVector u = unit.get(0).getP().copy(); 4 5 // 省略 6 7 void update() { 8 if ( super.id == 2 ) { 9 //this.setRad( atan2( u.getP().y - this.y, u.getP().x - this.x ) ); 10 this.setRad( atan2( u.y - this.y, u.x - this.x ) ); 11 // 省略 12 } 13 // 省略 14 } 15}

PVector#copy() / Reference / Processing.org

投稿2023/02/07 10:19

編集2023/02/07 10:28
TN8001

総合スコア9198

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

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

AaBb

2023/02/08 00:32

試したところ、考えてた通りの動作をするようになりました。 回答ありがとうございます!
TN8001

2023/02/08 01:02

> 試したところ、考えてた通りの動作をするようになりました。 回答に不明点や疑問があればお気軽にコメントください。 回答に特に疑問もなく問題が解決したのであれば、質問を「解決済」にしてください^^ [ヘルプ|質問を解決済みにしたい](https://teratail.com/help#resolve-question)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.53%

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

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

質問する

関連した質問