-1
我正在創建一個遊戲,您可以在屏幕中間沿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
好的,我明白你的意思了。我會在一兩天內給出一個答案,謝謝你的幫助,會讓你知道它是否解決了問題!謝謝! – JLW