私は、画面の中央でx軸に沿ってドットを移動できるゲームを作成しています。上から落ちてきて、ドッジする必要のある要素があります。私が実装した衝突検出は正しく動作するようです。キャラクターとオブジェクトとの衝突を検出した後、キャラクターは移動できなくなります。
私の問題は、文字(ドット)がオブジェクトの方に移動し、衝突が発生したときに、文字を移動できなくなり、固定された位置にとどまることです。これは、文字がウィンドウの端に衝突したときには発生しませんが、下に表示されるように、ウィンドウの衝突とオブジェクトの衝突は同じコードで実行されます。
メインゲームループ:
while(running) {
// Queue of the events happening
while(SDL_PollEvent(&event)) {
if(event.type == SDL_QUIT) {
running = false;
}
else if(event.type == SDL_KEYDOWN && event.key.repeat == 0) {
switch(event.key.keysym.sym) {
case SDLK_UP:
//sprite->yVel -= VELOCITY;
break;
case SDLK_DOWN:
//sprite->yVel += VELOCITY;
break;
case SDLK_LEFT:
sprite->xVel -= VELOCITY;
break;
case SDLK_RIGHT:
sprite->xVel += VELOCITY;
break;
}
}
else if(event.type == SDL_KEYUP && event.key.repeat == 0) {
switch(event.key.keysym.sym) {
case SDLK_UP:
//sprite->yVel += VELOCITY;
break;
case SDLK_DOWN:
//sprite->yVel -= VELOCITY;
break;
case SDLK_LEFT:
sprite->xVel += VELOCITY;
break;
case SDLK_RIGHT:
sprite->xVel -= VELOCITY;
break;
}
}
} // Poll event loop
float timeStep = getTicks(ticks)/(float) 1000;
move(sprite, timeStep, WINDOW_WIDTH, WINDOW_HEIGHT, head);
startTimer(ticks);
// Clear window then draw image
SDL_RenderClear(rend);
SDL_RenderCopy(rend, background->element, NULL, NULL);
SDL_RenderCopy(rend, sofa->element, NULL, &sofa->dest);
setPosition(sprite, sprite->xPos, sprite->yPos);
SDL_RenderCopy(rend, sprite->element, NULL, &sprite->dest);
SDL_RenderPresent(rend);
capFrameRate(timeStep);
} // Main game loop
移動し、衝突機能:画面の上部から落ちてくるいくつかの要素があるだろうと
void move(Character *c, float timeStep, const int WIDTH, const int HEIGHT, Scene *scene) {
c->xPos += c->xVel * timeStep;
// Collision check for the walls
if(((c->xPos < 0) || (c->xPos + c->dest.w > WIDTH)) || (collision(c, scene))) {
c->xPos -= c->xVel * timeStep;
}
}
bool collision(Character *character, Scene *scene) {
if(SDL_HasIntersection(&character->dest, &scene->element->dest)) {
return true;
}
else {
if(scene->nextElement == NULL) {
return false;
}
else {
collision(character, scene->nextElement);
}
}
return false;
}
私はそれらのためのリンクリストを実装しましたしたがって、なぜ衝突関数の再帰が必要なのでしょうか。衝突後にキャラクターが動かない理由について誰かが考えているなら、私はとても感謝しています。
だから、私はイベントキューの前に移動機能を開始する必要があります意味ですか? – JLW
@JLWどういう意味なのか分かりません。あなたの現在のポジションが許可されているかどうかをチェックするのではなく、次のポジションが許可されたポジションかどうかをチェックして確認することをお勧めします。あなたがコリジョンボディを動かすならば、あなたはいくつかの追加の修正を加える必要があります。 – pingul
ああ、はい、私はあなたが今何を意味するかを取得します。私は1日か2日でそれを与えます、助けをありがとう、それが事を解決すればあなたに知らせる!ありがとう! – JLW