ゲームのオブジェクト指向について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Rittai_3D
記事: 524
登録日時: 7年前

ゲームのオブジェクト指向について

#1

投稿記事 by Rittai_3D » 6年前

どうも、C++を挫折しそうな3Dです。またお世話になります。

最近C++ばっかりやっていますが、わからないところが多すぎて諦め気味です。

という訳で、久しぶりにC言語を使って簡単な弾幕シューティングゲームを作ろうと思いました。

そこで、C++っぽくオブジェクト指向を意識してやってみようと思いましたが、シューティングゲームにおけるオブジェクトとは一体なんだ?と思い、行き詰まっています。

ここで質問です。シューティングゲームにおけるオブジェクトとは何でしょうか?

また、シューティングゲームだけでなく、他の種類のゲーム(RPGなど)のオブジェクトも教えていただけるとありがたいです。

【開発環境】
Dxライブラリ
Visual C++2008 Express Edition
WindowsXP
初心者です

アバター
h2so5
副管理人
記事: 2212
登録日時: 9年前
住所: 東京
連絡を取る:

Re: ゲームのオブジェクト指向について

#2

投稿記事 by h2so5 » 6年前

オブジェクトというのは要するに「名詞」です。
シューティングゲームに出てくる名詞を列挙してみましょう。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#3

投稿記事 by Rittai_3D » 6年前

>>h2so5様

返信ありがとうございます。
h2so5 さんが書きました:オブジェクトというのは要するに「名詞」です。
シューティングゲームに出てくる名詞を列挙してみましょう。
当方あまりゲームをしないので不足している部分もあるかもしれませんが、

自機
雑魚
ボス
弾幕
自機ショット

くらいしか思いつきません。
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#4

投稿記事 by softya(ソフト屋) » 6年前

背景や点数表示も名詞ですね。

この作業は、一種のオブジェクト指向分析です。
「オブジェクト指向分析設計 - Wikipedia」
http://ja.wikipedia.org/wiki/%E3%82%AA% ... D%E8%A8%88
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#5

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。

背景と点数表示を忘れていました。言われていればそうですね。

リンク先を読ませていただきます。
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#6

投稿記事 by softya(ソフト屋) » 6年前

あと画像の形として見えない処理もあります。考えてみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#7

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:あと画像の形として見えない処理もあります。考えてみて下さい。
自機画像
ボム画像/計算(忘れてました)
弾画像
(ボード?画像)
(被弾処理?)

これ以上は全く思いつきません。他にあれば是非教えて頂きたいです
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#8

投稿記事 by softya(ソフト屋) » 6年前

そこを考えるのが一番重要なので安易にはお答えしませんよ。答えを早く求め過ぎでは無いかと思います。
じっくり図や紙に色々書いて考えてみてください(人により方法が違う)。
それが分析や設計の方法です。

あとSTGにボムは必須ではありませんし、弾幕と弾画像は別のオブジェクトなのでしょうか。
安易に機能を増やしすぎるのはMusicRoomで懲りたのでは?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#9

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:そこを考えるのが一番重要なので安易にはお答えしませんよ。答えを早く求め過ぎでは無いかと思います。
じっくり図や紙に色々書いて考えてみてください(人により方法が違う)。
それが分析や設計の方法です。
おっしゃる通りです。自分の悪い癖で、知りたいことはすぐに他人に聞いてしいます。自分でじっくり考えて見ます。

紙は無くしやすいので、テキストファイルにでも書いてみます。
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#10

投稿記事 by softya(ソフト屋) » 6年前

紙は無くしても良いんですよ。思考をまとめるツールにすぎません。
まとめたら、テキストに起こせば良いんです。
あるいは、Draw系のツール使っても良いでしょう。
 ↓ この間ISLeさんが紹介していたWEBツール。
「Gliffy Editor - Online」
https://www.gliffy.com/go/html5/launch? ... 00200c9a66
OpenOfficeにも似たのはあります。

紙などでオブジェクト間の相互作用を書きだしてみると足らない物が見えてきますので良かったら試してみて下さい。
画像
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: ゲームのオブジェクト指向について

#11

投稿記事 by ISLe » 6年前

何もないところからオブジェクトを想像するのは難しいと思うので、ネットに転がってるゲームのスクリーンショットから映っているものをひとつ残らずピックアップしてみるとかしてみたらどうでしょう。
あるいは思い付いたものを紙に描いて(丸や四角の中に名前を書く程度でよし)スクリーンショットに仕立ててみれば足りないものが見えてくると思います。

振る舞いに関してはそのあとにしたほうが良いのではないでしょうかね。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#12

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます
softya(ソフト屋) さんが書きました:紙は無くしても良いんですよ。思考をまとめるツールにすぎません。
まとめたら、テキストに起こせば良いんです。
あるいは、Draw系のツール使っても良いでしょう。
 ↓ この間ISLeさんが紹介していたWEBツール。
「Gliffy Editor - Online」
https://www.gliffy.com/go/html5/launch? ... 00200c9a66
OpenOfficeにも似たのはあります。
生憎、OpenOfficeは持ってないです...

WEBツールを教えていただきありがとうございます。自分の部屋のPCはネットに繋がってないので紙に書きたいと思います。
softya(ソフト屋) さんが書きました:紙などでオブジェクト間の相互作用を書きだしてみると足らない物が見えてきますので良かったら試してみて下さい。
画像
この図は「敵が弾を出したら弾を描写する」という解釈でよろしいですか?

この方法でやってみたいと思います。参考になります。
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#13

投稿記事 by Rittai_3D » 6年前

>>ISLe様

返信ありがとうございます。
ISLe さんが書きました:何もないところからオブジェクトを想像するのは難しいと思うので、ネットに転がってるゲームのスクリーンショットから映っているものをひとつ残らずピックアップしてみるとかしてみたらどうでしょう。
あるいは思い付いたものを紙に描いて(丸や四角の中に名前を書く程度でよし)スクリーンショットに仕立ててみれば足りないものが見えてくると思います。

振る舞いに関してはそのあとにしたほうが良いのではないでしょうかね。
了解しました。やってみます。

丸や三角に意味はありますでしょうか?丸は更新(?)処理で三角は描写、みたいな...
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#14

投稿記事 by softya(ソフト屋) » 6年前

> この図は「敵が弾を出したら弾を描写する」という解釈でよろしいですか?

違いますよ。敵オブジェクトが弾オブジェクトに対して、弾の生成を依頼している所です。
これがISLeさんが振る舞いと表現した部分です。

ただ、その前にISLeさんの言われる作業を徹底した方が良いと思いますね。
やってみてなさそうですし。

>丸や三角に意味はありますでしょうか?丸は更新(?)処理で三角は描写、みたいな...

丸は自機、三角は敵機では?
オブジェクトの振る舞いではなく仮想ゲーム画面を作れって話ですから。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#15

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:> この図は「敵が弾を出したら弾を描写する」という解釈でよろしいですか?

違いますよ。敵オブジェクトが弾オブジェクトに対して、弾の生成を依頼している所です。
これがISLeさんが振る舞いと表現した部分です。

ただ、その前にISLeさんの言われる作業を徹底した方が良いと思いますね。
やってみてなさそうですし。
そういう意味だったんですか。失礼しました。

今まで龍神録のプログラムをマネしていただけなのでやります。
softya(ソフト屋) さんが書きました:>丸や三角に意味はありますでしょうか?丸は更新(?)処理で三角は描写、みたいな...

丸は自機、三角は敵機では?
オブジェクトの振る舞いではなく仮想ゲーム画面を作れって話ですから。
オブジェクトの振る舞いだと解釈していました。すいません。
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#16

投稿記事 by softya(ソフト屋) » 6年前

そういえばオブジェクトなどまとめていけばわかりますが、MusicRoomよりも遥かに複雑なものになるんですが覚悟されていますよね?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: ゲームのオブジェクト指向について

#17

投稿記事 by ISLe » 6年前

オブジェクトのピックアップを徹底したあとの話ですが。

描画というのは実装ですから、振る舞いとは別に考えないといけません。
むしろ設計段階では実装をなるべく除外してください。

オブジェクトとしての本質的な振る舞いを考えてください。
実装に依存しない仕様です。

当たり前のことを書かなくて済めば仕様がシンプルになります。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#18

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:そういえばオブジェクトなどまとめていけばわかりますが、MusicRoomよりも遥かに複雑なものになるんですが覚悟されていますよね?
はい。MusicRoomはC/C++の勉強がてら作り始めただけですので。また、C++verはC++が完全に理解できていなかったのでと考えています。
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#19

投稿記事 by Rittai_3D » 6年前

>>ISLe様

返信ありがとうございます。
ISLe さんが書きました:オブジェクトのピックアップを徹底したあとの話ですが。

描画というのは実装ですから、振る舞いとは別に考えないといけません。
むしろ設計段階では実装をなるべく除外してください。

オブジェクトとしての本質的な振る舞いを考えてください。
実装に依存しない仕様です。

当たり前のことを書かなくて済めば仕様がシンプルになります。
わかりました。描画って実装なんですね。勉強になります。
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#20

投稿記事 by softya(ソフト屋) » 6年前

実のところ「二兎を追う者は一兎をも得ず」を心配しています。
この場合は、「オブジェクト指向的な設計」と「始めての規模で組むSTG」です。
3D_3Dさんにある程度経験があれば止めないのですが、MusicRoomを見ている限りは混乱すると思います。
つまり、規模を落としたほうが良いんじゃない?って事ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#21

投稿記事 by Rittai_3D » 6年前

>>softya様

返事ありがとうございます。
softya(ソフト屋) さんが書きました:実のところ「二兎を追う者は一兎をも得ず」を心配しています。
この場合は、「オブジェクト指向的な設計」と「始めての規模で組むSTG」です。
3D_3Dさんにある程度経験があれば止めないのですが、MusicRoomを見ている限りは混乱すると思います。
つまり、規模を落としたほうが良いんじゃない?って事ですね。
規模を落とす、とはSTGではなく、もっと簡単なものから始めた方がいいということですか?

確かに、まともに作ったものがブロック崩し程度なので、他のものから始めた方がいいかもしれません。ただ、STGくらいしか作りたいものが見つからないので…
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#22

投稿記事 by softya(ソフト屋) » 6年前

では、シューティングの規模を下げましょう。龍神録並じゃなく仕様をそげ落として下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#23

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:では、シューティングの規模を下げましょう。龍神録並じゃなく仕様をそげ落として下さい。
わかりました。夏休みの課題が終わらなそうなので、明日考えてみます。
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#24

投稿記事 by Rittai_3D » 6年前

一応自分なりに書いてみました。

おかしいところ、足りないところなどを教えてください。

また、画像からピックアップしたものを書きだしてみました。こちらもおかしいところなどがありましたら教えてください。

コード:

SS( スクリーンショット )からピックアップ

・弾幕( ボスショット )
・ボス
・自機
・背景
・ボム
・ボム数
・体力ゲージ
・残機
・自機ショット

添付ファイル
hibachi.png
ここを元に書いてみました。
v001.png
書いてみたもの
v001.png (11.4 KiB) 閲覧数: 3931 回
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#25

投稿記事 by softya(ソフト屋) » 6年前

作れる範囲に仕様を削っていないと思われるので、削った想定画面を作りましょう。
・ボム必要ですか?
・豪華な弾幕必要ですか?
・ボスは必要ですか?
最初のが上手く行ったら次に機能追加して作れば良いだけなので、最初は思っきり減らして下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
usao
記事: 1565
登録日時: 6年前

Re: ゲームのオブジェクト指向について

#26

投稿記事 by usao » 6年前

私なら最初はこれだけかなぁ

コード:

  |

  |←shot

  ▲自機

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#27

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:作れる範囲に仕様を削っていないと思われるので、削った想定画面を作りましょう。
・ボム必要ですか?
・豪華な弾幕必要ですか?
・ボスは必要ですか?
最初のが上手く行ったら次に機能追加して作れば良いだけなので、最初は思っきり減らして下さい。
もっと削って良いんですか?わかりました。どんどん減らして行きます。
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#28

投稿記事 by Rittai_3D » 6年前

usao さんが書きました:私なら最初はこれだけかなぁ

コード:

  |

  |←shot

  ▲自機
そんな少なくて良いんですか?分かりました。参考にさせていただきます
初心者です

アバター
usao
記事: 1565
登録日時: 6年前

Re: ゲームのオブジェクト指向について

#29

投稿記事 by usao » 6年前

>そんな少なくて良いんですか?
私なら,です.
ご自身がやれる範囲で最初から用意するものを決めればいいと思います.

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#30

投稿記事 by Rittai_3D » 6年前

>>usao様

返信ありがとうございます。
usao さんが書きました:私なら,です.
ご自身がやれる範囲で最初から用意するものを決めればいいと思います.
わかりました。とりあえず、自分でできる範囲のものでやってみます。
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#31

投稿記事 by Rittai_3D » 6年前

usao様とsoftya様のアドバイスを元に作り直してみました。

これも、何かおかしいとかありましたら指摘お願いします。

#Fieldの文字を削除しました
添付ファイル
v0002.png
v0002.png (4.18 KiB) 閲覧数: 1943 回
最後に編集したユーザー Rittai_3D on 2013年7月31日(水) 13:16 [ 編集 1 回目 ]
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#32

投稿記事 by softya(ソフト屋) » 6年前

自分の弾が無いですが狙い通りですか?
あとフィールドとbackgroundって何が違うんでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#33

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます
softya(ソフト屋) さんが書きました:自分の弾が無いですが狙い通りですか?
あとフィールドとbackgroundって何が違うんでしょうか?
自機ショットはとりあえずはずしました。たぶん混乱してしまうような気がして。

フィールドは間違いです。本当はそこはボードでした。( http://dixq.net/rp/7.html のボードのことです。)
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#34

投稿記事 by softya(ソフト屋) » 6年前

ボードって必要でしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#35

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます

要らないですね。よく考えていませんでした。
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#36

投稿記事 by Rittai_3D » 6年前

では、取り敢えずv0002.pngの画像を元に作って行きたいと思います。

また詰まったら質問に来ます。その時もよろしくお願いします。
初心者です

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: ゲームのオブジェクト指向について

#37

投稿記事 by ISLe » 6年前

作る作らないは別として、観察力とか解析能力を鍛えるために既存ゲームのスクショからオブジェクトをピックアップするのは続けてはいかがでしょう。
ヒットコンボ関連とかまるっと抜けてますし。

参考にしたスクショのゲームは道中とボスのシーンではレイアウトが違うので、先にやるのは道中のほうが良いと思います。
ボスシーンに移行するとき画面のパーツが移動するので、実際にどの部分がどういうふうに動いているか見るともっと分かりやすいですが。

いまできる範囲で『設計』すると実際にできる範囲よりずっと規模の小さいものになってしまうと思います。
特に初心者にとって『実装』できるかどうかでふるいにかけるべき問題を『設計』に持ち込むと成長を止めてしまうことになると思います。
突拍子もない仕様を思い付いても困りますが、そうならないためにもスクショを参考にしての訓練は有効だと思います。

言葉にできれば実装できるとわたしは思います。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#38

投稿記事 by Rittai_3D » 6年前

>>ISLe様

返信ありがとうございます。
ISLe さんが書きました:作る作らないは別として、観察力とか解析能力を鍛えるために既存ゲームのスクショからオブジェクトをピックアップするのは続けてはいかがでしょう。
ヒットコンボ関連とかまるっと抜けてますし。
ゲームだけだったのでボス戦を選んでしまいました。道中でもやってみます。

ヒットコンボ関連は後回しにしていました。
ISLe さんが書きました:参考にしたスクショのゲームは道中とボスのシーンではレイアウトが違うので、先にやるのは道中のほうが良いと思います。
ボスシーンに移行するとき画面のパーツが移動するので、実際にどの部分がどういうふうに動いているか見るともっと分かりやすいですが。

いまできる範囲で『設計』すると実際にできる範囲よりずっと規模の小さいものになってしまうと思います。
特に初心者にとって『実装』できるかどうかでふるいにかけるべき問題を『設計』に持ち込むと成長を止めてしまうことになると思います。
突拍子もない仕様を思い付いても困りますが、そうならないためにもスクショを参考にしての訓練は有効だと思います。

言葉にできれば実装できるとわたしは思います。
ありがとうございます。これから道中のスクショを調べてやって見ます。
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#39

投稿記事 by Rittai_3D » 6年前

現在、道中のスクショから想定画面を作成していますが、ボス戦とあまり変わらないです。v0002.pngの画像に雑魚を付け加えただけの物になりました。( 現場報告 )

また、ISLe様から指摘がありましたヒットコンボ関連はシューティングの基礎が出来てからの方がいいでしょうか?
初心者です

メリモ

Re: ゲームのオブジェクト指向について

#40

投稿記事 by メリモ » 6年前

C++使えたら全ての言語余裕でしょうってくらいC++はむずいですね。
JavaがC++の下位互換って聞いてびっくりしました。Javaも相当難しいんですけどね。クラスの大半は意味不明です。
Javaはハードとかにも詳しくないとやってられないと思いますね。頑張って下さい。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: ゲームのオブジェクト指向について

#41

投稿記事 by Dixq (管理人) » 6年前

> Javaはハードとかにも詳しくないとやってられないと思いますね。

真逆だと思います。
CはともかくJavaのような高級言語はハードに依存することなくかけることが利点であり、
世界で一番良く使われている言語であるだけあって非常に使いやすく作りこまれていると思います。
Androidアプリを作る時にいつもJavaを使いますが非常に使いやすい言語だと私は思いますよ。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#42

投稿記事 by softya(ソフト屋) » 6年前

ISLeさんの言うスクショからものはあくまで訓練ですので、やるやらないは別にしてオブジェクト対象物を全部上げることに意義があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

メリモ

Re: ゲームのオブジェクト指向について

#43

投稿記事 by メリモ » 6年前

すいません。このままだと荒れると判断して削除させて頂きました。wwwwを使うことじたい荒れる原因です。 by softya(ソフト屋) 22:52ごろ。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#44

投稿記事 by softya(ソフト屋) » 6年前

もう言っていることがめちゃくちゃです。
C言語の方も理解度が怪しいと納得しました。

元を削除いたしました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 9年前
住所: 北海道札幌市
連絡を取る:

Re: ゲームのオブジェクト指向について

#45

投稿記事 by Dixq (管理人) » 6年前

メリモさんは言っていることがおかし過ぎます・・。
ちょっと話が横道にそれましたね、これ以上ここで、CやJavaの話はしない方が良いようです。ごめんなさい。

(softyaさんの対応に沿って私も前言撤回します。ここではこれ以上話さないようにします)

さて、
オブジェクト指向での設計についてですが、
http://dixq.net/rp/
の下に「龍神録C++版オープンソース化計画は第三回あたりで中断中・・。」ってリンクがあるんで、
参考になるか分かりませんが、参考になればどうぞ。
第二回にクラス図があります。

メリモ

Re: ゲームのオブジェクト指向について

#46

投稿記事 by メリモ » 6年前

↑上なんだ?
僕は自分で削除してないですが、あなた誰ですか?勝手に人の名前騙らないで下さい。 softya(ソフト屋)が削除しました。

管理人さん
ハードっていうからおかしいんですね。Javaはシステマチックで難しいってことです。
それとロックとかスレッドとか言いたかっただけです
管理人さんプログラマーで僕素人なんだから手加減してくださいよ

「添削」 荒れる原因になる口調を修正させて頂きます。  by softya(ソフト屋) 23:09ごろ。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#47

投稿記事 by softya(ソフト屋) » 6年前

申し訳ありませんが荒れる原因と判断し管理人権限で添削しております。3D_3Dさんの迷惑になるので、3D_3Dさんの質問と関係の無い書き込みはご遠慮ください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

メリモ

Re: ゲームのオブジェクト指向について

#48

投稿記事 by メリモ » 6年前

そういえば人のスレでしたね。自重します。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#49

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:ISLeさんの言うスクショからものはあくまで訓練ですので、やるやらないは別にしてオブジェクト対象物を全部上げることに意義があります。
訓練をしないとプログラミングは上達しないような気がするのでやります。

質問ですが、オブジェクト指向は対象物ごとにcppファイルやclassなどを分けることですよね?
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#50

投稿記事 by softya(ソフト屋) » 6年前

対象物の定義が微妙ですが、眼に見えない物も含めてクラスに分けることです。ファイルを分けるのは別の単位の話なのでオブジェクト指向とは完全には関係ないですね。

【補足】
実装上は、管理クラスや制御クラスが必要になる場合もあります。これが設計上と実装上で違うって事ですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#51

投稿記事 by Rittai_3D » 6年前

>>Dixq様

返信ありがとうございます。
Dixq (管理人) さんが書きました: さて、
オブジェクト指向での設計についてですが、
http://dixq.net/rp/
の下に「龍神録C++版オープンソース化計画は第三回あたりで中断中・・。」ってリンクがあるんで、
参考になるか分かりませんが、参考になればどうぞ。
第二回にクラス図があります。
拝見させていただきました。オブジェクトの分け方の参考にさせていただきます。

いままでオブジェクト指向を全く意識しないでプログラミングしてきたので、とても参考になります。

クラス図もあまり書いたことがないのでオブジェクト指向の理解を深めるとともに設計するように頑張ります。
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#52

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:対象物の定義が微妙ですが、眼に見えない物も含めてクラスに分けることです。ファイルを分けるのは別の単位の話なのでオブジェクト指向とは完全には関係ないですね。

【補足】
実装上は、管理クラスや制御クラスが必要になる場合もあります。これが設計上と実装上で違うって事ですね。
ファイルを分けるのは完全には関係無いのですか。

では、C言語でオブジェクト指向プログラミングする場合はどのようにすればいいと思いますか?C++のようにC言語はclassが無いので気になっています。
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#53

投稿記事 by softya(ソフト屋) » 6年前

C言語はファイルで分けるのが良いと思います。

いや、もっと面倒なC言語によるオブジェクト指向はありますけどね。
これはC++よりもある意味面倒なので。
「C 言語によるオブジェクト記述法 COOL」 ← 参考
http://www.sage-p.com/process/cool.htm
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#54

投稿記事 by Rittai_3D » 6年前

>>softya様

返事ありがとうございます。
softya(ソフト屋) さんが書きました:C言語はファイルで分けるのが良いと思います。

いや、もっと面倒なC言語によるオブジェクト指向はありますけどね。
これはC++よりもある意味面倒なので。
「C 言語によるオブジェクト記述法 COOL」 ← 参考
http://www.sage-p.com/process/cool.htm
C言語はファイルで分けるのですか…てっきり構造体みたいなやつでクラスもどきつくって〜とかすると思いまして質問させていただきました。

リンク先をざっと見させていただきましたが、確かに面倒なことになってますね。取り敢えず、C言語でファイルで分けてやります。
初心者です

KORYUOH
記事: 44
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#55

投稿記事 by KORYUOH » 6年前

クラス図が書けるようになってきたら
ゲームの取説からクラス図を作ってみるといい訓練になるかもしれません

実際、私の学校の授業で一回やったので
C言語を使うと自分の足を誤って撃ち抜いてしまうことがある。 C++を使えばそのような間違いを犯しにくくなる。しかし、やってしまったときには足全体が無くなる。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#56

投稿記事 by Rittai_3D » 6年前

>>KORYUOH様

返信ありがとうございます。
KORYUOH さんが書きました:クラス図が書けるようになってきたら
ゲームの取説からクラス図を作ってみるといい訓練になるかもしれません

実際、私の学校の授業で一回やったので
クラス図自体書いたことが無いので(1〜2回程度です。)まずはクラス図を書けるように訓練します。

あと、自分はゲームをほとんど持っていませんので、適当なフリーゲームをダウンロードしてみます。

(本当にゲームを持っていません。10年くらい前のポケモンなら持ってるはずですが)
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#57

投稿記事 by softya(ソフト屋) » 6年前

KORYUOH さんが書きました:クラス図が書けるようになってきたら
ゲームの取説からクラス図を作ってみるといい訓練になるかもしれません

実際、私の学校の授業で一回やったので
それは中々良さそうですね。選ぶゲーム次第で大変なことにはなりそうですが。

で、分け方ですが。
とりあえずファイルを分けただけだと継承とか出来ないので、オブジェクト化・カプセル化を徹底してください。
構造体とか形から入るより、そちらを徹底した方が良いと思います。

なお、クラスポインタの代わりに構造を見せない構造体ポインタを返すと言う実装はC言語でも比較的楽なのでやってみても良いと思います。
※ 前方宣言した構造体のポインタを使います。私のRPG講座でも使っています。

【補足】
出来ることは言うなればカプセル化とインスタンスの生成です。
「マイ 日記 • C言語交流フォーラム ~ mixC++ ~」 ← RPG講座の日記です。
http://dixq.net/forum/blog.php?u=114&sd=a&c=2&start=10
「ちょー簡単RPG講座7-1 ゲーム本編画面遷移」で解説しているのが、それです。他にも使ってますけどね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#58

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:
KORYUOH さんが書きました:クラス図が書けるようになってきたら
ゲームの取説からクラス図を作ってみるといい訓練になるかもしれません

実際、私の学校の授業で一回やったので
それは中々良さそうですね。選ぶゲーム次第で大変なことにはなりそうですが。

で、分け方ですが。
とりあえずファイルを分けただけだと継承とか出来ないので、オブジェクト化・カプセル化を徹底してください。
構造体とか形から入るより、そちらを徹底した方が良いと思います。

なお、クラスポインタの代わりに構造を見せない構造体ポインタを返すと言う実装はC言語でも比較的楽なのでやってみても良いと思います。
※ 前方宣言した構造体のポインタを使います。私のRPG講座でも使っています。
当方、あまりゲームをやらないので(3回め)

オブジェクト化やカプセル化…ですか?聞いたことはあるけどしたことは無いので試行錯誤しながらやってみます。

RPG講座を見させていただきます。頑張ってオブジェクト指向プログラミングをマスターしたいと思います。

明日以降に自分なりにカプセル化やオブジェクト化したコードを貼るので採点していたたまければ幸いです
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#59

投稿記事 by Rittai_3D » 6年前

とりあえず、自分なりに書いてみました。カプセル化やオブジェクト化を調べながらやってみました。

main.cpp

コード:

#include "DxLib.h"
#include "key.h"
#include "player.h"
#include "BackGrd.h"

bool ProcessLoop()
{
	if( ProcessMessage()      != 0 ) return false;
	if( ClearDrawScreen()     != 0 ) return false;
	if( GetHitKeyStateAll_2() != 0 ) return false;
	return true;
}

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
	ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );

	ch_t plry;

	Player_Init( &plry );
	Player_Load();
	BG_Init();
	BG_Load();

	while( ProcessLoop() ){
		BG_Calc();
		Player_Calc( &plry );

		BG_Draw();
		Player_Draw( plry ); 

		ScreenFlip();
	}

	Player_Fina();
	BG_Fina();

	DxLib_End();				// DXライブラリ使用の終了処理
	return 0;				// ソフトの終了 
}
player.cpp

コード:

#include "DxLib.h"
#include "key.h"
#include "player.h"
#include <math.h>

static 	double Speed   = 4.5; // 移動スピード

static int m_img_ch;

static int m_img_ysize[ 3 ] = { 0, 48, 96};
static int m_img_xsize[ 8 ] = { 0, 32, 64, 96, 128, 160, 192, 224};

void Player_Init( ch_t* player )
{
	memset( player, 0, sizeof( ch_t )); // 初期化

	player->x = 384/2;
	player->y = 448*3/4;
}

void Player_Load()
{
	m_img_ch = LoadGraph( "dat/pl00.png" );
}

void Player_Draw( ch_t  player )
{
	DrawRectRotaGraphF( (float)player.x, (float)player.y, 
		m_img_xsize[0], m_img_ysize[0],
		30,	46, 1.0f, 0.0f, m_img_ch, 
		TRUE, FALSE );
}

void Player_Calc( ch_t* player )
{
	bool joge_flag = false, sayu_flag = false; // 上下左右移動フラグ
	double naname  = 1.0; // 斜めのときの速度

	if( CheckStateKey( KEY_INPUT_DOWN ) != 0 ){ player->y += Speed/naname; joge_flag = true; }
	if( CheckStateKey( KEY_INPUT_UP   ) != 0 ){ player->y -= Speed/naname; joge_flag = true; }
	if( CheckStateKey( KEY_INPUT_LEFT ) != 0 ){ player->x -= Speed/naname; sayu_flag = true; }
	if( CheckStateKey( KEY_INPUT_RIGHT) != 0 ){ player->x += Speed/naname; sayu_flag = true; }

	if( CheckStateKey( KEY_INPUT_LSHIFT ) != 0 ) Speed = 2.5;
	else										 Speed = 4.5;

	if( joge_flag && sayu_flag ) naname = sqrt( 2.0 );

	if( player->x <  48 ) player->x = 48;
	if( player->x > 400 ) player->x = 400;
	if( player->y <  38 ) player->y = 38;
	if( player->y > 440 ) player->y = 440;
}
void Player_Fina()
{
	DeleteGraph( m_img_ch );
}
BackGrd.cpp

コード:

#include "DxLib.h"
#include "BackGrd.h"

static int m_cnt;
static int m_img_back;

void BG_Init()
{
	m_cnt = 0;
}

void BG_Load()
{
	m_img_back = LoadGraph( "dat/Back.png" );
}

void BG_Draw()
{
	SetDrawArea( 32 , 16 , 416 , 464 ) ;//描画可能エリアを設定
	DrawGraph( -32, m_cnt%480+16-480, m_img_back, FALSE);
	DrawGraph( -32, m_cnt%480+16    , m_img_back, FALSE);
	SetDrawArea( 0, 0, 640, 480);//エリアを戻す
}

void BG_Calc()
{
	m_cnt++;
}

void BG_Fina()
{
	DeleteGraph( m_img_back );
}
key.cpp

コード:

#include "DxLib.h"
#include "key.h"

static unsigned int stateKey[ 256 ];

int GetHitKeyStateAll_2()
{
	char GetHitKeyStateAll_Key[ 256 ];
 
	GetHitKeyStateAll( GetHitKeyStateAll_Key );
    
	for(int i=0;i<256;i++){
        if( GetHitKeyStateAll_Key[i]==1 ) stateKey[i] ++;
        else                              stateKey[i] = 0;
    }
    return 0;
}

int CheckStateKey( unsigned char Handle )
{
        return stateKey[ Handle ];
}

player.h

コード:

#pragma once

typedef struct
{
	int flag;
	double x,y;
} ch_t;

void Player_Init( ch_t* player );
void Player_Load();
void Player_Draw( ch_t  player );
void Player_Calc( ch_t* player );
void Player_Fina();
key.h

コード:

int GetHitKeyStateAll_2();
int CheckStateKey( unsigned char );
BackGrd.h

コード:

#pragma once

void BG_Init();
void BG_Load();
void BG_Draw();
void BG_Calc();
void BG_Fina();
v0002.pngを元に自分なりに作ってみました。また、ゲームの設計と分割コンパイル (3)( http://dixq.net/g/d_05.html )を参考にさせていただきました。オブジェクト化やカプセル化などで間違っているところがありましたら、ご指摘お願いします。
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#60

投稿記事 by softya(ソフト屋) » 6年前

とりあえず、気になったこと
・名前は素直に! FinaじゃなくFinal。一文字節約して読みづらなくなっても意味ないです。
・Playerの構造体の実構造を外部に公開する必要などありません。構造体の前方宣言でカプセル化できます。
つまり、今はカプセル化出来てないよって事です。 mallocしなくても良いので、実体定義はplayer.cppで行いましょう。
・ch_tはプレーヤー専用でしょうか? であれば名前に気をつけるべきです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#61

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:とりあえず、気になったこと
・名前は素直に! FinaじゃなくFinal。一文字節約して読みづらなくなっても意味ないです。
・Playerの構造体の実構造を外部に公開する必要などありません。構造体の前方宣言でカプセル化できます。
つまり、今はカプセル化出来てないよって事です。 mallocしなくても良いので、実体定義はplayer.cppで行いましょう。
・ch_tはプレーヤー専用でしょうか? であれば名前に気をつけるべきです。
詳しくありがとうございます。

・名前はPlayer_~の部分がみんな4文字ですごく気になったのでFinaにしました。修正します。
・構造体の前方宣言はやったことがないのでこちらも調べながらやってみます。
・ch_tはプレイヤー専用の構造体です。player_tにします。

これらを踏まえてもう一度やってみます。

#そういえば、上のコードはVisual C++ 2010でコンパイルしています。自分のPCは訳ありで使用できませんでした。
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#62

投稿記事 by softya(ソフト屋) » 6年前

忘れてました!
・どうにもマジックナンバーが散見されます。出来るだけ減らしましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
usao
記事: 1565
登録日時: 6年前

Re: ゲームのオブジェクト指向について

#63

投稿記事 by usao » 6年前

コード:

typedef struct
{
    int flag;
    double x,y;
} ch_t;
これだと,flagやx,yを外部からいじれる→カプセル化 にはなっていない.
それと,無名構造体は避けた方がよいです(前方宣言できなくなる).

で,ch_t型インスタンスがもし自機1つ分しか作られないのであれば,
背景と同じようにch_t変数の存在を隠ぺいしてしまえば良いのかな.

ch_t型を他のもの(例えば敵とか)でも使いまわす予定なら,
「新しいch_t型インスタンスを作成し,そのハンドルを返す」ような関数をPlayer.hにて公開し,
その他の,現在ch_t*を引数としている関数の引数を,ch_t*ではなくそのハンドルの型 に変更する.
(あとは,当然ながら,インスタンスを削除する関数も追加)

Player_Calc()がキーの状態を見に行くのは微妙.
キーが押されたかどうか(というよりも上下あるいは左右に動くべきかどうか)という情報を引数に受ける方がいいと思う.
#あと,Player_Calc()内のnanameって効いてなくないですか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#64

投稿記事 by softya(ソフト屋) » 6年前

そういえばそうですね。
player_tは1つしか無いなら外部公開の必然が無いですね。
全部、隠して良いでしょう。

敵の時には公開を考慮する必要有りですけどね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
usao
記事: 1565
登録日時: 6年前

Re: ゲームのオブジェクト指向について

#65

投稿記事 by usao » 6年前

うーん,あと,私だったらなるべく各オブジェクトには自身の描画処理を行わせない方針でやるかも.
仮に各オブジェクトに自身の描画を行わせるという方式を取るのだとしても
画像のロードと始末とか まではやらせたくないかなぁ…

各コードがDXLibへ依存することは妥協するとしても
画像ロード(と破棄)はmain等の外側で行って,例えば

コード:

//hImgにはpCHが示すインスタンスが描画の際に用いる画像のハンドル値を指定する.
//この関数は,成功時には0でない値を,エラー時は0を返す.
int Player_Init( ch_t *pCH, int hImg )
{
  //hImgが,ch_tの表示用に見合うものかどうかを判定し,ダメならエラーとする
  if( 画像サイズとか調べたらダメっぽい )
  {  return 0; }
  ...
  return 1;
}
みたくしてインスタンスに画像を指定する形を取るとかすると思う.

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#66

投稿記事 by softya(ソフト屋) » 6年前

それも方針ですが、Dixqさんと私の方式だとクラス内でハンドルを得てますね。
リソース管理をどうするかの設計の問題なので、どちらが良いとは言えませんが、自身のリソース確保を外部に委ねる気がするので私は外部から受け取るのはちょっと避けたいです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#67

投稿記事 by Rittai_3D » 6年前

>>usao様

返信ありがとうございます。
usao さんが書きました:

コード:

typedef struct
{
    int flag;
    double x,y;
} ch_t;
これだと,flagやx,yを外部からいじれる→カプセル化 にはなっていない.
それと,無名構造体は避けた方がよいです(前方宣言できなくなる).

で,ch_t型インスタンスがもし自機1つ分しか作られないのであれば,
背景と同じようにch_t変数の存在を隠ぺいしてしまえば良いのかな.

ch_t型を他のもの(例えば敵とか)でも使いまわす予定なら,
「新しいch_t型インスタンスを作成し,そのハンドルを返す」ような関数をPlayer.hにて公開し,
その他の,現在ch_t*を引数としている関数の引数を,ch_t*ではなくそのハンドルの型 に変更する.
(あとは,当然ながら,インスタンスを削除する関数も追加)

Player_Calc()がキーの状態を見に行くのは微妙.
キーが押されたかどうか(というよりも上下あるいは左右に動くべきかどうか)という情報を引数に受ける方がいいと思う.
#あと,Player_Calc()内のnanameって効いてなくないですか?
今まで無名構造体を使ってきたので慣れてませんが前方宣言に慣れて行きたいです。

Player_Move関数を作ってやってみます。

質問ですが、引数に受けるとはどういう意味でしょうか?

# 確かに効きませんね。修正します。
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#68

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:そういえばそうですね。
player_tは1つしか無いなら外部公開の必然が無いですね。
全部、隠して良いでしょう。

敵の時には公開を考慮する必要有りですけどね。
とりあえず全部隠してみます。

また、まだ敵に関する事は何一つやっておりませんが、敵の方が大変そうですね。STGは完成させておきたいので、頑張ります。
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#69

投稿記事 by Rittai_3D » 6年前

>>usao様

返信ありがとうございます。
usao さんが書きました:うーん,あと,私だったらなるべく各オブジェクトには自身の描画処理を行わせない方針でやるかも.
仮に各オブジェクトに自身の描画を行わせるという方式を取るのだとしても
画像のロードと始末とか まではやらせたくないかなぁ…

各コードがDXLibへ依存することは妥協するとしても
画像ロード(と破棄)はmain等の外側で行って,例えば

コード:

//hImgにはpCHが示すインスタンスが描画の際に用いる画像のハンドル値を指定する.
//この関数は,成功時には0でない値を,エラー時は0を返す.
int Player_Init( ch_t *pCH, int hImg )
{
  //hImgが,ch_tの表示用に見合うものかどうかを判定し,ダメならエラーとする
  if( 画像サイズとか調べたらダメっぽい )
  {  return 0; }
  ...
  return 1;
}
みたくしてインスタンスに画像を指定する形を取るとかすると思う.
自分としては、引数が長くなるのが嫌なので今迄はそのような方法をとっていませんでした。本当にそれだけの理由です。

質問ですが、インスタンスに画像を指定する形のメリットとデメリットを教えて頂きたいです。
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#70

投稿記事 by Rittai_3D » 6年前

>>sofrya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:それも方針ですが、Dixqさんと私の方式だとクラス内でハンドルを得てますね。
リソース管理をどうするかの設計の問題なので、どちらが良いとは言えませんが、自身のリソース確保を外部に委ねる気がするので私は外部から受け取るのはちょっと避けたいです。
なぜリソース確保を外部に委ねることを避けたいのですか?初心者のちょっとした質問です。
初心者です

アバター
usao
記事: 1565
登録日時: 6年前

Re: ゲームのオブジェクト指向について

#71

投稿記事 by usao » 6年前

無名構造体がどうの の話は

コード:

typedef struct ch_t //←ここに構造体の名前を書くようにしようね
{
    int flag;
    double x,y;
} ch_t;

//そうすれば,別のファイルにて前方宣言が使える.

//ch_tが定義されているヘッダをincludeしなくても
struct ch_t;  //このように「ch_tというstructがあるらしいよ」という宣言を書けば…(名前が無いとこれが書けない)

ch_t CH;  //これは無理だけど
ch_t *pCH;  //こっちが可能になる.
ということです.(ch_tがどんな変数を抱えているかとかを知らなくていい場所にはそういう情報を公開せずに済む.)

>質問ですが、引数に受けるとはどういう意味でしょうか?
例えばこんな感じ.

コード:

const unsigned char DIRECTION_LEFT = 0x01;
const unsigned char DIRECTION_RIGHT = 0x02;
const unsigned char DIRECTION_UP = 0x04;
const unsigned char DIRECTION_DOWN = 0x08;

//dirには今回移動すべき方向を示す値を指定する.
//これは,↑の4つの値をORでまとめたも値にする.左上なら DEIRECTION_LEFT | DIRECTION_UP とか.
void Player_Calc( ch_t *pCH, unsigned char dir )
{
  if( dir & DIRECTION_LEFT ){  ←方向移動処理...  }
  ...
}
キー入力の判定はPlayer_Calc()呼び出し側でやり,その結果を引数に渡す.
自機オブジェクトに「キー押下で動く」という仕様を含めなくてよいと思う.
こうしておけばキー押されてなくても強制的に動かしたりもできる.(イベント的なシーンとか,リプレイとか?)

>画像をどこで読んだり捨てたりするか の話
これはまぁ好きな方法でやればいいのかな.
各オブジェクトが内部で自分が使うのをロードする方式だと
・同じリソースを複数個所で共有するとかしたくなった場合(わかりやすいとこだと,同じ種類の敵が複数出てくるとか)
 をどういう風に扱うのか
・いろんなタイミングで「画像がロードできない」のようなエラーが発生し得るのがうざい
といった点に適切な対応さえすれば,わかりやすい方式だとは思います.

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#72

投稿記事 by softya(ソフト屋) » 6年前

リソースを自分で管理するのは、利用する全部のリソースを見渡しやすいから(可読性・メンテナンス性)です。
重複する画像リソースなど問題は、画像管理マネージャに管理を一存して画像ファイル名を引数に画像管理マネージャから画像ハンドルを貰う方法があります。と言うか大抵そうします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#73

投稿記事 by softya(ソフト屋) » 6年前

あと移動方向をusaoさんの言うように外部から受け渡すにはメリットとデメリットがあります。
メリットは、usaoさんの言うとおりですが、デメリットとしてキー操作に対する処理がプレーヤーのオブジェクトに無いのは直感を裏切る可能性が高いと思います。
どこのオブジェクトにあるべきかと言うのは重要問題で、上位のマネージャ・オブジェクトが細かい処理まで受け持つのはオブジェクトの特性を無視することになりかねません。
と言うことで私はplayerオブジェクト内部派です。

違う意見が2つの話が出てきて混乱すると思いますが、まぁ現場でもよく有ることです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
usao
記事: 1565
登録日時: 6年前

Re: ゲームのオブジェクト指向について

#74

投稿記事 by usao » 6年前

>重複する画像リソースなど問題は、画像管理マネージャに管理を一存して画像ファイル名を引数に画像管理マネージャから画像ハンドルを貰う方法があります。と言うか大抵そうします。

こんな感じでしょうか.

コード:

ImgManager *GetImgManagerInstance();  //画像リソースを一元管理するオブジェクトへのポインタを返す

int ObjectInitialize( Object *pObjInstance, const char *ImgFileName )  //←これはさすがに受け取るのだと思う
{
   pObjInstance->ImgHandle = GetImgManagerInstance()->GetImgHandle( ImgFIleName );
   if( pObjInstance->ImgHandle == INVALID_IMG_HANDLE_VALUE ) //※INVALID_IMG_HANDLE_VALUE:無効なハンドルを指す何らかの値
   {  エラー }
   ...
}
キーの処理も内部ですか……オブジェクトにどこまでの責任を持たせるか?という思想の違いなんでしょうね.
とにかく質問者様はご自身がやりやすい(わかりやすい&コーディングしやすい?)方法を選択されればよいと思います.

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#75

投稿記事 by Rittai_3D » 6年前

>>usao様

返信ありがとうございます。
usao さんが書きました:無名構造体がどうの の話は

コード:

typedef struct ch_t //←ここに構造体の名前を書くようにしようね
{
    int flag;
    double x,y;
} ch_t;

//そうすれば,別のファイルにて前方宣言が使える.

//ch_tが定義されているヘッダをincludeしなくても
struct ch_t;  //このように「ch_tというstructがあるらしいよ」という宣言を書けば…(名前が無いとこれが書けない)

ch_t CH;  //これは無理だけど
ch_t *pCH;  //こっちが可能になる.
ということです.(ch_tがどんな変数を抱えているかとかを知らなくていい場所にはそういう情報を公開せずに済む.)
おお!こんなことが出来るなんて!感動しました。

今まで知らずにやってきたのが恥ずかしくなりました。

今すぐにでもソースを修正したいですが、今日の分の課題が終わらないので明日修正します。
usao さんが書きました:>質問ですが、引数に受けるとはどういう意味でしょうか?
例えばこんな感じ.

コード:

const unsigned char DIRECTION_LEFT = 0x01;
const unsigned char DIRECTION_RIGHT = 0x02;
const unsigned char DIRECTION_UP = 0x04;
const unsigned char DIRECTION_DOWN = 0x08;

//dirには今回移動すべき方向を示す値を指定する.
//これは,↑の4つの値をORでまとめたも値にする.左上なら DEIRECTION_LEFT | DIRECTION_UP とか.
void Player_Calc( ch_t *pCH, unsigned char dir )
{
  if( dir & DIRECTION_LEFT ){  ←方向移動処理...  }
  ...
}
キー入力の判定はPlayer_Calc()呼び出し側でやり,その結果を引数に渡す.
自機オブジェクトに「キー押下で動く」という仕様を含めなくてよいと思う.
こうしておけばキー押されてなくても強制的に動かしたりもできる.(イベント的なシーンとか,リプレイとか?)
これはビット演算ですか?ビット演算やシフト演算は苦手なのであまりしたく無いです…
usao さんが書きました:>画像をどこで読んだり捨てたりするか の話
これはまぁ好きな方法でやればいいのかな.
各オブジェクトが内部で自分が使うのをロードする方式だと
・同じリソースを複数個所で共有するとかしたくなった場合(わかりやすいとこだと,同じ種類の敵が複数出てくるとか)
 をどういう風に扱うのか
・いろんなタイミングで「画像がロードできない」のようなエラーが発生し得るのがうざい
といった点に適切な対応さえすれば,わかりやすい方式だとは思います.
なるほど。自分はこのやり方では一度もやってなかったので、参考になります。
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#76

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:リソースを自分で管理するのは、利用する全部のリソースを見渡しやすいから(可読性・メンテナンス性)です。
重複する画像リソースなど問題は、画像管理マネージャに管理を一存して画像ファイル名を引数に画像管理マネージャから画像ハンドルを貰う方法があります。と言うか大抵そうします。
うーん、難しそうです…

自分の力で出来そうならそのようにやりますが、今の実力で出来るとは思いません…

しかし、出来るようにプログラムの勉強をします。
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#77

投稿記事 by Rittai_3D » 6年前

>>usao様

返信ありがとうございます。
usao さんが書きました:>重複する画像リソースなど問題は、画像管理マネージャに管理を一存して画像ファイル名を引数に画像管理マネージャから画像ハンドルを貰う方法があります。と言うか大抵そうします。

こんな感じでしょうか.

コード:

ImgManager *GetImgManagerInstance();  //画像リソースを一元管理するオブジェクトへのポインタを返す

int ObjectInitialize( Object *pObjInstance, const char *ImgFileName )  //←これはさすがに受け取るのだと思う
{
   pObjInstance->ImgHandle = GetImgManagerInstance()->GetImgHandle( ImgFIleName );
   if( pObjInstance->ImgHandle == INVALID_IMG_HANDLE_VALUE ) //※INVALID_IMG_HANDLE_VALUE:無効なハンドルを指す何らかの値
   {  エラー }
   ...
}
キーの処理も内部ですか……オブジェクトにどこまでの責任を持たせるか?という思想の違いなんでしょうね.
とにかく質問者様はご自身がやりやすい(わかりやすい&コーディングしやすい?)方法を選択されればよいと思います.
自分は、多少長くなってもわかりやすいように書きたいと思います。後で自分で書いたコードを見たときに混乱しそうな気がするので…
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#78

投稿記事 by Rittai_3D » 6年前

今日、プログラムを書いていて思ったのですが、player.hに構造体を書いてありますよね。で、player.hをmain.cppでincludeしているので隠蔽できてないのではないでしょうか?

あと、それ以外はちゃんと隠蔽できていますか?
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#79

投稿記事 by softya(ソフト屋) » 6年前

3D_3D さんが書きました:今日、プログラムを書いていて思ったのですが、player.hに構造体を書いてありますよね。で、player.hをmain.cppでincludeしているので隠蔽できてないのではないでしょうか?

あと、それ以外はちゃんと隠蔽できていますか?
はい。出来ていないです。
なので私とusaoさんが前方宣言の話をしていました。
前方宣言を上手く使うことで構造体の構造を隠蔽できます。
※ 私のRPG講座が例になります。

他は相互作用がないので、今のところ問題ないです。
ただ、今後相互作用を追加していく時にカプセル化を守れるかが課題です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#80

投稿記事 by Rittai_3D » 6年前

softya(ソフト屋) さんが書きました:はい。出来ていないです。
なので私とusaoさんが前方宣言の話をしていました。
前方宣言を上手く使うことで構造体の構造を隠蔽できます。
※ 私のRPG講座が例になります。

他は相互作用がないので、今のところ問題ないです。
ただ、今後相互作用を追加していく時にカプセル化を守れるかが課題です。
では、struct.hのようなファイルを作ってそこに書いたほうがいいでしょうか?

カプセル化、オブジェクト化などはやったことがないので四苦八苦しています。
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#81

投稿記事 by softya(ソフト屋) » 6年前

3D_3D さんが書きました:
softya(ソフト屋) さんが書きました:はい。出来ていないです。
なので私とusaoさんが前方宣言の話をしていました。
前方宣言を上手く使うことで構造体の構造を隠蔽できます。
※ 私のRPG講座が例になります。

他は相互作用がないので、今のところ問題ないです。
ただ、今後相互作用を追加していく時にカプセル化を守れるかが課題です。
では、struct.hのようなファイルを作ってそこに書いたほうがいいでしょうか?

カプセル化、オブジェクト化などはやったことがないので四苦八苦しています。
C言語のカプセル化の場合は、構造体の実構造は構造体のメンバを使う関数群があるcppファイルの先頭に記述します。
そうしておいて、前方宣言だけをヘッダファイルに記述します。
struct.hは使いません。私のRPG講座の例もそうなっているはずです。

私のRPG講座の例で分からないことがあれば聞いてくださいね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#82

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:C言語のカプセル化の場合は、構造体の実構造は構造体のメンバを使う関数群があるcppファイルの先頭に記述します。
そうしておいて、前方宣言だけをヘッダファイルに記述します。
struct.hは使いません。私のRPG講座の例もそうなっているはずです。

私のRPG講座の例で分からないことがあれば聞いてくださいね。

つまり、関数のプロトタイプ宣言みたいなものだと解釈してもよろしいですか?

>私のRPG講座の例で分からないことがあれば聞いてくださいね

優しいお言葉ありがとうございます。理解できるように頑張ります。
最後に編集したユーザー Rittai_3D on 2013年8月03日(土) 16:59 [ 編集 1 回目 ]
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#83

投稿記事 by softya(ソフト屋) » 6年前

> つまり、関数のプロトタイプ宣言みたいなものだと解釈してもよろしいですか?

そういう事です。前方宣言はサイズな不明な構造体となるのでポインタでしか扱えないものとなります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#84

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:> つまり、関数のプロトタイプ宣言みたいなものだと解釈してもよろしいですか?

そういう事です。前方宣言はサイズな不明な構造体となるのでポインタでしか扱えないものとなります。
だからポインタを使用するのですか!

引数に渡さなないほうがいいですよね?
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#85

投稿記事 by softya(ソフト屋) » 6年前

ポインタであれば引数にできます。ここが多分初心者には難しいと思います。
逆に実体はPlayer.cpp以外で作れないためmainなどで実体宣言は出来なくなります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#86

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:ポインタであれば引数にできます。ここが多分初心者には難しいと思います。
逆に実体はPlayer.cpp以外で作れないためmainなどで実体宣言は出来なくなります。
では、staticをつけてグローバルに player_t *player; とかしたほうがいいですか?

#ch_tはplayer_tに変更しました
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#87

投稿記事 by softya(ソフト屋) » 6年前

staticが必要かどうかはそれだけの情報だと分かりませんが、ポインタ変数であれば不要の可能性が高いです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
usao
記事: 1565
登録日時: 6年前

Re: ゲームのオブジェクト指向について

#88

投稿記事 by usao » 6年前

カプセル化の話が既存のものから読み取りにくいのかもしれない(?)ので,簡単な例.

コード:

//[Player.h]
struct Player_t;  //前方宣言

Player_t *CreatePlayerInstance();  //新しいPlayer_tインスタンスを生成し,そのインスタンスへのポインタを返す
void ReleasePlayerInstance( Player_t *pReleaseTargetInstance );  //指定インスタンスを破棄する
void SetPlayerStatusValue( Player_t *pSetTargetInstance, int status );  //「ステータス」として何らかの値を設定しておける機能がある
int GetPlayerStatusValue( const Player_t *pPrintTargetInstance );  //設定してあるステータス値を得る
たとえばこんなのをmain側でincludeした場合を考えるとわかりやすい.
Player_t型の定義や関数群の実装はたとえばPlayer.cppとかにあり,main側からは見えない.
main側はPlayer_tがどんな型なのかわからないので,構造体メンバ変数をいじったりできない.
ただ,必要な仕事は関数に任せればよいということを知っているだけ.

[追記]
一応main側の雰囲気も書いときますね.

コード:

#include "Player.h"
int main()
{
  //Player_tインスタンスを作成
  Player_t *pPlayerInstance = CreatePlayerInstance();

  //Player_t周りの処理は,処理関数にpPlayerInstanceを渡すことで行う
  ...
 int CurrPlayerStatus = GetPlayerStatusValue( pPlayerInstance );

 //不要になったらインスタンス破棄する
  ReleasePlayerInstance( pPlayerInstance );
  //※これ以降,pPlayerInstanceの指す先は無効となるので注意する.
  pPlayerInstance = NULL;  //念のためNULLにしておいたり.
  ...
}
#なんか最近すぐに勝手にログアウトされてしまうな…
オフトピック
No.74のコード…
全部Cで書かなきゃと思ってたのにC++が半端に混じった変な書き方になってしまっていますね……
最後に編集したユーザー usao on 2013年8月03日(土) 17:52 [ 編集 2 回目 ]

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#89

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:staticが必要かどうかはそれだけの情報だと分かりませんが、ポインタ変数であれば不要の可能性が高いです。
分かりました。ポインタにはstaticは不要ですね。
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#90

投稿記事 by Rittai_3D » 6年前

>>usao様

返信ありがとうございます。
usao さんが書きました:カプセル化の話が既存のものから読み取りにくいのかもしれない(?)ので,簡単な例.

コード:

//[Player.h]
struct Player_t; //前方宣言

Player_t *CreatePlayerInstance(); //新しいPlayer_tインスタンスを生成し,そのインスタンスへのポインタを返す
void ReleasePlayerInstance( Player_t *pReleaseTargetInstance ); //指定インスタンスを破棄する
void SetPlayerStatusValue( Player_t *pSetTargetInstance, int status ); //「ステータス」として何らかの値を設定しておける機能がある
int GetPlayerStatusValue( const Player_t *pPrintTargetInstance ); //設定してあるステータス値を得る
たとえばこんなのをmain側でincludeした場合を考えるとわかりやすい.
Player_t型の定義や関数群の実装はたとえばPlayer.cppとかにあり,main側からは見えない.
main側はPlayer_tがどんな型なのかわからないので,構造体メンバ変数をいじったりできない.
ただ,必要な仕事は関数に任せればよいということを知っているだけ.
オフトピック
No.74のコード…
全部Cで書かなきゃと思ってたのにC++が半端に混じった変な書き方になってしまっていますね……
サンプルありがとうございます。質問ですがmainではどのように書くのですか?

コード:

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )
{
	ChangeWindowMode( TRUE ), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );

	struct player_t* player;

	Player_Init( player );
	Player_Load();

	BG_Init();
	BG_Load();

	while( ProcessLoop() ){
		BG_Calc();
		Player_Calc( player );

		BG_Draw();
		Player_Draw( player ); 

		ScreenFlip();
	}

	Player_Final();
	BG_Final();

	DxLib_End();				// DXライブラリ使用の終了処理
	return 0;				// ソフトの終了 
}
と書いてしまっていいのでしょうか?

また、描写関数にはポインタを渡してもいいのでしょうか?
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#91

投稿記事 by softya(ソフト屋) » 6年前

> と書いてしまっていいのでしょうか?
Player_Init( player );
これだとポインタの更新ができないので、失敗します。
経験のため一度失敗してみたほうが良いと思います。
【補足】失敗して苦労したことは中々忘れないからです。

> また、描写関数にはポインタを渡してもいいのでしょうか?
それしか無いですね。
あとplayer構造体に、後々のため画像ハンドルも含めたほうが良いですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#92

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:> と書いてしまっていいのでしょうか?
Player_Init( player );
これだとポインタの更新ができないので、失敗します。
経験のため一度失敗してみたほうが良いと思います。
【補足】失敗して苦労したことは中々忘れないからです。

> また、描写関数にはポインタを渡してもいいのでしょうか?
それしか無いですね。
あとplayer構造体に、後々のため画像ハンドルも含めたほうが良いですね。
ポインタの更新ですか?調べながらやってみます。
分かりました。描写関数にポインタを渡します。

また、player_t にimg_hdlという変数を追加します。
初心者です

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 9年前
住所: 東海地方
連絡を取る:

Re: ゲームのオブジェクト指向について

#93

投稿記事 by softya(ソフト屋) » 6年前

私としては、このままで失敗してダメな理由を考えて欲しいです。
調べるのは失敗して考えたあとでお願いします。出来れば調べない方が良いかもしれません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2645
登録日時: 9年前
連絡を取る:

Re: ゲームのオブジェクト指向について

#94

投稿記事 by ISLe » 6年前

オブジェクト個別にカプセル化を追求するのは勉強としては良いのかもしれないけれど、最終的にゲームプログラムとしてインターフェースを統一することを考慮しておかなくても良いのでしょうかね。
『ゲームの~』というスレタイとの乖離を感じます。

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#95

投稿記事 by Rittai_3D » 6年前

>>softya様

返信ありがとうございます。
softya(ソフト屋) さんが書きました:私としては、このままで失敗してダメな理由を考えて欲しいです。
調べるのは失敗して考えたあとでお願いします。出来れば調べない方が良いかもしれません。
わかりました。プログラミング力をつけるために考えて見ます。
オフトピック
思いついたのは
・どのアドレスに割り振られるかわからないうちに初期化されるから、かなと思いました。
初心者です

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#96

投稿記事 by Rittai_3D » 6年前

>>ISLe様

返信ありがとうございます。
ISLe さんが書きました:オブジェクト個別にカプセル化を追求するのは勉強としては良いのかもしれないけれど、最終的にゲームプログラムとしてインターフェースを統一することを考慮しておかなくても良いのでしょうかね。
オブジェクト指向になれるためにSTGを作り始めたので全く考慮はして無いです。本格的に作るわけではないので意識するつもりはないと考えました。
ISLe さんが書きました:『ゲームの~』というスレタイとの乖離を感じます。
そうですね。シューティングゲームのオブジェクトは何?から始まってシューティングを作り始めてしまったので今更別トピックにしようと思いました。player部の隠蔽が終われば"オブジェクト指向でのシューティングゲームの作り方"みたいなトピックを立てます。
初心者です

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: ゲームのオブジェクト指向について

#97

投稿記事 by へにっくす » 6年前

3D_3D さんが書きました:・どのアドレスに割り振られるかわからないうちに初期化されるから、かなと思いました。
違います。
ヒントは、関数の受け渡し方です。
written by へにっくす

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#98

投稿記事 by Rittai_3D » 6年前

>>へにっくす様

返信ありがとうございます。
へにっくす さんが書きました:
3D_3D さんが書きました:・どのアドレスに割り振られるかわからないうちに初期化されるから、かなと思いました。
違います。
ヒントは、関数の受け渡し方です。
ヒントありがとうございます。ポインタではなく関数なんですね。また考えて見ます。

オフトピック
そういえば、player_t player;にしてPlayer_Init( &player );としたときはうまく行きましたが、
player_t *player;のときのPlayer_Init( player );は失敗します。

では、

コード:

player_t *player;
int test;
&test = player;
とかしたらどうなるでしょう。デバッガを駆使して値の変化を見て見ます。
初心者です

アバター
へにっくす
記事: 628
登録日時: 7年前
住所: 東京都

Re: ゲームのオブジェクト指向について

#99

投稿記事 by へにっくす » 6年前

3D_3D さんが書きました:そういえば、player_t player;にしてPlayer_Init( &player );としたときはうまく行きましたが、
player_t *player;のときのPlayer_Init( player );は失敗します。
C言語はすべて値渡し※なので、その値を変更しても戻ることはありません。ではなぜ&をつけるとうまくいくのか考えてみてください。
オフトピック
※参照渡しは、アドレス値を渡していると考えられるため。
C言語での値渡し(Call by Value)と参照渡し(Call by Reference)
written by へにっくす

Rittai_3D
記事: 524
登録日時: 7年前

Re: ゲームのオブジェクト指向について

#100

投稿記事 by Rittai_3D » 6年前

>>へにっくす様

返信ありがとうございます。
へにっくす さんが書きました:C言語はすべて値渡し※なので、その値を変更しても戻ることはありません。ではなぜ&をつけるとうまくいくのか考えてみてください。
オフトピック
※参照渡しは、アドレス値を渡していると考えられるため。
C言語での値渡し(Call by Value)と参照渡し(Call by Reference)
&はたしか先頭アドレスを示しますよね。

アドレス値ではなく、先頭アドレスを返すからですか?
初心者です

閉鎖

“C言語何でも質問掲示板” へ戻る