マルチスレッドで他の関数との連携がおかしいみたいだから本番ではやらない方がいいです
ただし、一度やってみる価値はあります
948 :
943=910:2011/11/28(月) 21:12:59.17 ID:9qyN3uEA
>>943です。
>>910でもあります。
皆さんレスありがとうございます。
とりあえず試しで、スレッドを追加して、秒間60回程度ProcessMessageしてみましたが、
Windowのタイトルをつかむことすら出来なかったりな状況は変わりませんでした。
画面の更新は出来るし、CPU使用率もほとんど上がってないのですが…。
画面更新してない停止状態のときは、別のウィンドウが上にくると、その色に塗りつぶされちゃいます。わけわかめ。
スレッド自体は10位起動しているが、描画をするしてるのは主に描画用の1スレッドだけなんだがなぁ…。
つд`)
マルチスレッドはだめだ!
いや、そんなばかな。あばばばば。
メッセージキューは各スレッドごとに作成される
=ウィンドウを作成したスレッドでメッセージ処理をしないとならない
Windowsの基本な
950 :
943=910:2011/11/28(月) 21:51:22.62 ID:9qyN3uEA
でけたーよ!
当たり前なのかも知れないですけど、後進の役に立てばとおもい、スレ汚ししていきます。
@DxLib_Init() は、描画を行うスレッドでおこなう。DXライブラリのウィンドウはそのスレのもの。
(これは、Win32APIに詳しい人なら当たり前にわかることなのかも?)
AProcessMessage() は、ウィンドウの持ち主=描画を行うスレ=DxLib_Init()をしたスレが行う必要がある。
(他のスレにやらせても、意味ないくさかった。)
B描画を行う内容がなくても、最新の内容orすっからかん で描画(ScreenFlip()とか)しないと画面更新されないのね。
(そういうものだと言われれば納得だけど、自動で最新を維持してくれるのかと妄想してた。)
C描画スレが管理している裏画面へ別スレッドに書き込みを委譲するのは試していない。
(けど、気になるからそのうちやるかも。)
サーセンでした。ありがとうございました。
951 :
943=910:2011/11/28(月) 22:05:25.03 ID:9qyN3uEA
>>949 どもです。
ということは、もしかして、
DxLib_Init()したスレで何とかしてMessageProcess()できれば、
描画スレとは別でもいいってことですかね。今度試してみよう、今日は疲れた。
>>951 うろ覚えだけど、それって公式の掲示板の過去ログになかった?
「スレッド」で検索して、、、わしも昔マルチスレッド+DX ライブラリのわなにはまった。
3dゲーム作りたくてUnityのjavascriptのコード勉強してたんだが
なんか見たことないオブジェクトとプロパティが多すぎて、使いこなせるわけがない
DXlibでも3dできるからこっちにしようか迷ってる
unityとDXライブラリじゃ大分違うぞ
前者はゲームエンジンだし
OpenGLでもDirectXでもBlenderでもPhysiXでもODEでもいいから
迷わずインスコして手を動かしてなんか作れ
言語を選ぶのはそれからだ
3dゲームはモデル自作するのが難易度高すぎる
それさえ出来れば後はなんとかなるんだが
フリーでこれといった定番ツールがないのがつらいね
そもそも選択肢がメタセコイアかブレンダーぐらいしかない
有料でも使えそうなのは高いのばかり
メタセコにはモーション生成機能がないから外部ツールが必要になるしな
まじか、俺と逆じゃないか
メタセコで遊び半分で龍とか妖怪とか色々作れて、モデリングとか楽しいわとか思ってたのに
いざこれをUnityで使うとなると、2Dゲームの様には行かなかった
まあ、でもなんとなく分かってきた感じはあるからもう少し頑張ってみるわ
つかUnityはスクリプトでクラス継承しすぎなんだよ、ボケ
メタセコでもプラグインを使ってFBX形式のファイルの編集・入出力はできるそうだよ。
モデリングとアニメーションぐらいならBlenderで十分すぎるけどな
ちょっとしたゲームエンジンとか物理演算いれると難易度上がるし
DXライブラリで利用しずらいけど
ウィンドウがアクティブじゃない状態でも画面の更新を行うようにするにはどうすればよいでしょうか?
という質問をしようとして、ヘッダファイルを覗いたところ、SetAlwaysRunFlag()をみつけました。
本当にありがとうございました。
関数の戻り値なんですが、Get系じゃないものは、
正常:0
異常:0じゃない
というくらいでOKですか?
これもヘッダをかなり覚える必要があるのでしょうか?
覚える必要はない。調べる癖をつけよう。
大体は公式サイトにあるだろうし。
そういえばDXライブラリって関数名から直接解説ページに飛べるようなものがないよね
あってもよさそうなんだが
公式サイトに関数リファレンスがあるじゃないか
DXlib使って得たノウハウというかスキルっていうのは、他のゲーム制作ライブラリとか
エンジンとかで活かせるものなのかね?
なんで活かせないと思うんだ
DXライブラリは描画だけしかしないし、他の環境に移ったときにも身につけた技術を活かせるのをウリにしてる
関数一つで描画できるからライブラリ色が薄い
むしろ他ライブラリで身につけた技術ほど他に活かせない
なぜならガッチガチに独自仕様で固めてるから。
描画するならこのクラスに命令飛ばせーだの角度は256が最大の独自形式で指定してな!だの
描画しかしないのはいいところだと思うけどたまに描画以外もして欲しくなる
セーブデータ作りとか
自前だと破損調べるのとか面倒で
そんなの一度作ったら使い回せばええやん
セーブの破損チェックってなんのためにするの?
改変の検出なら簡単に実装できるチェックサムとかCRCでチェックでいいし
拡張子変えただけのZIPにして処理を丸投げでも十分すぎる
そういうのって必要なんだろうけど
まず「俺のゲームのデータ改変してまで遊んでくれるやついねーだろうな」
という気持ちが先立つわ。
チェックサムの実装なんて超簡単だろーが。ちょっとは勉強しようず
某有名アクションゲームサークルでさえセーブデータはメモ帳で適当に値弄っただけで改変できるのに
別にチェックサムが難しいとは言ってねーべ。
チェックサムと聞くと昔雑誌のマシン語プログラムを
バイナリエディタでせこせこ入れては暴走させて
ちまちまチェックサム確認してた思い出が頭をよぎるだけで。
「セーブデータが簡単にいじれちゃうゲームは萎える」っていう人がもしいるなら必要かもしれないけど
そういう人っているのかな?
「むしろ弄ってくれ」がスタンスなオイラはiniファイルにセーブ。
まあ、ハイスコアと隠しステージ出現フラグくらいしか無いけどな。
[Game]
HighScore=10000
SecretLevel=1
Debug=0
こんな感じで。
>>976 自分がプレイ中のゲームで厨房が改造の話を始めたりすると俺は萎えるけど
そもそも起動中プロセスのメモリいじくれば何でもできちゃうからなー
四角をランダムに傾けたいのですが、どんな方法がありますか?
GetRand(360)と<math.h>をランダムに傾けたいのですがインクルードし、三角関数で頂点を求め・・・
というのは思いつきますが、かなり面倒です。
具体的には↓の動画(素人の実況なので、苦手な方はお手数ですがミュートをお願いします)
http://www.nicovideo.jp/watch/sm13480051 の6:17秒の標的をロックオンした時のエフェクトを作りたいと思っています。
>>979 面倒なら、画像として用意しておいて DrawRotaGraph しちゃえば?
>>980 あ、なるほど。こういう使い方ができるのですね
ありがとうございます
>>979 ランダムと言うよりは、四角形を回転させながら縮小させている気がする。
位置とタイミングがずれてるのが重なってるからそう見えてるだけで。
>>982 あ、ホントですね。こういうののほうがカッコイイのかなぁ
エフェクトは難しいですね
>>979 四角のグラフィックを用意して、DrawRotaGraphで回転させれば良い感じになりそう。
面倒って、一度関数化すればいいだけじゃ……?
>>979 正方形なんだからかなり面倒どころか一番単純じゃない?
現在三角関数がわからないから三角関数の理解が面倒臭いという意味かな?
ぶっちゃけ中心点からランダムなx方向、y方向の距離を取ってやって、
符号変えたりx方向とy方向を入れ替えてやったりすりゃ計算すらしないで正方形の頂点4つ作れるじゃん。
後エフェクトがかっこいいかどうかは少し突っ込みどころ。
キーがどれか押されていると関数を実行ということをしたいのですが、
コードが冗長になって困っています
現在は↓のような感じです。
/*キー押下状態の配列*/
char Buf[ 256 ] ;
/*F8キーを押下 処理1*/
if( Buf[ KEY_INPUT_F8 ] == 1 )
{
syori1();
}
/*F7キーを押下 処理2*/
if( Buf[ KEY_INPUT_F7 ] == 1 )
{
syori2();
}
/*F6キーを・・・
これらをまとめたいのですが、何かいい方法はありますか?
/*理想*/
if(・・・ Buf[ KEY_INPUT_F7 ] == 1 || Buf[ KEY_INPUT_F8 ] == 1 || Buf[ KEY_INPUT_F9 ] == 1 ・・・ )
{
syorix();
}
・・・ Buf[ KEY_INPUT_F7 ] == 1 || Buf[ KEY_INPUT_F8 ] == 1 || Buf[ KEY_INPUT_F9 ] == 1 ・・・
の部分をまとめたいのです
それとも
syorix(Buf);
と言う風に配列を渡し、関数を毎回実行するものなのでしょうか
関数ポインタ使えばなんとかなりそうじゃね?
>>988 ありがとうございます
関数ポインタ挑戦してまみす
理想とする処理だとsyori1とsyori2の優先順位や両方とも実行させるのかが曖昧じゃね?
syorix(Buf)は最初の処理が関数化されただけかもしれないが結局は細かく分けると一番いい気がする
同じ優先度のキーコードと関数ポインタの構造体配列を作りループで回すと
斜めとか同時押し処理は面倒だけど綺麗にはなるのかも
別ファイルにおいてあるキー取得関数がうまく反応しません。
どうしたらいいでしょうか?
Key[256];
int keyclip(){
char tkey[256];
GetHitKeyStateAll(tkey);
for(int i=0;i<256;i++){
if(tkey[i]!=0){
Key[i]++;
}else{
Key[i]=0;
}
}
}
int inputkey(char input){
return Key[input];
}
↑別ファイル
呼び出し
if(inputkey(KEY_INPUT_W)%=2){}
エラーで左側のオペランドが左辺値になってませんといわれます
KEY_INPUT_Wの定義がD_DIK_Wとかいう文字列?なんですが、これは一体どうしたら
C言語の本を購入し、ファイル分割の項目を読み込む
何がしたいのかはよくわかんないけど
エラーメッセージは %= の演算子は変数に対して使うものって言ってる
=消せ
イコール消したら治りました恥ずかしい
>>992 それはどういう・・・?
996 :
992:
>>995 ごめん、= 見てなかっただから気にしないで