Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

ゲームのメインループはなにで実装すべきですか?

ちょっとしたゲームを作ってみたいと考えています。
一定時間ごとにゲーム内のオブジェクトが動いたりさせるためにメインループとなるものを作ろうと考えているのですが、どれがいいかというかどう違うのかがよくわからなかったので質問させてください。

swingのJFrameにオブジェクトを描画させたりしたい場合、
1.extends Threadかimplements Runnableのクラスのrunメソッドの中にwhileの無限ループを書いて、1フレームごとにThread.speepを挟む。
2.implements ActionListenerのクラスのactionPerformedをswingのTimerで一定時間ごとに呼び出す。
この2つのうちどちらがいいのでしょうか?
メリットやデメリットについて教えてください。

あと、サーバープログラムを作ってゲーム終了後そこにランキングを登録したいと思っているのですが、そういうことをするには事前にサーバープログラムを立ち上げたコンピュータのIPアドレスを入手しておくしかないでしょうか?

5

回答

94802

閲覧

5件の回答

評価

0

なんでメインスレッドにメインループを書くというのが出
て来ないんだ?
「メインループ」って一体何を表してるんだ?
描画を受け持つスレッドの意味なら、それはメインループ
ではない。

2つ目の質問については、そもそも「サーバー」の概念を
理解していれば、そういう質問自体が出ない。
警察やコンビニの場所を知らずに、そこへ行くことはでき
ない。

評価

0

回答ありがとうございます。

説明が足りなかったようですいません。
私が言っているメインループとは、1フレームごとに特定のオブジェクトの位置を変更してJFrameへの再描画命令を出すものを考えています。

Thread.sleepでそのメインループのスレッドを1フレームごとに一定時間止めるか、それともTimerに頼んで定期的に呼び出してもらう形にすべきかを迷ってまして。
そもそもその2つの方法に書き方や呼び出し方以外にどのような違いがあるのかすらあまりよくわかっていません。

2つ目の質問の話ですが、IPアドレスを使って接続する方法については以前人工無能付きのチャットを作ってみた経験もあるので知っているのですが、URLのドメインからIPアドレスを特定できたり自身のIPはlocalhostで代用できるみたいにサーバープログラムを立ち上げるパソコンのIPをホスト名か何かから特定できたら、クライアントプログラムを立ち上げるときにいちいちIPアドレスを入力してなくてもすでにプログラム内で定義できていていいと思ったもので。

現状の私の知識では、私が作るサーバープログラムと言うのは一般的に言うサーバーとは違うかもしれません。
現状JavaでSocketなんかを使ってサーバー用のプログラムを作り、それを私のパソコンで起動し続けることを考えています。

そもそもこの自作のゲームとランキングシステムが完成して公表することになったとして、全世界あるいは日本限定のようなグローバルIPが必要になるような環境で公開する予定は今のところありません。
現状とあるローカルネットワーク内で決められた期間の間だけ機能させることを目的に考えています。

評価

0

>メインループ

メインループというか定期処理のことですね。

定期処理の目的が画面更新でかつ1回の処理時間が充分短
いならTimerを使うのが便利です。Timerのハンドラーは
EDT(イベントディスパッチスレッド)上で起動されますの
で、swing/awt関連処理をハンドラー上に直接記述できま
す。

同じことはmainスレッドや自前のスレッドでループによっ
ても実現できますがswing/awt関連の大抵の処理はEDT以外
のスレッド上では実行禁止なのでSwingUtilitiesクラスの
invokeLaterやinvokeAndWaitといったメソッドを介して
EDT上で実行させる必要があります。

では画面更新をするのにループによる方式は使わないかと
いうとそうでもありません。例えば1回の定期処理に時間
がかか場合はループを使うときもあります。今回の場合は
おそらく該当しないので詳細は省略します。

ちなみにこういったものは普通メインループとは呼ばず、
最初に記したように「定期処理」とか「一定時間ごとの画
面更新」などというと思います。メインループという用語
だとどちらかといえばEDT上のイベントディスパッチルー
プのことを思い浮かべてしまうんですね。用語に違和感が
あると話が伝わりにくくなりがちですのでなるべく一般的
な用語を把握して使うように心がけたほうがよいでしょ
う。

>サーバープログラムを立ち上げたコンピュータのIPアド
レス

サーバーのIPはクライアントプログラムにとって(固定だ
ったりLANアドレスから決まるのではない限り)もちろん必
要です。しかし毎回ユーザが入力するというのは使いにく
いので大抵は設定ファイルのようなものに書いておくと思
います。設定ファイルはクライアント側で変更の必要がな
いなら配布するjarに含めておけばよいし変更可能とした
いならjarとは別ファイルに分けることになるでしょう。
運用次第です。

評価

0

一般的にメインループといえば、全体を司るループのこと
だ。
イベントドリブン型ならイベントを待ってディスパッチ、ま
た待ちに入るのを繰り返すループ。先の人の回答通りだ。
描画は重要な要素ではあるが、全体ではない。

用語ってのは前提になるものなので、一般的にどう使われて
いるか、自分なりの解釈になっていないかを意識する方がい
い。
今回のように最初から分かればいいが、何となく違和感があ
りながら、あるいは全く違和感ないままに話が進んで、後に
なって全然違うことを言っていたのが分かったがもう時間が
ない、なんてことが往々にしてある。業務の世界でも。

評価

0

どこかでゲームの一番大きなループ(1フレームごとに処理して画面変更を繰り返すためのループ)のことをメインループと言うと聞いた覚えがあり、今までそうなのだと思っていたのですが、普通はそうとは言わないのですね。
これからはKSwordOfHasteさんが言うように定期処理などと呼ぶことにします。

その処理はとりあえずTimerを使って作ってみることにします。
(多少の誤差は出るでしょうけど)定期的に実行できればいいですし。

サーバーの話ですが、URLを使ってDNSの機能(?)でIPアドレスを取得してサイトにアクセスできるように、ホスト名か何か固有の名前でサーバーにアクセスできる仕組みがあればいいなと思いました。
ですが、実際にサーバー用のプログラムを実行するPCも決まっていないので、PC名=ホスト名としてIPを取得するなんてことをやるにしても公開前にそのホスト名を取得して設定しなければならないので結局IPを調べて設定するのと変わらないと思いました。
なので、プログラムと別の外部ファイルで設定できるようにプログラムを作っておき、公開のときにそこに設定を書いておくような形にしようと思います。

皆さん回答ありがとうございました。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。