Javaで作るスタンドアローンゲーム
■ このスレッドは過去ログ倉庫に格納されています
>>433 おおおおお。すごい。 完璧に出来ている。 今コードを読んでいて関心させられるばかりです。 もう少し完全把握に時間がかかるので出来次第また書きます。 本当にありがとうございます。これでまたちょっとがんばれるかな。 漸く432で上げたコードに組み込むことが出来たました。 一つ質問があります。 例えば敵がある一定のエリアにいてArea.update()で更新するのがいいのか。 若しくは、Areaクラスの集合管理をしているMapに敵(自己のエリア番号保有)を格納しているのがいいのか。 クラスダイアグラム考えているんですけど、普通は前者ですかね? 1.ゲーム仕様的に敵が少なければ敵全員forループで回す 実装が簡単、どこかに敵全員入ったList<Enemy>があれば良い 2.全エリア合計で10万とか敵がいる場合、巨大なforループ自体を回したくない その場合はAreaクラスにList<Enemy>をもたせておき、Area.update()する こちらの場合、敵が動いてエリアを跨いだ時に移動前と移動後のエリアに変更を通知する >>433 をベースにした場合、これで十分だろう Application.java public class Application { private static List<Enemy> enemys = new List<>(); public static List<Enemy> getEnemyAll() { return enemys; } } MainPanel.java private void onUpdate(){ Map map = Application.getMap(); map.update(); Player player = Application.getPlayer(); player.update(); List<Enemy> enemys = Application.getEnemyAll(); for(Enemy e : enemys){ e.update(); } } なるほど。わかりました。次は当たり判定を実装してみます。 後、皆さんゲーム作るときって何か雛形や構造など参照にしてるものってあります? 自分はテンプレにある-> 大量のソースコードを公開して下さっている国内サイト ttp://aidiary.hatenablog.com/entry/20040918/1251373370 を使っていますが。 一つのエリア内での壁の当たり判定は出来ましたが、またエリア境界を跨ぐ所で詰まった。 >>426 みたいにするのを考えていますが中々うまくいかない。 いっそのこと>>428 の方法を取ったほうが周りのエリアのことを考えなくて住むので計算は楽になるかな? いや、何でやねんww 同じ座標変換で、進行方向のオブジェクト調べりゃええだけやがなw 基本的にプレイヤーの操作によっていじる座標は、キャラの位置を示すグローバル座標のみ。 その他の、全体マップ内でのエリアの位置を示すブロック座標や、該当エリア内でのプレイヤーの位置を示すエリア座標は、必要なときに都度グローバル座標から変換すればいい。 そうすりゃエリア跨いだ場合の処理がー、とか悩む必要もなくなるよ。 横から補足すると、 エリアというのも、全エリアの中の更新範囲のエリア群になる筈なんだよ。 それを決定するのもプレイヤーまたはカメラのグローバル座標から行われる。 一度、セーブ・ロードの視点でデータの持ち方、データへのアクセスフローを考えてみるといいよ。 何をトリガーにしてフローが産れるのか?が理解できる。 >>446 ~447 ありがとうございます。 >>431 の変換関数を基本にしてグローバル座標からエリア座標に変換していますが、 多分壁判定に使っているarea[y][x] == 1系に不備があるんだと思います。 一応シーケンス図を考えながらフローに気をつけて見ます。 4日位でギブアップはやはり早いのでもう少し頑張ってみてみます。 ttp://gesei.sub.jp/kami/src/up0358.zip が限界。頭禿げそう。 まずは速度をタイル単位(32)からはじめるこった ttp://gesei.sub.jp/kami/src/up0360.zip >>451 199さんでしたか。色々助言やコードなどありがとうございます。 しかも世界ループ機能まで実装してもらってますし。読み易い。 今からプログラムを追っていく作業に取り掛かります。 これでなんとか地図上で動き回れるようになりそうです. それは失礼しました。 ちょっと判定時々バグるけどこんなかんじでしてます。 ttp://gesei.sub.jp/kami/src/up0361.zip 今度こそちゃんとしたゲームが作りたい! 目標は動物の森みたいな2Dゲーム。グラや操作性は大体80s~90s的なゲームが理想。 ゲーム中の機能としてはキャラ移動はもちろん、店での買い物や魚釣りなど色々な事が出来たらいいな。 ま〜最低店での買い物やメニュー画面を開いてアイテム確認や装備変更が出来ればいい。 ゲーム外の機能としては多くのゲームに共通する”新しくゲームをはじめる”、”ロードする”等選択出来るようにする。 今までに何回か簡単なゲームを作っては失敗しX2を繰り返したので上に列挙した機能は多分実装可能。 しかし、それらを管理する方法(構造)が現在未熟な為不明。 http://en.wikibooks.org/wiki/Video_Game_Design/Structure にあるState Machineの機能を実装したい。 現在の方法はfrontEndとmainGameをリストで管理し、各stateに固有のIDを持たせて初期化やupdate等をしている。 ココで今問題になっているのはfronEndで”ロード”されたゲームデータをどのようにしてmainGameで受け取り処理するか?等だ。 ゲームの構造は作製回数を重ねるごとに洗練されてくると聞き及ぶ。 貴方達はこのような時どんな構造にしていますか? 文章おかしくて外人みたいだな 質問内容が分からないのでもう一度書き直せ 失礼。何年も日本にいなかったのでまだ少し文章が変かもしれない。 質問内容は start up licenses introductory movie front end game options sound options video options loading screen main game introduction game play game modes pause options end game movie credits shut down というゲームの基本要素をstate machineを使ってどのように実装したら、これらの管理が容易になるだろうか?です。 ここにコード全部乗せるのは文字制限の関係で無理みたいっだし。 ゲームの進行を管理するクラスが必要だなー。 データをセーブロードするクラスも必要だな。 データそのもののクラスがあったほうがいいな。 プレイヤーというクラスもあるな。 アイテムというクラスを作ったら、 プレイヤーにアイテムのリストを持たせる? いやアイテムボックスというクラスを作って、 それをプレイヤーに持たせるか。 満タン判別とか簡単に引っ張って来られたら便利だなー… あ、データクラスに含ませてセーブしたほうがいいな。 ロードしたらアイテムボックスにリストをセットしたいな。 …って感じで、まずは想像を膨らませながら 具体的に設計したら後々楽だよ。 ゲームの進行を管理するクラスが必要だなー。 データをセーブロードするクラスも必要だな。 データそのもののクラスがあったほうがいいな から下は既存のコードを流用しようと思っていますので再設計などは他聞問題ないと思います。 http://www012.upp.so-net.ne.jp/flab/javatuto/javatuto8.html なものを見つけたので今勉強中。 もっと何かいいのがあれば教えてもらえればうれしいです。 stack exchangeやgamedev漁るのちと疲れてきた。 シーン単位の設計とかそういう設計指針立てるのが苦手ってことなら、 ゲームエンジン使えば?って話になっちゃうかも あと遷移図とか画面構成イメージとか描いたりしてる? コード書く→リファクタリングばっかりでもいいけど、 適当に手書きで整理してみるだけでも違うもんだよ シーンの遷移が分からないってはなしだろ? シーンのインスタンスをstaticとかシングルトンにすれば そのインスタンスがもってるプロパティもイモヅル式にどこからでもアクセスできる https://pastebin.mozilla.org/8828264 継承や関連性はなんとなく図を描いている所。 DFDしかちゃんと出来なくて困る。 コード見ましたところ、dispose関数がありますが、そのシーンを廃棄するのでしょうか? 基本的な流れとしては、 GameStateManagerでgame options, sound options, video optionsそしてmain game突入まで管理する。 STARTは単に"Presse Start"を表示させるだけにして、後でその他のoptionsをリストに追加する。 PLAYに(遷移:読み方知らん)かんい?したらPlayStateManagerに移る。 PlayStateManagerではキャラ移動,店での買い物,メニュー画面を開いてアイテム確認や装備変更等をそれぞれstateで管理する。 例えばPlayStateでキャラ移動, MenuStateでメニュー画面を開いてアイテム確認や装備変更等に分けている。 これで各state特有の処理は出来るのだが、ここで一つ問題が発生する。 問題とは、どのようしてリストに収納されている各stateで”GameStateに無い関数”にアクセスできるか?です。 例: PlayStateでキャラ(player)を移動させているときにアイテム確認の為にメニューを開いた。 その時PlayStateManagerにあるsetPlayer(Player p)の関数を呼び参照準備完了。 そしてPlayStateManagerでstateの移行を実行しPlayStateからMenuStateに移行する。 その後MenuStateでPlayStateManagerにあるgetPlayer()を呼び参照取得。そしてアイテムの使用や廃棄等の操作をした後再びPlayStateに移行する。 その時PlayStateManagerにあるsetPlayer(Player p)の関数を呼び参照準備完了。 その後PlayStateにあるsetPlayer(Player p)を呼んで参照のセットを計る。 しかし、その関数はGameStateに記述されていないから参照できない。 goto的になっちゃんだよな〜 https://pastebin.mozilla.org/8828836 普通にGameStateをPlayStateにダウンキャストすればよいだけだろ ダウンキャストしたくなければ、そもそもリストに詰めないことだ 確かにダウンキャストすれば出来そうですが、それをしようとしたら各要所で条件分岐させなきゃならないし、 前呼んだ”javaで学ぶリファクタリング”の本でDCは余り良い手ではないと書いてあったので。 Thread.sleep() を呼び出すと15ミリ秒も処理が帰ってこないという話があり http://dobon.net/vb/bbs/log3-23/14028.html 最高精度の 1 ミリ秒にできたとしても UI スレッド、描画スレッド、AIスレッドなどを同期させながら 60fps 出したいときに スレッド切り替えるたびに 1 ミリ秒かかっていたのでは致命的だ この辺みんなどうやってクリアしていますか? src.zip, Thread.java, sleep(millis, nanos): if (nanos >= 500000 || (nanos != 0 && millis == 0)) { millis++; } sleep(millis); 本当に丸められていた・・・ java.util.concurrent.lock.LockSupport.parkNanos(1L); も15ミリ秒待たされた。 新しめの win 8.1 マシンでさえこんな状況 >>470 同期させるならsleepのタイムアウト待つんじゃなくて割り込みかけない? もうちょっとちゃんとするならjava.util.concurrentのCyclicBarrierやらCountDownLatchやらPhaser使うんじゃない? >>472 うちの環境だとThread.sleep(1);やjava.util.concurrent.locks.LockSupport.parkNanos(1L);は約1msで戻ってくるけどなー Windows 8.1 64bit/Java8/Pentium G6950 Windows 8.1 32bit/Java8/Atom Z3735F ideoneも約1msだった http://ideone.com/Hlp4cu >>473 アクティブレンダリングの待ちが念頭にあったから sleep と考えていたけど 確かに同期させるという用途なら wait / notify とかが良いかも。 そちらでは1ミリ秒の精度あるのですね。 環境によってばらつきがあるのかな? parkNanos(1L) はさすがに1ナノ秒の精度は期待できないにしても マイクロ秒単位の精度はあってほしかったですが >>470 リンク先の内容って2005年の.NET C#の話でしょ? なんでJava板で?・・・ System.nanoTime()使えばナノ秒単位の精度が出るでしょ。 http://aidiary.hatenablog.com/entry/20070429/1251463673 nanoTime() は確かに 100 ナノ秒単位くらいの精度がでるかもしれないが それは時間を「測る」ほうの精度で、sleep で「待つ」ほうの精度はもっと悪い。 リンク先を貼ったのは探すのをさぼってしまったからだけど、 Java で、最近の Windows でも状況は似たり寄ったりなのは >>471 ,472 の通り ぬるぬる動くゲームを作ろうとしていて、Thread.sleep() を呼んでいる場合は、 けっこうオーバーヘッドになっているかもしれません sleep(millis, nanos) とあるから、ナノ秒単位で寝かせられる と思うじゃん、 JavaFXってグラボのアクセラレーションかかるのかな? って誰もいないかw PCで携帯スマホのOpenGLくらいのパフォーマンスは出そうなんだが… 簡単にお金が稼げる方法興味ある人だけ見てください。 グーグル検索⇒『来島のモノノリウエ』 SCVG4A16FM ☆ 日本の、改憲を行いましょう。現在、衆議員と参議院の 両院で、改憲議員が3分の2を超えております。 『憲法改正国民投票法』、でググってみてください。国会の発議は すでに可能です。平和は勝ち取るものです。お願い致します。☆☆ ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.0 2024/04/24 Walang Kapalit ★ | Donguri System Team 5ちゃんねる