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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

1回答

3793閲覧

タイトル、ゲーム画面、終わり画面

yusuke.

総合スコア66

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2016/08/02 02:09

いつもお世話になっております。
今回はゲームを作っているのですが、初めにタイトル画面を表示して、次にゲーム画面にかえてゲームをプレイします。ゲームオーバーになったときに、タイトル画面に戻すようにしたいのですが、どのようにするのが簡単でしょうか。
ひとつ考えたのが、ゲームオーバーになったときに、タイトル画面のファイルをrequireして、タイトル画面に戻すというものでしたが、これだと、ゲーム中の画面が残ったままになってしまいました。

これがタイトル画面ですクリックされることでゲーム画面に行くようにしています。

ruby

1#main.rb 2#!ruby -Ks 3require "./window.rb" 4require "./kuizu.rb" 5 6 7while true do 8window = Window.new 9window.drawBack 10window.gamestart 11window.refresh 12 13 14 while event = SDL::Event2.poll do 15 case event 16 when SDL::Event2::Quit 17 exit 18 when SDL::Event2::MouseButtonDown 19 x = event.x 20 y = event.y 21 if window.kuizuclicked?(x,y) 22 hajime 23 window.refresh 24 end 25 if window.zairyoclicked?(x,y) 26 require "./aaa.rb" 27 end 28 end 29 end 30 31end 32

これは、ゲーム画面のタイトルです。

ruby

1#aaa.rb 2#!ruby -Ks 3require "sdl" 4require "./window2.rb" 5require "./color" 6window = Window.new 7 8 window.drawBack 9 window.start 10 window.refresh 11while true do 12 while event = SDL::Event2.poll 13 case event 14 when SDL::Event2::Quit 15 exit 16 when SDL::Event2::KeyDown 17 if event.sym == SDL::Key::SPACE then 18 require "./zairyo.rb" 19 end 20 end 21 end 22 end 23 24

これがゲーム画面です。
gameOverで戻るようにしたいです。

ruby

1#!ruby -Ks 2require "./window2" 3require "./syujinko" 4require "./item" 5require "sdl" 6 7def hit?(syujinko,baikin) 8 diffx = syujinko.centerX - baikin.centerX 9 diffy = syujinko.centerY - baikin.centerY 10 if (diffx > -30) and (diffx < 50) and (diffy > -20) and (diffy < 50) 11 return true 12 else 13 return false 14 end 15end 16def clicked?(x,y,baikin) 17 diffx = x - baikin.centerX 18 diffy = y - baikin.centerY 19 if (diffx > -20) and (diffx < 20) and (diffy > -20) and (diffy < 20) 20 return true 21 else 22 return false 23 end 24end 25 26def gameOver(window,syujinko) 27 window.drawEndBack 28 syujinko.draw 29 window.refresh 30 sleep 5 31 exit 32 # require "./main.rb" #ここで、戻そうとしています 33end 34 35def checkScore 36 if @score <= 0 37 @score = 0 38 end 39 return @score 40end 41 42window = Window.new #(save_data.high_score) 43 44while true do 45 46 time = window.getTime 47 while event = SDL::Event2.poll do 48 case event 49 when SDL::Event2::Quit 50 exit 51 when SDL::Event2::MouseButtonDown 52 x = event.x 53 y = event.y 54 55 end 56 end 57 58 SDL::Key.scan 59 if SDL::Key.press?(SDL::Key::A) 60 syujinko.moveLeft 61 end 62 if SDL::Key.press?(SDL::Key::F) 63 syujinko.moveRight 64 end 65 66 67 if time < 0 68 gameOver(window,syujinko) 69 end 70##文が長いので繰り返しの部分を省略しました。

皆さんお忙しいとは思いますが、よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

Rubyがわからないので的外れでしたらすみません。

自分が簡単なゲームを作る際は、main関数で状態分けします。
例えば、
・タイトル画面
・メイン画面
・ゲームオーバー画面
・ゲームクリア画面
・コンフィグ画面

簡単なゲームならこれくらいでしょうか。
それぞれの画面をループで終了条件でまわしまくります。
ゲームオーバーの場合は、メイン画面が終了条件を満たした時(たとえばゲームオーバーの他にゲームクリアの場合もあるかと思います)にフラグ的なものを持たせてメイン画面終了後に分岐するようにする・・・といった手法です。

以下、簡単なプロットのようなものを記載してみます。

main関数(){ GAME_STATUS = gameTitle; /*デフォルトではtitle画面に行くように設定*/ while (ゲーム終了まで繰り返す){ swich(GAME_STATUS){ case gameTitle: /* タイトル画面の処理の呼び出し */ break; case gameMain: /* メイン画面の処理の呼び出し */ /* メイン画面終了後に分岐 */ if (ゲームクリアなら) GAME_STATUE = gameClear; if else(ゲームオーバーなら) GAME_STATUS = gameOver; end break; case gameClear: /* ゲームクリアの処理の呼び出し */ /* titele画面に戻る */ GAME_STATUS = title; case gameOver: /* ゲームオーバーの処理の呼び出し */ /* titele画面に戻る */ GAME_STATUS = title; break; case config: /* コンフィグ画面の呼び出し */ break; } }

雑ですみません。
上記でコメントアウトにしている 『/* ○○画面の呼び出し */』で載せて頂いたゲームタイトルやゲーム画面を呼び出せばよいのかなと思いました。
参考になれば幸いです。

追記

ご返信内容を読みまして追記させて頂きますね(すみません返信の返信だとコードの引用などができないようですので最初の返信に追記させて頂きました)

まず前提としましては、私の回答はあくまで参考の一つにして頂ければと思います。
私ならこう作る、以前はこう作った、という内容となっております。
私の回答で惑わせてしまったら本当に申し訳ないです。多少なりとも参考となればと思い記述させて頂きました。なのでご自身のやり方の方がいい!と思いましたらこの回答はスルーしてくださいね。

今ある大きく分けて3つあるファイルをまとめて、どれを表示していくかをつくるのをつくればいいということですか?

私ならそうするかなと思いました。
main関数に呼び出したい画面をすべてまとめておくメリットは、例えば追加したい画面や機能が増えた場合などにファイルを増やして同様に呼び出してやればよいからです。
今はゲームオーバーの話をされておりますが、ゲームクリアを追加したい、main画面中にタイトルに戻れる機能を追加したい、といったことにも対応できるかと思います。

よって、追記前のコードもどきは以下のような感じになるでしょうか。
(タイトル画面の「main.rb」とゲーム画面のタイトル「aaa.rb」の内容がよくわからなかったため、ファイル名を勝手に変更しております。ご注意ください)

case gameTitle:     /* タイトル画面の処理の呼び出し */     title.rbを呼ぶ     /* ← 今回のコードで追加部分 */     break; case gameMain:     /* メイン画面の処理の呼び出し */     main.rbを呼ぶ     /* ← 今回のコードで追加部分 */     /* メイン画面終了後に分岐 */     if (ゲームクリアなら)         GAME_STATUE = gameClear;     if else(ゲームオーバーなら)         GAME_STATUS = gameOver;     end     break;

このように書くと、次に進みたい画面を戻り値とするだけで分岐してくれるようになります。
(各画面ごとに1ファイル作るのがわかりやすいかと思ってそのように記載しております)

いかがでしょうか。伝わりましたでしょうか?わかりにくければ再度ご質問頂ければと思います。
元のファイルにだいぶ手を入れる必要があるかと思いますので、あくまで参考程度に考えて頂ければと思います。

投稿2016/08/02 03:07

編集2016/08/03 11:25
SASAHARA

総合スコア247

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

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

yusuke.

2016/08/03 05:25

回答ありがとう御座います では今ある大きく分けて3つあるファイルをまとめて、どれを表示していくかをつくるのをつくればいいということですか? あと、mainでゲームをスタートしますかのところをクリックするとすたーとするということもしているのですが、そんな感じで終わりの画面にもつけることはできないのでしょうか。
yusuke.

2016/08/03 12:22

詳しい解説ありがとうございます。 しばらく作ることができないので8日ぐらいにまた作るようになると思います。その時にわからないことがあれば教えていただこうかと思います。 大変参考になります。
yusuke.

2016/08/08 00:45

直し方はちょっと違うのですが、ゲームオーバーになったときと、クリアした時に、mainを呼び出すことで解決しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問