게임을 프로그래밍하고 싶습니다. 나는 이미 적과 플레이어를 프로그래밍했다. 게임 개체가 적든 플레이어이든 상관없이 (왼쪽 및 위쪽 또는 오른쪽 및 위쪽 또는 왼쪽 또는 아래쪽 또는 오른쪽 및 아래쪽) 코너로 이동하면 게임 개체가 필드 외부로 이동합니다.충돌 탐지가 잘못되었습니다.
두 번째 문제가 있습니다. 때로는 적을 짧은 시간 동안 들판의 가장자리에 붙이십시오.
#include <Windows.h>
#include <SFML/Graphics.hpp>
#include <vector>
#include <ctime>
#include <cstdlib>
#include "Player.hpp"
#include "Square.hpp"
#define WIDTH 800
#define HEIGHT 600
bool kUp = false, kDown = false, kLeft = false, kRight = false;
Player player(WIDTH/2 - 10, HEIGHT/2 - 10, 10, sf::Color::Green);
std::vector<Square> squares(10);
sf::RenderWindow window;
void update(float elapsedTime) {
if (kUp == true) player.move(0, -300.0f * elapsedTime);
if (kDown == true) player.move(0, 300.0f * elapsedTime);
if (kLeft == true) player.move(-300.0f * elapsedTime, 0);
if (kRight == true) player.move(300.0f * elapsedTime, 0);
sf::Vector2f playerPos = player.getPosition();
if (playerPos.x < 0) player.setPosition(0, playerPos.y);
if (playerPos.y < 0) player.setPosition(playerPos.x, 0);
if (playerPos.x > WIDTH - 20) player.setPosition(WIDTH - 20, playerPos.y);
if (playerPos.y > HEIGHT - 20) player.setPosition(playerPos.x, HEIGHT - 20);
for (int i = 0; i < squares.size(); ++i) {
sf::Vector2f squareSpeed = squares[i].getSpeed();
squares[i].move(squareSpeed.x * elapsedTime, squareSpeed.y * elapsedTime);
sf::Vector2f squarePos = squares[i].getPosition();
if (squarePos.x < 0) squares[i].setSpeed(-squareSpeed.x, squareSpeed.y);
if (squarePos.y < 0) squares[i].setSpeed(squareSpeed.x, -squareSpeed.y);
if (squarePos.x > WIDTH - 5) squares[i].setSpeed(-squareSpeed.x, squareSpeed.y);
if (squarePos.y > HEIGHT - 5) squares[i].setSpeed(squareSpeed.x, -squareSpeed.y);
}
}
void draw() {
for (int i = 0; i < squares.size(); ++i) {
window.draw(squares[i]);
}
window.draw(player);
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) {
sf::ContextSettings settings;
settings.antialiasingLevel = 8;
window.create(sf::VideoMode(WIDTH, HEIGHT), "Runner - The Red Squares", sf::Style::Titlebar | sf::Style::Close, settings);
window.setVerticalSyncEnabled(true);
srand(time(0));
for (int i = 0; i < squares.size(); ++i) {
squares[i] = Square(rand() % WIDTH, rand() % HEIGHT, 5, 5, sf::Color::Red);
}
sf::Clock clock;
while (window.isOpen()) {
sf::Time elapsedTime = clock.restart();
window.clear(sf::Color::Black);
update(elapsedTime.asSeconds());
draw();
window.display();
sf::Event evt;
while (window.pollEvent(evt)) {
if (evt.type == sf::Event::Closed) {
window.close();
}
if (evt.type == sf::Event::KeyPressed) {
if (evt.key.code == sf::Keyboard::Up) kUp = true;
if (evt.key.code == sf::Keyboard::Down) kDown = true;
if (evt.key.code == sf::Keyboard::Left) kLeft = true;
if (evt.key.code == sf::Keyboard::Right) kRight = true;
}
if (evt.type == sf::Event::KeyReleased) {
if (evt.key.code == sf::Keyboard::Up) kUp = false;
if (evt.key.code == sf::Keyboard::Down) kDown = false;
if (evt.key.code == sf::Keyboard::Left) kLeft = false;
if (evt.key.code == sf::Keyboard::Right) kRight = false;
}
}
sf::sleep(sf::milliseconds(15));
}
return 0;
}
내가 잘못 한 것을 아는 사람이 있습니까? 각
덕분에 당신이 (playerPos
에 저장) 플레이어 위치의 사본 또한 현재 플레이어의 위치를 업데이트하는 동안 (player.getPosition()
를 사용)를 사용하고 있기 때문에 문제가
고려 : 'player.setPosition()'을 호출 한 후'playerPos'가'player.getPosition()'의 값과 같습니까? 필요한 경우 디버거를 사용하여 확인하십시오. – 1201ProgramAlarm
사각형이 "outisde"이지만 그 속도가 다음 프레임에서 "내부"로 되돌아 갈만큼 충분히 높지 않은 경우를 생각해보십시오. – molbdnilo