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

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

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

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

Q&A

解決済

1回答

1397閲覧

processngでのゲーム作りに関して

plarex

総合スコア12

Processing

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

0グッド

0クリップ

投稿2018/05/04 06:02

ゲーム画面の切り替えに関して

processingで弾幕ゲームを作成しています。
質問① 弾と自機、レーザーとボスの当たり判定に関して、当たったと識別する条件は書けたのですが、その後、ゲームが停止して、GAMEOVERとGAMECLEARの画面に切り替えるコードの書き方が分かりません。

質問② ゲームスタート画面の表示について、左クリックでゲーム画面に切り替えるコードの書き方が分かりません

該当のソースコード

processing

1Bullet bullet; 2private Boss boss = new Boss(160, 150); 3private ArrayList<Bullet> danmaku = new ArrayList<Bullet>(); 4 5void setup() { 6 size(320, 480); 7 8 frameRate(30); 9 10 noCursor(); // clear mouse cursor 11 12 bullet = new Bullet(width/2, height/2, 10, 0, 0 ); 13} 14// ship class 15class ship { 16 private int sx, sy; 17 ship(int x, int y) { 18 sx = x; 19 sy = y; 20 } 21 void update() { 22 sx = x; 23 sy = y; 24 stroke(255, 255, 255); 25 noFill(); 26 triangle(x, y -7, x - 10, y + 7, x + 10, y + 7); 27 28 if (mousePressed) { 29 line(x, y - 7, x, 0); 30 if (abs(sx -boss.tx) < (boss.bw /2)) 31 boss.hit(); 32 } 33 } 34 void hit(){ 35 int ship.hp = 5; 36 ship.hp -= 1; 37 if(ship.hp == 0){ 38 fill( 255, 0, 0 ); 39 textSize( 30 ); 40 text( "GAME OVER", width/2, height/2 ); 41 //Enterを押してリトライできるコードを書きたい 42 43 44 45} 46 } 47} 48class Boss { 49 private int tx, ty; 50 private int dx, dy; 51 private int bw = 20; 52 private int bh = 10; 53 private long routine = 0; 54 55 Boss(int x, int y) { 56 tx = x; 57 ty = y; 58 dx = 1; 59 dy = -5; 60 } 61 void move() { 62 tx += dx; 63 ty += dy; 64 if (tx < 0 || tx > width) { 65 dx*= -1; 66 } 67 if (ty < 0 || ty > height) { 68 dy*= -1; 69 } 70 stroke(255,204,0); 71 rect(tx - bw/2, ty + bh/2 , bw, bh); 72} 73 void doShinking() { 74 routine++; 75 if (routine % 10 == 0) { 76 move(); 77 } 78 if (routine % 30 == 0) { 79 danmaku.addAll(this.shot()); 80 println("#shot!!" +routine + ":" + tx + "," + ty); 81 } 82 } 83  void hit(){ 84 int boss.hp = 8; 85 if(boss.hp == 0){ 86 /ここにボスが消えて、ゲームクリアの画面を出すコードを書きたい 87 88 89 ArrayList<Bullet> shot() { 90 ArrayList<Bullet> danmaku = new ArrayList(); 91 for (int i = 0; i < 360; i+= 10) { 92 double rad = radians(i); 93 danmaku.add(new Bullet(this.tx, this.ty, 10, Math.cos(rad), Math.sin(rad))); 94 } 95 return danmaku; 96 } 97} 98// Bullet class 99 100class Bullet { 101 102 private double tx, ty; 103 private final double tr; 104 private double dx, dy; 105 private boolean is_alive = true; 106 Bullet(double x, double y, double r, double temp_dx, double temp_dy ) { 107 tx = x; 108 ty = y; 109 tr = r; 110 dx = temp_dx; 111 dy = temp_dy; 112 } 113 boolean isAlive() { 114 return is_alive; 115 } 116 void update() { 117 tx += dx; 118 ty += dy; 119 //area check 120 if (Math.min(tx, ty) < 0) { 121 is_alive = false; 122 //println("#" + tx + "," + ty); 123 return ; 124 } 125 if (tx > width || ty > height) { 126 is_alive = false; 127 return ; 128 } 129 // hit check 130 if (dist(tx, ty, ship.sx, ship.sy) < tr/2) { 131 ship.hit(); 132 133 return true; 134 135 136 stroke(255, 0, 0); 137 138 ellipse((float)tx, (float)ty, (float)tr, (float)tr); 139 } 140 } 141 void draw() { 142 background(0); // clear 143 144 ship(mouseX, mouseY); 145 boss.doShinking(); 146 ship.hit(); 147 148 for (int i = danmaku.size() -1; i >= 0; i--) { 149 Bullet b = (Bullet)danmaku.get(i); 150 if (!b.isAlive()) { 151 danmaku.remove(i); 152 continue; 153 } 154 b.update(); 155 } 156 } 157

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

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

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

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

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

guest

回答1

0

ベストアンサー

基本的な考え方は前回の質問Bulletクラスと同じです。

  1. ゲームスタート
  2. ゲームクリア
  3. ゲームオーバー

というゲームの進行状態(シーンとステージ)という概念が出てきたため、
各シーンの状態を表すGameSceneとゲームのステージの状態(GameStage)を管理するクラスを作成します。
BossクラスとShipクラスはGameStageクラスに属します。

/ここにボスが消えて、ゲームクリアの画面を出すコードを書きたい

コメント欄記載の部分には直接画面表示のコードを書かない方が良いです。
プログラム内のデータと表示処理は分けた方が、表示条件を追加した時に苦労しないです。

1,ゲームのシーンを定義します。
質問文の要件としてあるのはスタート、(プレイ)、ゲームクリア、ゲームオーバーです。
括弧内のプレイは質問文にはないですが、隠れていた要件です。

Java

1enum GameScene { 2 START,PLAY,CLEAR,OVER; 3} 4private GameScene scene = GameScene.START;

enum変数:sceneで各シーン遷移を管理します。

void draw()関数内にてsceneの値を判断して、表示処理を分岐させてください。(※この部分は後述します)

2,次にBossクラスについて
2-1,Bossクラスに生存状態を返す関数を作成します。

Java

1 boolean isAlive() { 2 return hp != 0; 3 }

2-2,Bossクラスのprivate long routine = 0;の下行に以下の内容を追加します。

Java

1private int hp = 8;

2-3,BossクラスのhitメソッドはBosshpを減らすだけにします。
※hitではなく、被ダメージなので、damageという命名の方が適切かもしれません。
命名に関しては質問者様のわかり易さを優先させてくださいな。
2-4, 2-1~2-3に関してShipクラスにもBossと同じ事が適用できます。共通の親クラスを定義し継承するのも一つの手かと。

3,GameStageクラスについて
3-1,ソースコードの先頭行で宣言していた、ボスクラスの変数:bossGameStageクラスに移動します。あとShipクラスも移動したほうがいいですが、難しそうでしたらそのままで。

Java

1private Boss boss = new Boss(160, 150);

3-2,update関数を定義します。draw()関数より呼び出します。
update関数内で、boss.doShinking();を呼び出します。
update関数内でbossis_alive()shipクラスのis_alive()if文で判定して、GameScenescene変数を更新します。

※ゲームオーバーやゲームクリア時の表示として既に発射されていた弾幕をどう扱うかの問題があります。

3-3,draw関数にて、について以下の判断を行います。

変数:sceneの値クリック判定行うこと
START-ゲームスタート画面表示。
STARTmousePressedsceneをPLAYに
PLAY-GameStageクラスのupdateを呼び出す。
OVER-ゲームオーバー画面を表示。
OVERmousePressedsceneをSTARTに
CLEAR-ゲームクリア画面を表示。
CLEARmousePressedsceneをSTARTに

コード行数が増えて処理が複雑になるとコード管理ができなくなる恐れがあるため、
あまりゲームの仕様を増やさないほうがよいかもしれません。
一度ゲームのステージの進行状態を整理して、メモに書き出してみると条件判定の漏れがなくなります。
例えば、追加要件として道中に雑魚MOBを増やした時に、ボスはまだ表示されてないが、その扱いをどう判断するのか。などなど。

最後に質問文のソースコードはコンパイルエラーがないソースコードを載せてくださいな。


追記コードを見て気になった点。
Bulletクラスのupdateメソッドのship.hit();を行った後に、Bulletの生存フラグをFalseにしないと、次のループで2重判定されてしまいます。
今よくよく考えてみたら、BossクラスやShipクラスと同様にhp値を保持し、HP1として1として設定し、減算するほうがシンプルな気がしてきました。

Java

1class GameObject { 2 protected int x; 3 protected int y; 4 protected int dx; 5 protected int dy; 6 protected int hp; 7 GameObject(int x,int y){ 8 this(x,y,1,1,1); 9 } 10 GameObject(int x,int y, int dx,int dy, int hp){ 11 this.x = x; 12 this.y = y; 13 this.dx = dx; 14 this.dy = dy; 15 this.hp = hp; 16 } 17 public boolean isAlive() { 18 return this.hp != 0; 19 } 20}

GameObjectクラスをBossクラス,Ship,クラスBullet,クラスは継承し、コンストラクタ内でsuper()で呼び出す。

投稿2018/05/04 08:34

編集2018/05/04 21:44
umyu

総合スコア5846

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問