作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在创建一个游戏,您可以在屏幕中间沿 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;
}
由于会有一些元素从屏幕顶部落下,我已经为这些元素实现了一个链接列表,因此为什么要在碰撞函数上进行递归。如果有人知道为什么角色在碰撞后不移动,我将非常感激。
最佳答案
我的猜测:您的 collision(c, scene)
方法查看当前时间步长的碰撞。在这种情况下,move
函数中的 if 语句
// \/ 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;
...
}
关于c - 检测到我的角色与物体发生碰撞后,角色无法再移动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43365730/
我有本地更改和远程更改。 有人告诉我必须先推,再 pull 。这背后有什么原因吗? 最佳答案 那个人错了:正确的模型是pull-before-you-push,而不是相反。 当您pull时,git 将
我正在使用最新版本的 Flat UI Pro 1.3.2 ( http://designmodo.com/flat/ ),jQuery 插件 flatui-radiocheck v0.1.0 和 iO
我是一名优秀的程序员,十分优秀!