ゲームプログラミングしてるんだけどさわからない所がある

1: 2019/06/09(日) 00:42:39.820 ID:Wd4NIwFX0
ゲーム中に設定を押した時に画面の真ん中に設定って
出るような機能があるとするじゃん?

3: 2019/06/09(日) 00:43:11.621 ID:Wd4NIwFX0
設定の中には1と2と3と4の機能があるとして5の機能を追加しようとしたら
全部の画面で修正作業が必要になるんだけど
それを一つにまとめて呼び出せないの?

11: 2019/06/09(日) 00:46:29.136 ID:HQB5lNKe0
>>3
オブジェクト指向に逆らってるスタイルだな

6: 2019/06/09(日) 00:43:32.361 ID:O8d0/IAj0
呼び出せる

12: 2019/06/09(日) 00:47:15.747 ID:Wd4NIwFX0
>>6
どうやんの?

9: 2019/06/09(日) 00:46:05.327 ID:apm36M+I0
全部の画面で修正ってのがよくわからん謎

10: 2019/06/09(日) 00:46:11.486 ID:LU2nPr/b0
何のエンジン使ってゲームプログラミングしてるのか知らんから何とも言えないがUnityならプレハブ化すればすべての画面で修正とかしなくてもいける

13: 2019/06/09(日) 00:47:29.095 ID:oxhnQly9d
どの言語でもどのシステムでも
ルーチンべたがきとかありえんやろ

16: 2019/06/09(日) 00:49:09.407 ID:Wd4NIwFX0
マリオや東方のイメージだとすると
ステージ1、ステージ2、ステージ3と関数を分けて作っているんだけど
全部コピペで設定は貼り付けているんだけど
ステージ1で変更したら、ステージ2でもステージ3でも変更がいるじゃん?
それを「何か」を作って呼び出しみたいな感じで一発で出来ないの?

18: 2019/06/09(日) 00:50:33.114 ID:HQB5lNKe0
>>16
とりあえず遷移図書いてみて
アホなことやってるのわかるから

17: 2019/06/09(日) 00:50:14.595 ID:2ih0YIuF0
設定はデータファイルから読み込めや

19: 2019/06/09(日) 00:50:47.520 ID:Wd4NIwFX0
まったく分けるなら出来るんだ
例えば、ステージ1、ステージ2、ステージ3、設定の関数を作って置いて
スタートボタン押したら、ステージ1を止めて設定の関数の方に行くみたいな

20: 2019/06/09(日) 00:51:05.105 ID:XuAWhM4I0
ステージの基本クラス作っときゃいいだろ
一個一個ステージごとに別のクラスでも作ってんのか

21: 2019/06/09(日) 00:51:59.454 ID:0wUwU5jQ0
>>20
読んだ感じそういうことじゃない?

24: 2019/06/09(日) 00:53:45.752 ID:Wd4NIwFX0
>>20
コピペするんでなく
基本クラスを1個作って
それを1面2面3面ごとに継承するってこと?

26: 2019/06/09(日) 00:55:04.425 ID:XuAWhM4I0
>>24
継承でもいいし一個のステージクラスのパラメーターだけ変えてステージ123生成でもいい

29: 2019/06/09(日) 00:56:50.244 ID:Wd4NIwFX0
>>26
一つのクラスのパラメータだけ入れ替えてもいいものなのか

22: 2019/06/09(日) 00:52:20.158 ID:Wd4NIwFX0
それとも
もし変更が起きたらみんな1個ずつ変更していってるの?

23: 2019/06/09(日) 00:53:27.150 ID:apm36M+I0
もしかしてHSPとかで作ってんの?

25: 2019/06/09(日) 00:54:19.507 ID:Wd4NIwFX0
>>23
Dxlib

27: 2019/06/09(日) 00:55:10.299 ID:LU2nPr/b0
ステージのスーパークラスに設定呼び出す関数作れば解決だな
てか何の言語とライブラリで作ってるんだ

31: 2019/06/09(日) 00:57:12.243 ID:Wd4NIwFX0
>>27
Dxlib

28: 2019/06/09(日) 00:55:35.480 ID:Wd4NIwFX0
ああ。そういうことか
継承を使えば基本クラスで設定などを書けば全部使いまわせるのか

30: 2019/06/09(日) 00:57:09.533 ID:hHKTEs9ta
処理の共通化のためだけにに継承を使うのはビミョー

32: 2019/06/09(日) 00:57:29.411 ID:Wd4NIwFX0
>>30
駄目なの?

33: 2019/06/09(日) 00:58:22.163 ID:hwz2N0X10
ゲームプログラミングに限らず、複数にまたがって使いそうなものはクラスや関数として定義しておくべきなんじゃないの?

34: 2019/06/09(日) 00:58:49.017 ID:Wd4NIwFX0
もっと早く聞けばよかったなぁ
ステージ1のクラス1つ作ったら
それをコピペしてステージ2作って
パラメータとイベントのタイミングを修正してってやり方してた

35: 2019/06/09(日) 00:58:49.142 ID:Y8Pb1sLp0
そもそもステージ1と2と3で別々の関数を使ってるのがおかしい
同じ関数に別のデータを渡すだけになってるべきだろ

37: 2019/06/09(日) 00:59:46.104 ID:Wd4NIwFX0
>>35
パラメータだけ変えろって事?
そうなるとイベントがやばくならない?

38: 2019/06/09(日) 01:00:04.108 ID:Y8Pb1sLp0
>>37
イベントもデータ化するんだよ

41: 2019/06/09(日) 01:01:53.655 ID:Wd4NIwFX0
>>38
わかりそうでわからん

47: 2019/06/09(日) 01:04:18.658 ID:Y8Pb1sLp0
>>41
今って、「ステージ1では座標○○になったら△△のイベントを実行する」みたいなことをいろんなとこでやってるわけだろ?
だから{ 座標: ○○, イベント: △△ } っていうデータの配列をデータとして渡す
するとステージ関数内でその配列を見て、座標が一致したなら対応するイベントを実行するだけ

53: 2019/06/09(日) 01:06:25.498 ID:Wd4NIwFX0
>>47
あーーーーーーー
なんで早く教えてくれなかったんだよ
イベントの座標などを変数にして
パラメータを入れ替えろという事か
じゃあドラクエとかも町のクラス1個だけで
パラメータだけ入れ替えてるのか

60: 2019/06/09(日) 01:11:19.696 ID:Y8Pb1sLp0
>>53
このスレに気付いたのが遅くてすまんな

「町のクラス」なんてものすらなくて、「マップ」がひとつあるだけだと思うぞ
町のBGMが指定されてて敵出現フラグがOFFのマップが町、
ダンジョンのBGMが指定されてて敵出現フラグがONのマップがダンジョン

66: 2019/06/09(日) 01:16:17.692 ID:Wd4NIwFX0
>>60
マップの配列とかは一番大きくしてていいの?
例えばフィールドマップと、町のマップでわけるものだと思っていたけど
フィールドマップの大きさで固定して中身のパラメータだけ変更するという事?

68: 2019/06/09(日) 01:16:48.700 ID:Y8Pb1sLp0
>>66
サイズもパラメータとして渡すことにすれば、マップサイズを自由に変えられるじゃないか

73: 2019/06/09(日) 01:20:35.155 ID:Wd4NIwFX0
>>68
動的に確保的な?
パラメータの変更の時にリリースして
さらに動的に確保してパラメータ突っ込むとか?

74: 2019/06/09(日) 01:23:49.395 ID:Y8Pb1sLp0
>>73
そこでクラスだよ
コンストラクタで動的確保して、デストラクタで解放する

76: 2019/06/09(日) 01:25:23.883 ID:Wd4NIwFX0
>>74
でもクラスは変更しな・・・
やっぱりつまりステージごとに派生させるという事か?
なんかおしい所まで理解している気がする
あと一歩が理解出来ない

42: 2019/06/09(日) 01:02:13.944 ID:LU2nPr/b0
>>37
イベントとかあまりにも子クラスによって違いすぎるものは親の抽象メソッドからのオーバーライドでいいよ

46: 2019/06/09(日) 01:03:40.316 ID:Wd4NIwFX0
>>42
あーはいはいはいはい
言いたい事がなんとなくわかる気がする
あまりにも違う場合はオーバーライドさせて特別に書けみたいな感じ?

56: 2019/06/09(日) 01:08:25.713 ID:LU2nPr/b0
>>46
そうそう
例えば最終ステージはボスの登場イベントがラスボスだからかなり凝ってて…みたいな感じだとどうしても引数だけで完全に処理を分けるのは厳しいからそうなることが分かっているような関数については抽象化していい
もちろん親クラスで詳細に場合分けを書くこともできるけどまあ設計上よろしくはないよね

62: 2019/06/09(日) 01:12:09.305 ID:Wd4NIwFX0
>>56
ごっちゃごちゃになるんだよね
だからステージごとにクラスをコピペしてわけて
イベントのパラメータを変えていたんだけど
そしたら「設定ファイルとかの共通システム変更する時全部いちいち変えるの?」っていう疑問が出てきて

67: 2019/06/09(日) 01:16:41.783 ID:LU2nPr/b0
>>62
関数は共通化して引数で処理分けられるものとそうでないものを明確に区別する必要があるね

36: 2019/06/09(日) 00:59:00.258
先ずコピペやめろ
収拾つかなくなるぞ
エアプグラマにプログラミングなんてコピペで十分とか言われて真に受けちゃったんだろ

39: 2019/06/09(日) 01:00:07.844 ID:Ql0Gx9t+0
そうやって成長してくもんだよ
分かったら一から書き直せな

44: 2019/06/09(日) 01:03:04.069 ID:HQB5lNKe0
>>39
覇権サーの主なのに「こいつUnityも使わずにゲームを!?」「できらぁ」なんて謎なことやってる人も居たりするしな
卑下することはないんやで

40: 2019/06/09(日) 01:00:08.622 ID:yGzFgBXl0
クラスとか継承とか使わずとも
どのステージでも共通で読み込む関数を書いたファイルを1つだけ用意しておいて
各ステージ毎にそのファイルを読み込んで共通関数を使うだけで済む話ではないの?

43: 2019/06/09(日) 01:02:35.705 ID:Wd4NIwFX0
>>40
それだとイベントがやばくね?

45: 2019/06/09(日) 01:03:36.386 ID:FHZ9OiuU0
ステージのスーパークラスを作る

48: 2019/06/09(日) 01:04:43.065 ID:Wd4NIwFX0
>>45
派生させるよりパラメータ変えろと怒られてる

49: 2019/06/09(日) 01:04:53.530 ID:CsGZb3t2p
ダンバリングとクラウジングどっち?
まずはそこから

54: 2019/06/09(日) 01:07:02.969 ID:Wd4NIwFX0
>>49
何の魔法ですか?

51: 2019/06/09(日) 01:05:39.149 ID:Ql0Gx9t+0
イベントの具体的な中身が分からんけど
テキストを表示するイベントをテキスト内容ごとに関数作ってるとかないよな?

55: 2019/06/09(日) 01:08:07.895 ID:Wd4NIwFX0
>>51
やってますけど?
コピペしてステージごとにクラスわけてますけど?

52: 2019/06/09(日) 01:06:23.209 ID:yGzFgBXl0
イベントとか言われても何を言ってるのか超エスパーじゃないと分からんぞ

59: 2019/06/09(日) 01:10:05.768 ID:XuAWhM4I0
もう書かれているけど、例えばマリオだったらステージクラス作ってそこに敵やブロックの配置情報を渡せばそれだけで別のステージが作れる

65: 2019/06/09(日) 01:14:34.916 ID:Wd4NIwFX0
>>59
パラメータだけ変えろって事ね
ボスのステージとかならオーバーライドさせたりするのもいいけどと

63: 2019/06/09(日) 01:13:50.951 ID:XuAWhM4I0
不思議のダンジョンみたいなランダム生成マップがどう作られるか考えれば気付くだろうよ……
もっと先人から学べ

71: 2019/06/09(日) 01:19:01.664 ID:Wd4NIwFX0
>>63
イベントがあるからさ
って言っても
どんなイベントでもチャットウィンドウ出て文字が流れるだけだから
パラメータだけ変えればいいと言えば確かにその通りか
イベント1イベント2イベント3で座標も書いて置いて、読み込むだけにしたらいいのか

64: 2019/06/09(日) 01:14:27.483 ID:Ql0Gx9t+0
お前はまずツクールから始めた方がいいな
最近のツクールはソース見れるからプロでも勉強になるぞ

70: 2019/06/09(日) 01:18:34.721 ID:LU2nPr/b0
>>64
ああ、今ソース見れるんだ
RPGツクールのももちゃんがデバッグしてるってそういうことだったのか
やっと理解した

69: 2019/06/09(日) 01:17:19.538 ID:uRahkB9M0
変更予定ないし動くならコピペや数値手打ちでいいや→全修正が必要に→効率化を図る
あるある

72: 2019/06/09(日) 01:19:45.634 ID:LU2nPr/b0
>>69
結局リファクタリングされられるなら最初から効率化しておけばよかったと後悔するんだよな

78: 2019/06/09(日) 01:27:01.578 ID:uRahkB9M0
>>72
作業しまくってんのに何も進んでないとかいう地獄な
悲しいなぁ

75: 2019/06/09(日) 01:24:04.272 ID:Wd4NIwFX0
あれかステージ変わる時のロード画面って
動的確保してる変数のリリースとさらに必要な変数を確保してるのか?
で、一つのクラスでパラメータだけ変えて動かしていると

77: 2019/06/09(日) 01:26:03.343 ID:HQB5lNKe0
>>75
ロード長すぎぃぃぃ問題

79: 2019/06/09(日) 01:27:07.896 ID:Y8Pb1sLp0
>>75
基本的にファイル読み込みだよ
もちろん、読み込んだファイルをプログラム用のデータ構造に直す部分も含まれるだろうから、当然不要なメモリの破棄と動的確保も含むけど

81: 2019/06/09(日) 01:29:17.289 ID:Wd4NIwFX0
あーーーーーわかった気がする
基本マップクラスを1個作って置いて
ステージごとに派生させてクラスを作る
共通部分は基本マップクラスに書く
ステージが変わるたびにインスタンスから必要な情報を抜き出し
新しいインスタンスに写し、古いインスタンスを閉じれば
動的にメモリ確保したのが消えて、新しいクラスでは必要な分だけ残るのか

82: 2019/06/09(日) 01:31:01.279 ID:Ql0Gx9t+0
ステージごとにじゃなくて全ステージで1個のクラスな

84: 2019/06/09(日) 01:32:23.451 ID:Wd4NIwFX0
>>82
ステージごとに派生させちゃ駄目なの?

83: 2019/06/09(日) 01:31:15.872 ID:Hiyg0vu10
何言ってるか全然わからんけど何かわかったようでほっこり
よかったね

85: 2019/06/09(日) 01:33:41.708 ID:25vtPgzXd
ステージごとに処理してたら面倒なことになったよドラえもーん!ってスレ立てたんじゃないの?
なんでステージごとにやろうとすんだよ

86: 2019/06/09(日) 01:36:04.826 ID:Wd4NIwFX0
>>85
そうだよ!イベントは確かにパラメータだけ入れ替えるのは理解したけど
クラス変える場合・・・
わかんなくなった

87: 2019/06/09(日) 01:36:29.203 ID:Wd4NIwFX0
頭がオーバーフローしたもうダメポ

88: 2019/06/09(日) 01:38:12.147 ID:Ql0Gx9t+0
お前が今ステージごとに書いてる処理は全部共通化できる
それができたら共通化した処理をステージごとに組み合わせるだけになる
あとはその組み合わせを文字列にしてテキストファイルかなんかで管理すればいい
ステージの微調整するたびにコンパイルする必要もなくなる

89: 2019/06/09(日) 01:40:13.626 ID:Wd4NIwFX0
>>88
変数の大きさが違うんだよ!

90: 2019/06/09(日) 01:40:21.460 ID:WgSIFy5w0
ミニゲームが色々遊べるゲームがあったとしたらゲーム毎に継承したクラス作るだろうな

93: 2019/06/09(日) 01:41:36.938 ID:Wd4NIwFX0
>>90
イベントが大きく変わるもんなぁ

91: 2019/06/09(日) 01:40:39.486 ID:LU2nPr/b0
クラス変える場合はコンストラクタに必要な情報渡せばいいだけでしょ
例えばLoadSceneっていう名前の関数でステージ移行するんなら移行前のシーンの情報を関数に渡して移行後のステージクラスを初期化すればいい

96: 2019/06/09(日) 01:44:27.012 ID:Wd4NIwFX0
>>91
てきとーにメソッド作って中に入れ替え用変数書いてコピペして
リリースして新しくnew・・・ってスコープ抜けたらダメじゃん
よくわからなくなってきた

98: 2019/06/09(日) 01:47:48.641 ID:LU2nPr/b0
>>96
スコープ抜けたらダメとは…
なんでステージクラスのインスタンスがローカル変数になるような設計なんだよ

92: 2019/06/09(日) 01:41:29.359 ID:XuAWhM4I0
イベントであっても引数で渡せばいい
RPGツクールなんかだと、ステージ読み込み時に自動実行されるイベントが含まれた透明なマスを配置してやる
イベント終わったらフラグたててマスを無効化させればいい

97: 2019/06/09(日) 01:45:16.511 ID:Wd4NIwFX0
>>92
それをどう実装するかで悩んでる

95: 2019/06/09(日) 01:42:43.649 ID:ZFUNi07p0
クラスの継承とか複雑になるだけだから止めろ

99: 2019/06/09(日) 01:52:16.517 ID:GQqEmhwY0
抽象化しろ^_^

100: 2019/06/09(日) 02:03:23.003 ID:Wd4NIwFX0
>>99
抽象化が読んでもサッパリ意味が分からない

102: 2019/06/09(日) 02:26:40.466 ID:Y8Pb1sLp0
>>100
ブラックボックス化、と読み替えてもよい
とにかく、「何かのデータを何かの処理に渡すと良い感じにやってくれる」という形にすること
データもブラックボックスであり、処理の内容もブラックボックスだ

101: 2019/06/09(日) 02:03:58.338 ID:Wd4NIwFX0
とりあえず・・・一つのクラスで
イベントをパラメータの変更だけで何とかするように書いてみるわ
ごちゃごちゃになりそうだけど