タスクシステムでつまずいています...

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

タスクシステムでつまずいています...

#1

投稿記事 by じゃじゃかぶ » 10年前

タスクシステムの概念はなんとなぁく理解できたのですがどうクラス分けして使えばいいのかイマイチ分かりません......
普通どのようにクラス設計するのが一般的でしょうか?
ゲームの進行によって実行するタスクを差し替えたりするのはどこで行うんですか...?

アバター
ookami
記事: 214
登録日時: 13年前
住所: 東京都

Re: タスクシステムでつまずいています...

#2

投稿記事 by ookami » 10年前

過去ログですが参考になりますでしょうか?
http://dixq.net/forum/viewtopic.php?f=3&t=8414

kino

Re: タスクシステムでつまずいています...

#3

投稿記事 by kino » 10年前

私のやり方はオブジェクト指向が一般的ではなかった時代の考えなので
じゃじゃかぶさんの参考になるかわかりませんが・・

タスクスケジューラーみたいな時間がきたら処理をするクラスを作って
STGだと自機制御 得点管理 敵出現制御 タイトル画面 テキスト 音楽 背景
などを待機フレームと処理内容を書いて配列化したもの用意して
順番に処理していきます

タスクスケジューラークラスは開始処理のみです
特に背景や敵などは常に動いているので
その処理は別プログラムで平行処理します
テキストなども一定時間過ぎれば消えるので平行処理してました

同じ処理が続いたり
ボスなどの終了時間が未定なものもあるので
処理の内容にifやloopなども入れていました

マルチタスクのようにいろんな処理が平行処理されるイメージです

昔は処理をテーブル化して順番に開始処理するプログラムを書いてました
メモリ節約のためバイト単位ですね^^;

コード:

#define START() 0,0,0,0
#define TXTPUT(sys_c,num)	,sys_c%256,sys_c/256,1,num
#define ZONE(sys_c,num)		,sys_c%256,sys_c/256,2,num
#define MUSPLAY(sys_c,num)	,sys_c%256,sys_c/256,3,num
#define TEKI(sys_c,num,x,ax,y,ay) ,sys_c%256,sys_c/256,6,num,x,ax,y,ay
#define DEF(sys_c,num)		,sys_c%256,sys_c/256,8,num

char SKJ_DAT[] = {
 	START()
	TXTPUT(0,C_SPACE)
	MUSPLAY(0,0)
	MUSPLAY(100,1)//100フレーム待ってから処理
	TXTPUT(10,C_START)
// 1stage
	MUSPLAY(100,2)//100フレーム待ってから処理
	ZONE(0,1)		//1stage背景スタート	
	TEKI(100,  0,  0, 64,  8, 64)//100フレーム待ってから敵出現
}

naohiro19
記事: 256
登録日時: 13年前
住所: 愛知県

Re: タスクシステムでつまずいています...

#4

投稿記事 by naohiro19 » 10年前

Boost.TypeErasureを使う方法もあります。

サンプルプログラム(コンソール版)
http://d.hatena.ne.jp/osyo-manga/20120815/1344956524

じゃじゃかぶ
記事: 11
登録日時: 10年前

Re: タスクシステムでつまずいています...

#5

投稿記事 by じゃじゃかぶ » 10年前

>>ookamiさん
見た感じタスクシステムの存在意義自体危ういものになってるんですかね^^;

>>kinoさん
実際の各タスクをクラスとして持っておきそれらを統括して実行するようなクラスを作って毎フレームその中のタスクを列挙した関数を呼ぶというような感じですか。。?

>>naohiro19さん
こんなものもあるんですね!調べてみます!
最後に編集したユーザー じゃじゃかぶ on 2014年6月17日(火) 01:13 [ 編集 1 回目 ]

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

Re: タスクシステムでつまずいています...

#6

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

ISLeさんがタスクシステムのブログを書いていたのを思い出したので貼っておきます。
「ISLeのビデオゲーム工房: #タスクライブラリ」
http://isle.cocolog-nifty.com/blog/cat2 ... index.html

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

kino

Re: タスクシステムでつまずいています...

#7

投稿記事 by kino » 9年前

>実際の各タスクをクラスとして持っておきそれらを統括して実行するようなクラスを作って毎フレームその中の
>タスクを列挙した関数を呼ぶというような感じですか。。?
はい、大体そんな感じです^^

じゃじゃかぶ
記事: 11
登録日時: 10年前

Re: タスクシステムでつまずいています...

#8

投稿記事 by じゃじゃかぶ » 9年前

>> softya(ソフト屋)さん
ありがとうございます!
ちなみにsoftya(ソフト屋)さんは他にどのような組み方をしておられるのですか?
実は別にタスクシステムにこだわっているわけではなくてもっと良い方法があるなら是非聞かせて欲しいです!

>> kinoさん
さきほどmapを使って手探りで実装してみたのですが毎回newしては終わったらdeleteするという設計にしてしまった
おかげで例えばプレイヤーの座標とかが保持されず毎度初期化されるというアホみたいな失敗をしてしまいました。。笑
これは必要になったらnewして要らなくなるまで持ち続ける仕組みを設けるべきですか?
それともプレイヤークラスとプレイヤーのタスククラスは別に作っておくべきなんですか?

kino

Re: タスクシステムでつまずいています...

#9

投稿記事 by kino » 9年前

>タスクシステムにこだわっているわけではなくてもっと良い方法があるなら是非聞かせて欲しいです!
横から入ってすいません^^;
ここは「タスクシステムも良い方法と思うのですがもしよければ他の方法も知りたいです」
と書いて欲しいと個人的には思いました^^;

>これは必要になったらnewして要らなくなるまで持ち続ける仕組みを設けるべきですか?
>それともプレイヤークラスとプレイヤーのタスククラスは別に作っておくべきなんですか?
すいませんそのへんはなんとも言えないです
というのもクラスとかない時代だったのですべてグローバル変数で管理していました^^;
使わなくなった配列部分は先頭に0などを入れて再利用できるようにしていました

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

Re: タスクシステムでつまずいています...

#10

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

タスクシステムをどう使うか、この点が大事です。
向いているもの物あれば、向いていないものもあります。
オセロゲームにタスクシステムを使おうって人はそういないと思います。
私はタスクシステム至上主義ではありません。
でもタスクシステムが有用な場面も多々あります。部分的に使うのも良いと思います。
つまり適材適所なので、作るものの仕様という前提がないと語れない話ではあります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe()

Re: タスクシステムでつまずいています...

#11

投稿記事 by ISLe() » 9年前

ソースファイル(翻訳)単位であろうが、クラス単位であろうが、あるいはラムダ式であったとしても、構造化のパターンはすべて共通です。
#マルチに具現化できるかどうかとかの違いはありますが。

どのように分類し組み合わせるかといった点で、ゲームだからといって特別なものはありません。
同様に生存期間をどのように管理するかといった点で、ゲームだからといって特別なものはありません。

デザインパターンのように便利だと思う仕組みをまとめたものをタスクシステムと呼んでいるに過ぎません。
クラスを使わなければいけないものでもないし、スマートポインタを使わなければいけないものでもありません。
どのような技術を導入するかというのはシステムが使いやすいか使いやすくないかでしかありません。

生存期間が思ったようにならないというのは単に設計(分類と組み合わせ)が悪いというだけです。
どのようにクラス設計するのが良いかとか、ゲーム進行によってタスクの生成・破棄を行うのはどこか、というのも設計の話です。


共通の構造化パターン(いわゆるオブジェクト)を入れ子にして、ピラミッド構造を作る。
上位のオブジェクトが下位のオブジェクトを管理する。
下位のオブジェクトは挙動に必要な情報を上位のオブジェクトに問い合わせる。
といったところが設計の王道かと思います。
過去にも同じような話題のトピックがいくつもあったかと。

構造化パターンはタスクに限定されずプログラムのあらゆる部分に共通して存在します。
生存期間の管理というのはプログラミングそのものと言えるのではないでしょうかね。

閉鎖

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