[Windows][C] ゲームプログラムが実行途中に止まってしまいます
いつもお世話になっております。
今アクションゲームの基盤となる簡単な動きをさせるプログラムを作成したのですが、なぜだか時間が経つと止まるという不思議な現象に陥っています。
プログラムの内容はジャンプや移動をするだけの単純なもので、描画やキャラの移動はスレッドで個別に行っています。
キャラが止まったとき、FPSは動いていたので、描画の方のスレッドにたぶん問題はないと思っています。
キャラが止まると同時にゲーム自体もおかしくなってしまうのですが、それはキャラ動作のスレッドが異常によって止まってしまったからなのでしょうか?
解決法のわかる方、すみませんがご指導お願いいたします。
以下に問題のあると思われるスレッドを貼ります。
描画やプロシージャに問題があると思われる方がいましたら補足で追加いたします。
/*************** キャラクターを動かす ****************/
DWORD WINAPI CharacterMove(LPVOID vdParam) {
HDC hdc;
RECT rect;
ThreadParam * param;
HRGN hit = CreateRectRgn(0, 0, 0, 0);
int JUMP = 0;
int DBJUMP = 0;
int position = 0;
int flag = 0;
param = (ThreadParam *)vdParam;
GetClientRect(param->owner, &rect);
while(TRUE){
/* 左移動 */
if(character.x > rect.left + 5){
if(GetAsyncKeyState(37)){
if(CombineRgn(
hit,
CreateEllipticRgn(character.x - 12, character.y, character.x - 12 + 25, character.y + 25),
S_RGN, RGN_AND) == NULLREGION){
character.x -= 12;
}
}
}
/* 右移動 */
if(character.x + 25 < rect.right - 5){
if(GetAsyncKeyState(39)){
if(CombineRgn(
hit,
CreateEllipticRgn(character.x + 12, character.y, character.x + 12 + 25, character.y + 25),
S_RGN, RGN_AND) == NULLREGION){
character.x += 12;
}
}
}
/*** ジャンプ ***/
if(CombineRgn(
hit,
CreateEllipticRgn(character.x, character.y + 1, character.x + 25, character.y + 1 + 25),
S_RGN, RGN_AND) != NULLREGION){
if(GetAsyncKeyState(38)){
JUMP = 32;
}
}
/***** ジャンプ時・落下時 *****/
if(CombineRgn(
hit,
CreateEllipticRgn(character.x, character.y + 1, character.x + 25, character.y + 1 + 25),
S_RGN, RGN_AND) == NULLREGION || JUMP == 32){
/*** 一度キーを離さないと2段ジャンプは成立しない ***/
if(!GetAsyncKeyState(38)){
flag = 1;
}
/*** 2段ジャンプ ***/
if(GetAsyncKeyState(38) && flag == 1 && DBJUMP < 1){
JUMP = 26;
DBJUMP++;
}
/*** 慣性 ***/
if(CombineRgn(
hit,
CreateEllipticRgn(character.x, character.y - JUMP, character.x + 25, character.y - JUMP + 25),
S_RGN, RGN_AND) != NULLREGION){
flag = 0;
DBJUMP = 0;
if(JUMP < 0){
while(CombineRgn(
hit,
CreateEllipticRgn(character.x, character.y + 1, character.x + 25, character.y + 1 + 25),
S_RGN, RGN_AND) == NULLREGION){
character.y++;
}
}else{
while(CombineRgn(
hit,
CreateEllipticRgn(character.x, character.y -1, character.x + 25, character.y + 1 + 25),
S_RGN, RGN_AND) == NULLREGION){
character.y--;
}
}
JUMP = 0;
}else{
character.y -= JUMP;
}
/* 最大落下速度 */
if(JUMP > -20){
JUMP -= 3;
}
}
Sleep(16);
}
DeleteObject(hit);
ReleaseDC(param->owner, hdc);
return TRUE;
}
お礼
ご教授ありがとうございます。 m_rgn.PtInRegion(pos) で正常動作いたしました。 CRgn にも PtInRegion ってのがあるんですねー。 勉強になりました。