Joust克隆游戏碰撞失效求助:角色站平台后约5秒穿模
经典街机Joust克隆版碰撞检测穿模问题
我正在开发经典街机游戏Joust的基础克隆版,目前实现了碰撞检测功能。该功能起初正常,但角色在平台上静止或移动时,约5秒后会出现穿模现象。
我先做了代码清理、测试及小幅重构,简化检测逻辑后代码更简洁,但问题依旧——碰撞检测仍能正常工作约5秒。随后我考虑到重力因素:角色在地面时重力仍可能生效导致穿模,因此添加了isGrounded变量,规划的逻辑顺序为:
- 角色初始略高于地面
handleCollision判定无碰撞→isGrounded=false- 角色更新时应用重力
- 角色下落
- 随后角色与平台碰撞
handleCollision判定角色在平台上→isGrounded=true- 角色更新时不再受重力影响
附上相关代码:
#include "game.h" Game::Game() : window(sf::VideoMode(windowWidth, windowHeight), "App") { // stuff // isGrounded = true; } void Game::handleCollision(sf::RectangleShape &A, const sf::RectangleShape &B) { sf::FloatRect BoxA = A.getGlobalBounds(); sf::FloatRect BoxB = B.getGlobalBounds(); // Check collision from above if (BoxA.intersects(BoxB) && BoxA.top + BoxA.height < BoxB.top + BoxB.height) { A.setPosition(A.getPosition().x, B.getPosition().y - BoxA.height); // A.getSize().y); isGrounded = true; std::cout << "Grounded: " << std::endl; } else { isGrounded = false; std::cout << "In The Air: " << std::endl; } } void Game::handleCollisions() { handleCollision(player1, platformGround); } void Game::update() { float deltaTime = frameTime.asSeconds(); // Player 1 movement control using keyboard input if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) { player1.move(-playerSpeed * deltaTime, 0); } else if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) { player1.move(playerSpeed * deltaTime, 0); } // Player 1 flapping control using spacebar if (sf::Keyboard::isKeyPressed(sf::Keyboard::Space)) { player1Velocity = flapVelocity; } // Apply gravity only when player is not grounded if (!isGrounded) { player1Velocity += gravity * deltaTime; } else { player1Velocity = 0.0f; } // Update position player1.move(0, player1Velocity * deltaTime); handleCollisions(); }
这肯定是个显而易见的问题,提前感谢各位的帮助。
内容的提问来源于stack exchange,提问作者Akrokan
相关产品推荐
相关产品推荐

