インスタンスのたらい回しがイヤ

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
マント

インスタンスのたらい回しがイヤ

#1

投稿記事 by マント » 5年前

C++で簡単なアクションゲームを作っております
キーボード操作用のクラスを設けたのですがキーボードの状態を知りたいクラスがたくさんあり、
その為、キーボード操作用のインスタンスのポインタをたらい回しにする設計にしようと思ったのですが
下層のクラスの為に、キーボード操作用のインスタンスが必要ない上層のクラスまでもが
仮引数にそのポインタを持たなくてはいけなくなりました
コードがとても見づらいです

投げやりで申し訳ないのですが効率的な方法や、そのヒントがあれば教えてください
よろしくお願いします

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

Re: インスタンスのたらい回しがイヤ

#2

投稿記事 by h2so5 » 5年前

キーボードの処理を上層のクラスで完結させたほうがいいかもしれません。

アバター
nullptr
記事: 239
登録日時: 8年前

Re: インスタンスのたらい回しがイヤ

#3

投稿記事 by nullptr » 5年前

末端のクラスがキーボードの状態を知らなくてはならないような設計とは?
 
 
✜ で C ご ✜
: す + 注 :
¦ か + 文 ¦
?
Is the は :
order C++? ✜
     糸冬   
  ――――――――
  制作・著作 NHK
 
 

hide

Re: インスタンスのたらい回しがイヤ

#4

投稿記事 by hide » 5年前

キーボードの入力を処理するクラスは Zキーが押された という情報をしる必要がありますが、
操作対象のキャラクターのようなクラスは、 ジャンプを命令された という程度でいいはずです。
逆に操作対象のキャラクターが Zキーが押された という情報を知ってしまうと、
コントローラーで操作できなくなります。

マント

Re: インスタンスのたらい回しがイヤ

#5

投稿記事 by マント » 5年前

返信ありがとうございます
私はプログラミング初心者で一昨日、C++の入門サイトを見終わったということを追記しておきます

C++の設計から成っていないと思いますが現在、キー入力により分岐する部分全てを
if(Key->Getter(何かキー)) //Getterはキーの入力状態を返すメソッド
このように記述しています

ジャンプを命令ということはどういうことですか
キャラクタークラスとキー入力クラスの間に何かが存在するのでしょうか

マント

Re: インスタンスのたらい回しがイヤ

#6

投稿記事 by マント » 5年前

さっきの私の解答がおかしかったので訂正します

キー入力クラスは毎フレーム、入力状態を更新して、
キーが押されているかどうかのフラグを利用したい場合は
利用したがっているクラスからキー入力クラスのgetter関数を呼び出します

キーボードの状態を末端のクラスが知らずにキー入力で処理を分岐させるやり方は
見当も付きません
どの道、ポインタのたらい回し(寄り道)は避けては通れないのでしょうか

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

Re: インスタンスのたらい回しがイヤ

#7

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

最初にC++らしさと言うかオブジェクト指向にこだわり過ぎると完成しなくなる恐れが高いので、ほどほどに。

> どの道、ポインタのたらい回し(寄り道)は避けては通れないのでしょうか
ポインタは止めましょう。せめて参照に。

>ジャンプを命令ということはどういうことですか
上位のクラスがキーボードの入力がジャンプか判定すればキャラクタクラスのジャンプ・メソッドを呼ぶだけで良いので、キャラクタクラスがキーボードの状態を知る必要はないですね。
更にどのキーがジャンプか知っているべきなのはキーボード管理クラスだけです(キーの抽象化。コンフィグにも応用化)
そのクラスが知るべきでない情報は与えないがキーワードです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

taketoshi
記事: 221
登録日時: 9年前
住所: 日本国

Re: インスタンスのたらい回しがイヤ

#8

投稿記事 by taketoshi » 5年前

同様の壁にぶち当たり考えた末に、入力関係をシングルトンで実装しました。
しかし、そのあとになって、入力関係をカプセル化して必要なクラスがそれを継承すればよかったと後悔しています。

お好きな方法を試してみてください。
► スポイラーを表示

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

Re: インスタンスのたらい回しがイヤ

#9

投稿記事 by usao » 5年前

>下層のクラスの為に、キーボード操作用のインスタンスが必要ない上層のクラスまでもが

どういう状態なのかわかりませんが

main()とか(操作状態取得) → 上層 → 下層

みたいな構成ならば
その「上層」っていう奴の役割には 「下層」を管理することが含まれていて,当然その中には
【操作状態に応じて 下層の奴に然るべき振る舞いをさせる】 ことが含まれている 気がするので
mainとかの側から 操作状態を表すもの が「上層」に伝達されてくるってのは自然な形であり,
>必要ない
という話にならないような…?

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

Re: インスタンスのたらい回しがイヤ

#10

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

> main()とか(操作状態取得) → 上層 → 下層
でマントさんの現状が下層がキーボードの情報を見ているので、上層は見もしないキーボードの情報がただ通過するだけって事でしょうね。
他の人の提案は、キーボードの情報を見るのは上層だけで下層は見なくて良いってことかと。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

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

Re: インスタンスのたらい回しがイヤ

#11

投稿記事 by usao » 5年前

実際どこの層までスルーさせてどこで解釈するかは別として そういう層構成になっている以上
「単にスルーさせること」もその層の大切な役目であり「必要な処理である」っていうか,そんな話です.単に.

マント

Re: インスタンスのたらい回しがイヤ

#12

投稿記事 by マント » 5年前

教えてもらう側なのに返信が遅くなってしまったことお詫び申し上げます。

今、自分がすぐにでも導入することが出来るやり方はtaketoshi様が挙げてくださったシングルトンでしょうか
しかし、このやり方はクラス内の2つのメンバ変数をグローバル変数のように扱えてしまうように見え、少し気になります
私が作るゲームは小さいものしかありませんので、さして問題ないかもしれませんが

usao様の仰るとおり、上層のクラスは下層のクラスの管理をするというのも納得できます
しかし、私はキーボードというのは主人公の操作に使用したり、
メニュー画面での選択に使用したりすると思ったので、クラスの最上層辺りに位置させました
その為、だいたいのクラスがキークラスをスルーさせなくてはいけなくなり、想像以上に醜くなりました
この設計自体が破綻しているのかなと思い始めたので、もう少し考えてみます

閉鎖

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