我正在创建一个游戏,您可以在屏幕中间沿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;
}
由于屏幕顶部会有一些元素掉落,我为这些元素实现了一个链接列表,因此为什么会在碰撞函数上进行递归。如果有人知道为什么角色在碰撞后不动,我将非常感激。
答案 0 :(得分:0)
我的猜测:您的collision(c, scene)
方法会查看当前时间步的冲突。在这种情况下,move
函数
// \/ This here is the problem -- if you're currently colliding with an object you don't allow any movement, even if you're moving out of the object
if(((c->xPos < 0) || (c->xPos + c->dest.w > WIDTH)) || (collision(c, scene))) {
c->xPos -= c->xVel * timeStep;
}
玩家在与物体相撞后不允许移动。解决方案是在采取步骤之前检查碰撞:
float newX = c->xPos + c->xVel*timeStep;
float newY = ...;
if (!collision(newX, newY, scene)) {
c->xPos = newX;
...
}