コンテンツへスキップ

STG その2

絵的に見せるものがないのでしばらくプログラムネタで。

最初八華閃をpythonで作ったときはあくまでプロトタイプのつもりで、あとでC++でつくり直すつもりだったんですが、作ってみると十分動いてたのでそのまま仕上げちゃったかんじでして。

で、どうせpythonで作るなら極力お大尽に行きたいですよね、やっぱ。まあLLでアクションゲーム作ってる時点で十分富豪的プログラミングですが。

effっていうpython用のDirectX用モジュール上で今のうちのスペック(C2D2.4GHz GF7600GT)でオブジェクト数がせいぜい500個、1000いくと確実に処理落ちする程度のパフォーマンスなんですが、まあうまくやればこれでも十分で。逆にポリ数は50万ポリぐらいでも平気なようですけど。

パーティクルを使えば2000個ぐらい弾が出せるかも知れませんが、組むのが泥臭くなりすぎるので、弾をたくさん出したくなったら考えます。でもそれなら素直にXNAとかかなあ。箱で自作ゲームを動かしたいナリ。

あとまあ、そろそろFF14用にパソコン買い換えようと思うので、それを基準につくればたぶんオブジェクト1000個ぐらい余裕で動くでしょうw

前置きはそれぐらいにして、敵とか弾とかは全部クラスとして作るとして、そのオブジェクトをどうやって管理しようかという話なんですが、とりあえず配列に全部ぶち込んでみたところ、スライスが遅すぎて使えない。

つわけで次に辞書で。pythonなんてどうせ中身全部辞書なんだから自前のデータも全部辞書にぶち込んだれ、ってことで氷禄弾まではこんな感じで

[cc lang=”python”]
#初期化
ctEnemy = {} #コンテナ

#作成
ctEnemy[self.cnt] = createEnemy()
cnt +=1

#update 毎フレームごとに呼び出す
for i in ctEnemy.keys():
if ctEnemy[i].update():
del ctEnemy[i]
[/cc]

みたいにやってました。ちなみにupdateがTrueを返すと削除するようにしてあります。でもこれだとpython3になったとき動かないし、あんまエレガントじゃないよなー、というわけで次に固定サイズの配列でポインター替わりのインデックス用意して

[cc lang=”python”]
#初期化
ctEnemy = [None for i in xrange(3000)]

#作成
ctEnemy[self.idx] = createEnemy()
idx +=1

#update
for i in xrange(idx):
if ctEnemy[i].update():
idx -= 1
ctEnemy[i] = ctEnemy[idx]
ctEnemy[idx] = None
[/cc]

これだと5割増ぐらい速いんだけどごちゃごちゃしてめどい。かと言ってそれ用にクラスとか作ると3倍ぐらい重くなるので不可。GCの無い環境だとこんなんがいいのかもしんないけど。最終的に

[cc lang=”python”]
#初期化
ctEnemy = []

#作成
ctEnemy.append(createEnemy())

#update
ctEnemy = [i for i in ctEnemy if not i.update()]
[/cc]

みたいな感じに。二番目より1割りまし遅いぐらいで見栄えもだいぶよろしいのではないかと。ただまあ、速度的には1000個程度のオブジェクトならどれもネックになってないけど。