ゲームプログラミング相談室【Part6】
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001名前は開発中のものです。
04/03/06 01:25ID:d2e/eEyg扱う話題のダイナミックレンジはやや広め。包容力高め。
他の初心者質問スレとの棲み分けを探りつつ
これからもマターリと活用しておくれ。
■過去スレ
【Part2】http://pc.2ch.net/tech/kako/985/985540361.html
【Part3】http://pc.2ch.net/tech/kako/1002/10028/1002894129.html
【Part4】http://game.2ch.net/gamedev/kako/1005/10050/1005040025.html
【Part5】http://pc2.2ch.net/test/read.cgi/gamedev/1036410116/
■関連スレなど
>>2-5
0850名前は開発中のものです。
2006/02/27(月) 16:46:40ID:oEXfl838void test(TASK *t){/*・・・*/}とか
0851名前は開発中のものです。
2006/02/27(月) 16:47:36ID:oEXfl838更新してなかった
>bind1st
ありがとう、ちょっとググってくる
0852名前は開発中のものです。
2006/02/27(月) 20:12:08ID:BluJBaYXクラスの多重継承を考えると、sizeof(メソッド)は
sizeof(単純な関数ポインタ)+sizeof(オフセット)
が必要になるよ。
0853名前は開発中のものです。
2006/02/27(月) 20:35:03ID:oEXfl838>>852
よく分からんです・・
タスク用のデータエリアのことなら
pTask = new CTask;
TASK* Task = pTask->TaskCreate(行動関数,開放関数,優先度,タイプ); //タスク生成、リスト追加
Task->Data = new データ型;
Task->Data = (void*)データ;
で確保してるのでサイズは大丈夫だと思う
タスクってポインタをガシガシ切り替えて処理するものだと思ってたけど
CじゃなくC++のクラスを使ったタスクシステムを見てみると
どれも継承元で仮想関数使って継承先に処理を記述する処理固定のしかないんだなぁ・・・
0854名前は開発中のものです。
2006/02/27(月) 20:47:17ID:IKST4ZuKあと、関数ポインタじゃなくてboost::function使うと色々できるよ。
パフォーマンスは知らんけど。
0855名前は開発中のものです。
2006/02/27(月) 20:50:42ID:BluJBaYXC++でもポインタの切り替えはできるよ。というかできたよ。
理由は>>852の通りなんだけど、
とりあえずクラスメソッドはvoid*型に変換できないんで
TASK* TaskCreate(void* Func, void* Release, DWORD Priority, DWORD Type)
は
typedef ...(ClassName::*FuncType1)(...);
typedef ...(ClassName::*FuncType2)(...);
TASK* TaskCreate(FuncType1 Func, FuncType2 Release, DWORD Priority, DWORD Type)
のようにする必要がある。
0856名前は開発中のものです。
2006/02/27(月) 21:47:38ID:oEXfl838>Stateパターン
Stateで検索してたつもりがいつのまにかデザインパターン全般のページ見てた
奥が深いね・・・こっち関連の書籍持ってないから今度買ってみる
boostはライブラリをあまり使いたくない派なので迷う
>>855
異なる複数のクラスに対応させる場合、
生成関数をその分用意しないといけないので大変ですね・・
なんでクラスメソッド渡せないんだか・・
デザインパターンに興味を持ったのでStateパターン覚えてからしばらくそっちに走ってみます
0857名前は開発中のものです。
2006/02/27(月) 22:08:46ID:BluJBaYX> 生成関数をその分用意しないといけないので大変ですね・・
> なんでクラスメソッド渡せないんだか・・
まさにここが工夫のしどころで、
いちいち作らないようにする方法はある。
0858名前は開発中のものです。
2006/02/27(月) 22:13:28ID:oEXfl838今思い出したからうろ覚えだけど
もしかして関数テンプレート機能?
0859名前は開発中のものです。
2006/02/27(月) 22:47:19ID:BluJBaYXこのくらいはできて当然だから、がんばっちくり。
0860名前は開発中のものです。
2006/02/27(月) 22:49:43ID:oEXfl838俺物忘れ激しいな・・
C++基礎からやり直した方がいいかも
0861名前は開発中のものです。
2006/02/27(月) 22:53:02ID:NtZAdaLq普通に仮想関数使えば終了だな。キモイキャストの連発ともおさらばだ。
関数ポインタから void* への変換は、メンバ関数に限らず不可。
もしできたように見えたとしても、それはコンパイラの独自拡張だろう。
0862名前は開発中のものです。
2006/02/27(月) 23:23:15ID:BluJBaYXやってみれば分かるけど、仮想関数のみだとキャストしないと無理。
あと、関数ポインタからvoid*への変換は確かに環境依存なんだけど、
boost.function はそれを駆使して実装されてるんで、
boost.function が動く環境ならどこでもできるよ。
0863名前は開発中のものです。
2006/02/27(月) 23:37:54ID:NtZAdaLq単に「タスクシステム」っていうと、メインループがタスクのポインタ握って
ポインタから仮想関数を呼び出すぐらいしか無いと思うんだけど、
何にキャストが要るの?
boost::function が関数ポインタから void* への変換を駆使してる?
どこにそんな情報があるの?
とりあえず現状のソースでは union 使ってるみたいだけど。
http://cvs.sourceforge.net/viewcvs.py/boost/boost/boost/function/function_base.hpp?view=markup
0864名前は開発中のものです。
2006/02/28(火) 00:21:53ID:6zNpXrV2public:
void static funcA(void* se1f)
{
ClassA *self = (ClassA*)se1f;
cout << self->num++ << endl;
}
private:
int num;
};
void call_func(void (*func)(void*), void *arg)
{
func(arg);
}
int main()
{
ClassA *class_a = new ClassA;
call_func(class_a->funcA, class_a);
}
Perlとかに慣れているなら self の存在を許せるよね…
0865名前は開発中のものです。
2006/02/28(火) 00:29:02ID:zCKm/IVQタスクシステムって言うのは
class Task {
public:
void begin_task() { ... set_task(&Task::task1); }
protected:
void task1() { ... set_task(&Task::task2); }
void task2() {}
};
とか、こういうのを指してると思うんだ。
で、コールするべきメソッドを保存するためには、
テンプレートを使わないならキャストする必要があるよと。
もちろん1タスク1関数を遵守してもいいんだけど、これはこれでなかなか便利だよ。
あと、boostの方は間違えた。
関数オブジェクトを保存しているフィールドと関数ポインタのフィールドを見誤ったようだ。
0866名前は開発中のものです。
2006/02/28(火) 00:31:23ID:zCKm/IVQ0867名前は開発中のものです。
2006/02/28(火) 00:31:28ID:aXLiBRlK別にする場合の構成とかどんなもん?
0868名前は開発中のものです。
2006/02/28(火) 03:24:56ID:nWNa1RWoC++でやるならもっと型安全に気を使おう。
そんな古典的な手法を使うならCでやれ。
C++的には
>継承元で仮想関数使って継承先に処理を記述する
その継承先の処理の記述で、
ifやswitchやメンバ関数ポインタやstaticメンバ関数へのポインタを使って分岐するのが、
型安全でカプセル化でスマート。
>861
void *に変換した物は、何も弄らず元の型に戻せば、
正しく復元される(関数ポインタだとしても)って聞いたんだが。
0869名前は開発中のものです。
2006/02/28(火) 09:48:42ID:q2yPrwLQ普通は別にするとおもわれ。
構成なんて漠然としたこと聞かれても困る。
例を示されよ。
0870名前は開発中のものです。
2006/02/28(火) 12:17:07ID:kxpJE7Cjオブジェクトポインタと関数ポインタの間での変換は規格では認められていない。
C の時からそう。
0871名前は開発中のものです。
2006/02/28(火) 12:57:51ID:aEEYZl8lC++でやるならStateパターン+1キャラクタ1クラスでFAだろ。
0872名前は開発中のものです。
2006/02/28(火) 13:39:14ID:kxpJE7Cjその形でどこにキャストが要るのかわからない。
0873名前は開発中のものです。
2006/02/28(火) 21:40:21ID:zCKm/IVQ確かにコンパイラの独自拡張なんだけど、もはや共通拡張と言ってもいいくらい浸透してるみたいだね。
条件付きではあるけれど。
ttp://forums.belution.com/ja/cpp/000/015/67s.shtml
>>871
状態によって処理を変える必要しかないならそれでもいいだろうね。
ただ、例えばタイトル画面なんかの場合は
1)タイトル文字をフェードイン+移動しながら表示
2)サブタイトルを移動しながら表示
3)全体にエフェクトをかける
みたいに状態によって左右されないシームレスな記述が必要になる。
これを扱う方法としてswitchやマイクロスレッドがあるんだけど、
もう一つの方法がこのオリジナルタスク。
オリジナルとはいっても
Codezineのタスクシステム + Move or Drawメソッドの呼び出し先を変えられる
ってだけなんだけど。
>>872
新規クラス Task2 や Task3 を導入したときに問題になる。
0874名前は開発中のものです。
2006/02/28(火) 22:38:49ID:K7Ri/qFO0875名前は開発中のものです。
2006/02/28(火) 23:36:27ID:l+ExwxPFタスクシステムの方を優先して設計するのはナンセンスだと思うよ。
関数ポインタを使って実現したいことは処理の共通化だろうし、それは仮想関数だけじゃなくて
普通に継承元になる側にも関数いれときゃいいし。
継承元のクラスポインタに、派生したいろんなクラスをまとめていれられる。
0876名前は開発中のものです。
2006/02/28(火) 23:47:24ID:aXLiBRlK0877名前は開発中のものです。
2006/03/01(水) 00:51:17ID:CUoSF3s4>状態によって左右されないシームレスな記述
ってのは単に処理をどこで区切ってStateに分けるかの話だろ。
0878872
2006/03/01(水) 00:59:35ID:IPZ1L++y> 確かにコンパイラの独自拡張なんだけど、もはや共通拡張と言ってもいいくらい浸透してるみたいだね。
> 条件付きではあるけれど。
そんなに必死に正当化しなくても、非標準なんだから使わないようにすれば済む話。
「共通拡張」なんて胡散臭い言葉を持ち出すのは混乱の元。
> 新規クラス Task2 や Task3 を導入したときに問題になる。
やっぱりわからない。わかんないのは俺だけ?
何から何へのキャストが要るのか、書いてもらえると分かるかも。
0879名前は開発中のものです。
2006/03/01(水) 01:09:15ID:2CSbAmuSもういいじゃん。
そっとしておいてあげようよ…。
共通拡張の時点で分かるでしょ。
もういっぱいいっぱいなんだよ。
わかってやれよ。
0880名前は開発中のものです。
2006/03/01(水) 01:28:04ID:MsffCk59これは擬似コードなので動かないし、NULLチェックとかもしてないよ。
// 描画系のメソッドは略
class TaskBase {
public:
typedef @ FuncType;
TaskBase() : m_func(&TaskBase::begin_task) {}
void set_task(FuncType func) {m_func = func; /*A*/ }
void update() { m_func(); }
protected:
virtual void begin_task() {}
private:
FuncType m_func;
};
class Task1 : TaskBase {
public:
Task1() {}
protected:
void begin_task() { set_task(&Task1::task1); }
void task1() {}
};
class Task2 : TaskBase {
public:
Task2() {}
protected:
void begin_task() { set_task(&Task2::task1); }
void task1() {}
};
0881名前は開発中のものです。
2006/03/01(水) 02:16:32ID:MsffCk59関数ポインタを使ってしたいことは、処理の共通化でもあるんだけど、
タスクの場合は主に長い処理を1フレーム分に分割することにある。
マイクロスレッドなりスレッドなりを使わないと、どうしてもぶつ切りにせざるを得ないので。
もちろん、templateメソッドみたいに呼び出すメソッドがあらかじめ分かっていれば、
継承元側に仮想関数を追加しておくことはできるよ。
ただタスクシステムの場合、それはほとんど不可能。
>>877
Stateを使うってことは、状態一つに対してクラスを一つ作るってことなのかな?
例えば、>>873にあげた1)2)3)でそれぞれに対してクラスを作るの?
これの代替機能としてはswitchやマイクロスレッドがあげられると思うんだけど、
何でステートパターンにこだわるんだか、俺には分からない。
これだと粒度大きすぎると思うんだけど。
(細切れの関数に対していちいちクラスを作らないといけないってことね)
>>878
> そんなに必死に正当化しなくても、非標準なんだから使わないようにすれば済む話。
> 「共通拡張」なんて胡散臭い言葉を持ち出すのは混乱の元。
一緒に示したソース見た?
その中に「共通の拡張」って表現があるから、それを借りただけなんだけど・・・
この辺は>>868や俺のように間違えてる人が多いから、一応確認しただけ。
これは本題ではないので、こちらからはこれ以上レスしないよ。
あと、>>880に示したプログラムではテンプレートを使ってないので、
@に何を書いてもAでキャストすることになる。
使わない方法があれば、俺も知りたい。
0882名前は開発中のものです。
2006/03/01(水) 02:36:11ID:MsffCk59× @に何を書いてもAでキャストすることになる。
○ @に何を書いてもset_taskの呼び出し時にキャストすることになる。
0883名前は開発中のものです。
2006/03/01(水) 03:14:04ID:IPZ1L++yキャストが要るようになったらプログラムが間違ってるのを疑えよ。
なんで仮想関数で得られる型安全を自ら壊すような「タスクシステム」に
こだわるんだ?そんなシステム要らない。
↓これでいいんじゃないの。
class State {
public:
virtual void update() = 0;
};
class State1 : public State {
public:
State1() : m_update_task(&State1::begin_task) {}
void update() { (this->*m_update_task)(); }
private:
void (State1::*m_update_task)();
void begin_task() { m_update_task = &State1::task1; }
void task1() {}
};
0884名前は開発中のものです。
2006/03/01(水) 04:00:38ID:MsffCk59ようやく伝わったようだ。イメージとしてはそんな感じ。
で、テンプレートを使えば m_update_task 周りの処理をすべて
継承元の xxx<Task1> に投げられますよというだけの話。
例でtemplateを使って無いのは、>>882に説明するため。
0885名前は開発中のものです。
2006/03/01(水) 04:08:48ID:DYhzXIPkState1() : m_update_task(&State1::begin_task) {}
void (State1::*m_update_task)();
void begin_task() { m_update_task = &State1::task1; }
この辺りの記述ははじめた見た
詳細きぼん
0886名前は開発中のものです。
2006/03/01(水) 04:18:04ID:DYhzXIPkコンストラクタとメンバ関数ポインタか
コンストラクタでbegin_taskを関数ポインタに代入して
それが呼び出されれば関数ポインタにtask1を代入するわけか
またひとつ賢くなった
0887名前は開発中のものです。
2006/03/01(水) 04:25:23ID:MsffCk59また分かりにくいかもね。
>>883の例でいくと、
class State1 : State<State1> { ... };
とすれば、m_update_task 周りの処理を
継承元であるState<>で行うことができますよという話。
0888名前は開発中のものです。
2006/03/01(水) 06:34:35ID:FsQhIhltつーかさ、switchでつくりゃいいじゃん。ポインタにしてもいいことないよw
最適化かからなくなるし。
switch( TaskType )
{
case TaskType1: funcType1(); break;
case TaskType2: funcType2(); break;
case TaskType3: funcType3(); break;
default: assert( false /*TaskTypeError*/ );
}
ああ、安全安全。
0889名前は開発中のものです。
2006/03/01(水) 07:51:41ID:LeN+sImJ関数に分けて、特定の状態のときに行う処理がかけることかな。
状態遷移が複雑だったり外部の環境の変化によって遷移の仕方が大きく変わるようなら
Fiberつかったほーがいいけど、適材適所ということで。
キャストとかtypedefとか必要ない俺のつくったタスクシステムのきれっぱしを参考にしてくれ
正直つくったはいいがザコキャラがでてきてうろうろしたり弾幕があったりするようなゲームを
つくらなかったので使いどころがなかった。
// タスクの管理者はlist<TaskManagable*>をメンバに持ち、Run()を順番に呼んでいくのだ
class TaskManagable {
public:
virtual void Run() = 0;
};
//タスクになりたいクラスは class MyEntityTickTask : public Task<MyEntityTickTask>
// … とやってMain()を実装する。ChangeTask( hoge ) で自分のメンバ関数 void hoge() へ状態遷移できるよ
//管理者に登録するのはこのMyEntityTickTaskクラスをnewするやつの仕事だ。当然だね(^ー^b
template <typename T> class Task : public TaskManagable {
public:
Task() { ChangeTask(Main); };
void Run() { (((T*)this)->*m_doit)(); }
protected:
virtual void Main() = 0;
void ChangeTask(void (T::*fp)()) { m_doit = fp; }
void (T::*m_doit)();
};
0890名前は開発中のものです。
2006/03/01(水) 09:15:15ID:IPZ1L++y> キャストとかtypedefとか必要ない俺のつくったタスクシステムのきれっぱしを参考にしてくれ
> void Run() { (((T*)this)->*m_doit)(); }
キャスト入ってるよ。まぁ型安全は使い方で確保されてると言えるけど。
あんた、たぶん VC 使いだな。メンバ関数ポインタの &ClassName:: は
規格では省略できないことになってるから、気をつけてな。
>>884,887
たぶん 889 と似たような形のことだろうな。
これまでに挙がったコードだと template も継承も持ち出さずに
自分でメンバ関数ポインタを宣言(>>883)すれば十分に見えるんだけど、
「 m_update_task 周りの処理」ってのは代入と呼び出し以外に何か有るの?
State の実装がメンバ関数ポインタによる処理に切り替えを必要とするとも
限らないし、これをわざわざ「システム」として組み込んでしまうのは
template や継承(特に自己言及的 template など)おぼえたてで
使いたいだけに見えなくも無い。ほんとでそんな構成に利点があるんだろうか?
0891名前は開発中のものです。
2006/03/01(水) 09:45:30ID:SKz1zCk00892名前は開発中のものです。
2006/03/01(水) 11:08:16ID:LeN+sImJほとんど似たようなコードを置きながらちっともリスペクトしなかったのは俺の不注意だが
そこまで嫌味をいわんでもええやん
0893名前は開発中のものです。
2006/03/01(水) 19:11:17ID:FsQhIhltC++がこんな言語なのはCとの互換性を保っているからだしね。
なんつーか、WindowsのDOS窓でプロテクトモードじゃないと動かないような
プログラムをいまさら作ってるくらい違和感がありますよ関数ポインタ。
0894名前は開発中のものです。
2006/03/01(水) 19:11:48ID:FsQhIhlt0895名前は開発中のものです。
2006/03/01(水) 21:06:02ID:IEMguq9Oあたし、一生あなたについていきます(*・_・)
0896名前は開発中のものです。
2006/03/01(水) 21:06:39ID:CUoSF3s40897名前は開発中のものです。
2006/03/01(水) 21:44:02ID:MsffCk59分かってるとは思うけど>>880はサンプルだし、
実際に使うとなると他にもいろいろと書き加えないといけない。
そうなったときに、継承先クラスの実装とタスクシステムが
分離されてることはいいことだと思うけど。
>>893
もちろん実装として、メンバ関数ポインタの代わりに
boost.functionやらそのたぐいを使うことは十分に考えられる。
そういったことはすでに提案されている。
0898名前は開発中のものです。
2006/03/01(水) 23:16:45ID:1kpkO4CI今はtemplateとstateパターンだなぁ
0899名前は開発中のものです。
2006/03/01(水) 23:24:58ID:DYhzXIPkファイル分割の辺りを飛ばしてたから初めて知った
グローバル変数をクラスにポインタ使って渡してた自分が馬鹿みたいだ・・
0900名前は開発中のものです。
2006/03/01(水) 23:32:08ID:FsQhIhlt0901名前は開発中のものです。
2006/03/01(水) 23:32:30ID:hlrpUZzFいきなりC知らない人間がC++やると碌なことが無い
0902名前は開発中のものです。
2006/03/01(水) 23:38:46ID:qSXqEEUpっていうかぁ、
○ ○ ○ シ ス テ ム 云 々 っ て 馬 鹿 ぁ?
達成すべき処理に対して最適なアルゴリズムで組んでいけば、
それが最強のシステム。「よし○○○導入するぞ?」ってのは、
自分でまともなアルゴリズム組めない思考停止。PG才能無し。
0903名前は開発中のものです。
2006/03/01(水) 23:46:27ID:CUoSF3s4これは ひどい
0904名前は開発中のものです。
2006/03/02(木) 00:14:44ID:DSQKJe+Aそこまで自身がないなら既に完成しているシステムを組み込む安全な方法のほうがいい
0905名前は開発中のものです。
2006/03/02(木) 06:45:23ID:kEb75Hs9自分以外の同業者が何か敵か見下す対象なのであれば
同一のパーソナリティが出す見解としてはあってる。
0906名前は開発中のものです。
2006/03/02(木) 11:14:39ID:An/IP3MAがいしゅつか糞かのどっちかだろ。よっぽど今までに無い
特殊な課題が出てきたってなら話は別だけどな
0907名前は開発中のものです。
2006/03/02(木) 11:59:46ID:0lN5e5iu常に湧いてくるなんて尊敬しちゃいます(><)
0908名前は開発中のものです。
2006/03/02(木) 13:48:40ID:xnVjPOfM0909名前は開発中のものです。
2006/03/02(木) 19:06:30ID:TkjXSKpG0910名前は開発中のものです。
2006/03/02(木) 19:33:56ID:7Bu1OvIgそのとおりなんだが、上で出てるタスクシステムとやらは超絶に危険だろ?w
ツリー構造のタスクシステムをC++で作ったときはリンクリストにしてポインタ使ったけど
アップキャストだけにしてスマートポインタで管理して、タスクを利用する人からは極力
隠蔽するようにしたもんだけどなぁ。
0911名前は開発中のものです。
2006/03/02(木) 19:38:50ID:An/IP3MA0912名前は開発中のものです。
2006/03/02(木) 20:22:45ID:FRBQKYqS100行以上に及ぶ関数やグローバル変数や状態変数の乱立。
内部でスパゲッティーコード組もうがハードコーディングしようが、
最終的に俗世間に評価されればそれが勝ちなんだよ。
一般大衆はコーディング云々なんて気にしない。
面白ければそれでいい。
オナニーはエロ動画だけで十分って事だよ。
まぁ、いいもん作ろうぜ。
0913名前は開発中のものです。
2006/03/02(木) 20:38:34ID:An/IP3MA0914名前は開発中のものです。
2006/03/02(木) 20:40:18ID:e+7b9NqLっていつも思う。
0915名前は開発中のものです。
2006/03/02(木) 20:41:22ID:EQr6DVKB勝ち負けなんて気にせず、
自己満足のための美しい設計に心血を注ぐ者がいても良いじゃない。
0916名前は開発中のものです。
2006/03/02(木) 20:43:53ID:ODhfrfjk0917名前は開発中のものです。
2006/03/02(木) 21:18:05ID:FRBQKYqSでもオレは要求された仕事を期日以内にキチンとこなして女と遊びに行くほうがずっといいからな。
お外で遊びな? まじ楽しいぞ?
0918名前は開発中のものです。
2006/03/02(木) 21:30:25ID:mDiMfB+6俺にはWindowsXPたんがいるからいいもんね・・・
もうすぐもう一人増えるんだもんね・・・
0919名前は開発中のものです。
2006/03/02(木) 21:50:15ID:An/IP3MAhttp://pc8.2ch.net/test/read.cgi/prog/1139744052/l50
0920名前は開発中のものです。
2006/03/02(木) 22:26:24ID:7PybzmE4むしろ糞コードでも良いからそれが何十年も使える世界になって欲しい
0921名前は開発中のものです。
2006/03/03(金) 10:12:47ID:RMA/DLWOえ、いやほんとに教えてください・・・・サンプルでは英字しか無理でしたけど・・・
Irrlichtはやろうとしたけど・・・・でしたので
0922名前は開発中のものです。
2006/03/03(金) 17:43:23ID:Es3EQncu自キャラ、敵キャラはいいとして重力計算とか当たり判定はどこで行うの?
0923名前は開発中のものです。
2006/03/03(金) 17:48:31ID:mnIw+zDn0924名前は開発中のものです。
2006/03/03(金) 18:07:00ID:b9kujG94http://life7.2ch.net/test/read.cgi/jinsei/1140716130/l50
ここで偽善者がオナニー暴れしてます
0925名前は開発中のものです。
2006/03/03(金) 20:40:36ID:K58rYxW9自キャラさんとか敵キャラさんとかが入ってるリストの中に
重力計算さんとか当たり判定さんとか本来実体のないものを
わざわざ実体のあるように見せかけていっしょにつっこむべきだと思う?
まぁ最初なんだからすきにしたらいい間違ってるのがわかったらその時なおせばいいよ
0926名前は開発中のものです。
2006/03/03(金) 21:45:17ID:0OTmGa8a思う。
0927名前は開発中のものです。
2006/03/03(金) 22:42:51ID:o73IJu/Mってのが基本的なタスクシステムのキモの一つなわけで
実体の有無(画面に表示されるかどうかって意味だよな?)はあまり関係ないんだな。
ただ、当たり判定や重力計算を独自のタスクで組むと、それを適用したいキャラを
リストからいちいち探さなくちゃいけないしあまり効率がいいとは言えない。
関数の内容によってリストを別けるとか解決策はいくらでもあるが
そこまでして使うものか?とも思う。
0928名前は開発中のものです。
2006/03/03(金) 23:00:14ID:Es3EQncu欲張りだから最初から失敗が嫌
とか言っても一発で成功したこと一度もない・・・
コンパイルの度に”必ず”ひとつはエラー出す
タスクとしてリストにぶっ込みたいんだけど色々問題があって
>>927
「リストからいちいち探さなくちゃいけない」
この辺でずっと悩んでた
タスクリストの一番最初に入れるのはもちろん無理だし
一番最後に入れるとタスクリスト内のデータをまた最初から検索しなおさなくちゃならないから単純に処理2倍だし
各タスクの行動関数に組み込むと再利用性がうんこ
0929名前は開発中のものです。
2006/03/03(金) 23:07:35ID:LreP13W+なんでタスクリストに入れたいの?
「タスク」とか「タスクリスト」の意味が曖昧なまま話しても無駄っぽいから
もっと実のある話にしたければ次スレ立てて
「タスクで組む」の意味を具体的にしてから話すことだね。
0930名前は開発中のものです。
2006/03/03(金) 23:09:42ID:fF4cU66H重力計算クラスはどんな機能が必要で
外からはどんなインターフェースが必要なのか。
0931名前は開発中のものです。
2006/03/03(金) 23:11:40ID:o73IJu/M実行順優先度とか設けてないの?
入れるなら最初か最後でしょ。
優先度ごとにリストを設けておけば総なめしなくても済むし
一本のリストで全てをまかなおうと考えない方がいいよ。
0932名前は開発中のものです。
2006/03/03(金) 23:13:51ID:YtzA4e+Q適応したい処理の対象のリストを、フレーム毎に作成すればいいんじゃね?
検索の約一兆倍スマートでクールだと思うよ??(当社調べ)
0933名前は開発中のものです。
2006/03/04(土) 11:27:18ID:N+C0gx8b0934名前は開発中のものです。
2006/03/04(土) 14:05:42ID:ja9F3fLO0935名前は開発中のものです。
2006/03/05(日) 02:39:49ID:UHXFHf4y0936名前は開発中のものです。
2006/03/05(日) 05:38:38ID:YPNEIoPdプログラマのとこか?
0937名前は開発中のものです。
2006/03/05(日) 12:16:19ID:n3bvOOgL1pixelずつの移動であれば移動する場所の座標で当たり判定をして
ヒットしていれば移動しない、ヒットしていなければ1pixel進むでいいですよね。
けど、通常の3倍で進むような場合は3pixel進んだ場所の座標で当たり判定をして
ヒットしていれば移動しない、ヒットしていなければ3pixel進むではよろしくないです。
3pixelは進めなくても2pixelは進める可能性があるからですが、
こういう通常の3倍で進む場合は1pixel進む処理をx3してやるのが普通なんでしょうか?
それともほかに良い方法がありますか?
0938名前は開発中のものです。
2006/03/05(日) 12:58:26ID:5Th9ilrN真っ当に考えれば、n pixel進むためには、
n 回ループで 1 pixel ずつ判定するしか方法はないと思われる。
状況によっては、先に n pixel進めてみて
移動不可だったら (n-1) pixelを試すという逆順のほうが効率がいいかも試練が。
0939名前は開発中のものです。
2006/03/05(日) 12:58:30ID:ZGr9k1wh何ピクセル埋まったかを計算してその分戻せば?
0940名前は開発中のものです。
2006/03/05(日) 14:07:05ID:cQK4mU/uぴったり止まるなら>939が丁寧な方法で>938が簡易だな。
0941名前は開発中のものです。
2006/03/05(日) 18:42:16ID:n3bvOOgL>>939 まさにそれですね。
ジャンプして天井にぶつかったり
落下して地面に着地した時、
キャラクターの移動速度を上げたときに
挙動が変だったのがこれで直りそうです。thx。
0942名前は開発中のものです。
2006/03/05(日) 20:55:44ID:UHXFHf4yいや全部。 仕事でプログラマとか実務側の方をやってると
全部がだいたいそのとおりなので笑える。
笑えないのは現在進行形の場合だな。
0943名前は開発中のものです。
2006/03/05(日) 23:50:36ID:VVgrQx5R0944名前は開発中のものです。
2006/03/07(火) 13:47:15ID:/9MR8SBK0945名前は開発中のものです。
2006/03/07(火) 13:54:24ID:ZvqJ1rtZ0946名前は開発中のものです。
2006/03/07(火) 14:05:02ID:gwpzJjwD0947名前は開発中のものです。
2006/03/07(火) 17:59:12ID:FUu2poXAけど買えなかったorz
0948名前は開発中のものです。
2006/03/07(火) 20:37:37ID:BkDgmlhw縦,横,チップサイズ \n
番号,番号,番号,番号,番号 \n
番号,番号,番号……
とかなってるマップの読み込みをスマートにできないかな
暗号化とかもまた意味不明
0949名前は開発中のものです。
2006/03/07(火) 21:07:51ID:/Dd4UB8zとってもスマートなのだが。
暗号化?
ぐぐれよ
レス数が900を超えています。1000を超えると表示できなくなるよ。