忍者ブログ

[PR]

2025年03月14日
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

ogg再生管理クラスの問題

2009年05月10日
色々とマルチスレッドの勉強をしてました。

現在作ってるErstKerfは、音楽とその他で2~3スレッドしか走らせていませんが、今後のPCの進化の方向性を考えると絶対に必要になりそうです。そこまで負荷の高いゲームを作るなら、ですが。

そのおかげで、Ogg再生開始時の音が切れるような症状の原因がなんとなく掴めました。
といっても、これまでの知識でも頭が回れば気付けていたことなんですが。

今作のOggプレイヤーの仕様では、2つの再生クラス(A、B)を確保しておき、ゲームを開始すると、まずはAのプレイヤーを使って音楽を鳴らします。
曲を変更すると、Aの音楽を指定秒数掛けてフェードアウトさせ、Bの方で新しい曲を再生するようフォーカスを変更し、Aの方はフェードアウトが終わると休止状態になるようにしています。

で、ここで問題になったのが、マルチスレッドでした。
このA、Bの再生プレイヤーは、共にマルチスレッドで音楽をデコード、再生させていたのですが、それを担当するメンバ関数が以下のように宣言されていました。

 static void __cdecl streamThread( void* player );

static装飾詞がついていたために、クラスを2つ確保していても両方ともこの関数を同じメモリ空間で共用することになってました。
互いにメモリの干渉がない場合はいいのですが、streamThreadは基本的にゲーム終了時までループしつづけるので、ローカル変数もその間保持され続けます。
これのせいで、新しい曲を開始したときに以前のローカルメモリが干渉してしまっていました。
今までは、前の曲が終わってから次の曲が始まるまでに間のあるシーンが多かったのでこの干渉が少なく、気付くのが遅れました。

で、直すためにstaticを外そうと思ったのですがこれが難問で、どうやっても_beginthreadに関数ポインタを渡せなくなってしまいました。error c3867がどうにも出来ず、MSDNを参照してもちょっと解決方法が分かりませんでした。
結局、再生用クラスにIDを与え、staticつきのstreamThread関数を2個つくってID==0ならA用のスレッド、それ以外はB用のスレッドを開始という感じに誤魔化すことにしました。

なんか長々としてますが、個人的にこの状態がなんとなく気持ち悪いです。
もし、staticを外したメンバ関数を_beginthreadに渡す方法が分かる方がいましたら御一報下さい。
PR

GWきたよー

2009年05月01日
久々にたっぷり時間が取れる!
5月5日にじゅんくんがM3というイベントで音楽CDを配布します。
パッケージイラストとか担当させて頂いたので、もし参加予定のある方がいたら是非ともゲッツしてみてください。


http://blog.cnobi.jp/v1/blog/user/facb69965cc0e2aa2ab0d154650d346a/1241181907


ゲームの方はアーケードモードの全ボスを一通り実装しました。
おかげでボスモードの方も出来上がりました。
なので、休み中はグラフィックとステージマップの作成に専念しようと思ってます。

はこ

2009年04月25日


昨日買ってきた参考書。
あまりの箱っぷりに感動した。
これはネタになると思って撮影。

論文集みたいなのがついてなければ半分くらいのサイズなんですけどねー。
土日に突入したのでゲームの方を再開してきます。
現在5Bossを実装中です。

レン

2009年04月10日

http://blog.cnobi.jp/v1/blog/user/facb69965cc0e2aa2ab0d154650d346a/1239372782

少し日記のほうをサボってしまいました。
現在、道中をすっとばして4ボスを作成中です。

私生活の方がかなり忙しくなってきたので、出来るところからどんどん進めるようにしてます。
ゴールが見えてたほうがやる気でますので
要所部分を一気にやっていく予定。

ジョイパット入力

2009年03月16日
というわけで、2軸ジョイスティックのゲームパットに対応させました。
PS2コントローラーみたいなやつのことです。
左スティックで移動、右スティックでマウス操作出来るようになってます。
まだ調整が必要ですが、これでマウス操作が苦手でも少し遊びやすくなるかもしれないです。

左手にコントローラー、右手にマウスというWiiスタイルも可能となってます。

稼ぎシステム

2009年03月08日

http://blog.cnobi.jp/v1/blog/user/facb69965cc0e2aa2ab0d154650d346a/1236519763

マップチップを大改装中。
高度文明っぽい感じを出すため色々試してます。

それと、スコアアイテムの挙動を少し弄って稼いでる感じを出せるようにしてみました。
ショットボタンを一定時間離していると自動回収される仕様に変更されてます。

フィールドに存在しているアイテムが多いほどボーナスがつくので、
わざと回収が始まらないようにショットを打ち続けて、後で一気に回収することでスコアが上乗せされます。
ただし、ショットボタンを押している間はエネルギーが回復していかないので
通常プレイより弾切れに注意する必要があります。

ユーリ

2009年03月01日


3面ボスのユーリ。
ゴーレムの管理、製造担当なので、ボス戦の時もわらわら沸いてきます。
雑魚を処理しつつ、動き回って攻撃攻撃。

無題

2009年02月22日


3面構成中。
3面はこれまでの撃ち合いに加え、こっちの攻撃に反応してカウンターしてくるタイプが幾つか出てきます。
上のSSの敵の場合、一発当てるとすごい撃ち返しがきますが、一気に破壊してしまえば弾消しが発生するので、単体なら脅威ではないです。
他の敵と戦っているとき、半端に攻撃を当てるとえらいことになる、お邪魔虫系です。
狙って弾消しすることで有利に進めていくこともできますよー



そして時計塔の実況プレイがついに!
作者的には、他の人がどんな感じにプレイしてるのか興味があったのでとっても楽しめました。
そして、初めての方にとって後半面がいかに鬼畜かが良く分かりましたw
実況主さん、ありがとうございましたー。