keycheck改悪

zxc
記事: 79
登録日時: 11年前
住所: 日本の背骨(?)あたり

keycheck改悪

投稿記事 by zxc » 11年前

  シンプルだが構造がおかしいものよりも、構造が複雑で正しいものを使うべきだ、と思ったので修正のつもりだった。結局動かなくなったわけだが、コピーはあるし一日つぶした程度で済んでよかったのかもしれない。わかりにくいし管理しにくそうなコードになって残念。
  keydataをいじるkeyクラス、のポインタを管理するlistクラス、を管理するマネージャ、のつもり。
ブレークポイント作るとDxlibを開放できないようだし、どうしようか。

CODE:


#include"DxLib.h"
#include

#ifndef C_KEYCHECKGET_H
#define C_KEYCHECKGET_H

struct key_data{
		key_data(short unsigned int input):macro(input),state(0){}
		short unsigned int macro;
		bool state;
	};


class C_key{
	private:
		struct key_data data;

	public:
		C_key(short unsigned int key_macro);
		key_data* tell_data();
		bool check();//引数にDxlibのキーマクロ入れるとキーの状態を返すよ。

};

struct key_list{

	private:
		std::vector ky;
		//std::vector::iterator iter;
	public:
		std::vector::iterator iter;

		key_list();
		void add(C_key*);
		void destroy(C_key*);
		std::vector* give_list();
};


class C_key_manager{
	private:
		C_key_manager();
		C_key_manager(const C_key_manager&);
		C_key_manager& operator=(const C_key_manager&);
		
		char keybuf[256];

	public:
		key_list list;

		static C_key_manager* instance();
		void renew();//キーの押し下げ状態の更新。ループに入れる必要あり。
};

#endif
  キーごとのインスタンスを作ってキーごとに押されているかをシングルトンのキーマネージャで管理しようとがんばってみたが、イテレータが無効な要素を参照するらしくアウト。つまりはvectorのどこかがまずいと。
  ひとつの管理者が複数を管理する構造はありふれているだろうし、出来ないとまずい。参照渡しって今更だけど凄い。
  一度クラス図でも描いて整理しようと思う。ポインタのvectorがまずいのかな。コピーやら代入の失敗やらありそう。コピーコンストラクタの定義でもしてみようか。

アバター
せんちゃ
記事: 50
登録日時: 13年前

Re: keycheck改悪

投稿記事 by せんちゃ » 11年前

キー入力の処理のためだけに処理を複雑にしすぎな気がします。
アプリ内でキーの入力を動的に増やすことはないと思いますし、同様にアプリ内でキーの入力を動的に削除するようなこともないと思うので
リストで管理するメリットはあまりないかなぁと思います。

動的に入力を追加して動的にある要素を削除するということはアプリ内で
「あるときに使えて、あるときにいきなり使えなくなる」という状態になる可能性が高いです。
キーは入力制御くらいしか用途がないのでなんでもできるようにするよりも、
シンプルに作って決まった機能だけを提供するようにしたほうが見通しも良く、修正のしやすい作りになるような気がします

zxc
記事: 79
登録日時: 11年前
住所: 日本の背骨(?)あたり

Re: keycheck改悪

投稿記事 by zxc » 11年前

  そうですね。今回動的確保で得られるメリットは、それを維持したりデバッグする苦労を考えれば、無いです。むしろマイナスですらあります。
  また修正するつもりですが、そのときは動的確保は使わない予定です。

ISLe
記事: 2650
登録日時: 13年前

Re: keycheck改悪

投稿記事 by ISLe » 11年前

動的な割り当てを実装するなら、わたしはゲームコントローラーを仮想化しますね。

zxc
記事: 79
登録日時: 11年前
住所: 日本の背骨(?)あたり

Re: keycheck改悪

投稿記事 by zxc » 11年前

  動的な割り当ての実装としては、コントローラーの仮想化による実装のほうを勧める、という解釈でよろしいでしょうか?要するに(キーコンフィグできるような)「しっかりとしたインターフェイスを作ったほうがいい」というような意味でとっていますが、あっていますでしょうか?

ISLe
記事: 2650
登録日時: 13年前

Re: keycheck改悪

投稿記事 by ISLe » 11年前

しっかりとしたインターフェースを作るかどうかは別として、コントローラーを仮想化することで、アプリケーション間のインターフェースとハードウェア間のインターフェースが分離できるのでメンテが楽になります。

キーボード管理をどれだけ使いやすくしても結局キーボードなので、ゲームアプリはキーボードをどのように操作に割り当てるかを考えなくてはいけません。
ゲームアプリが欲しいのは、『デジタル4方向(斜めあり)+2ボタン』といったゲームアプリが想定するコントローラーの入力です。
コントローラーを仮想化すると、ゲームアプリはボタン1が通常ショットで、ボタン2がボム、のように機能を固定化できるので、ソースコードがシンプルになります。

仮想コントローラーは、アプリが想定するコントローラーのレイアウトを受け取り、実際のハードウェアとのマッピングを請け負います。
単純なボタンの入れ替えから、同時押しを特定のボタンに割り当てたり、上下/左右の反転などアプリケーション側が気にする必要がなくなります。

zxc
記事: 79
登録日時: 11年前
住所: 日本の背骨(?)あたり

Re: keycheck改悪

投稿記事 by zxc » 11年前

龍神録:キーコンフィグの実装ここで言っていることと同じようなことですよね?別の言い方をするならコントローラーを「マジックナンバー」のように扱わないで、後で手が加えやすいように、コントローラーとゲーム実装を仮想コントローラーを境に分けると言いますか・・・

ISLe
記事: 2650
登録日時: 13年前

Re: keycheck改悪

投稿記事 by ISLe » 11年前

龍神録の館は、アプリ側のボタン割り当てが固定(left,up,right,down,shot,bom,slow,start,change)です。
わたしが動的割り当てを実装するなら、この部分を動的割り当てできるようにします、ってことです。

実際のキーボードやゲームコントローラーにアクセスする部分がアプリから見えなければ凝る必要もなく、プラットフォームに用意されているレベルでほとんど足ります。
そもそもプラットフォーム固有の機能を、プラットフォーム固有のままで使いやすくすることに意義があると思えないのですが。

(追記)
凝るならそうするという話で、ふつうは龍神録の館に書かれたレベルで十分です。
最後に編集したユーザー ISLe on 2013年2月21日(木) 16:47 [ 編集 1 回目 ]

zxc
記事: 79
登録日時: 11年前
住所: 日本の背骨(?)あたり

Re: keycheck改悪

投稿記事 by zxc » 11年前

  おおよそ分かったような気がします。ありがとうございます。