2017-11-17 33 views
-1

게임을 프로그래밍하고 싶습니다. 나는 이미 적과 플레이어를 프로그래밍했다. 게임 개체가 적든 플레이어이든 상관없이 (왼쪽 및 위쪽 또는 오른쪽 및 위쪽 또는 왼쪽 또는 아래쪽 또는 오른쪽 및 아래쪽) 코너로 이동하면 게임 개체가 필드 외부로 이동합니다.충돌 탐지가 잘못되었습니다.

두 번째 문제가 있습니다. 때로는 적을 짧은 시간 동안 들판의 가장자리에 붙이십시오.

#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()를 사용)를 사용하고 있기 때문에 문제가

+0

고려 : 'player.setPosition()'을 호출 한 후'playerPos'가'player.getPosition()'의 값과 같습니까? 필요한 경우 디버거를 사용하여 확인하십시오. – 1201ProgramAlarm

+0

사각형이 "outisde"이지만 그 속도가 다음 프레임에서 "내부"로 되돌아 갈만큼 충분히 높지 않은 경우를 생각해보십시오. – molbdnilo

답변

1

도움이됩니다. xy 위치가 모두 음성 인 경우에, 당신은 처음 y이 부정적이기 때문에, 당신은 0 y에 플레이어 위치하지만 이전 여전히 부정적인x 위치를 설정, 다음 줄에서는 0으로 플레이어 x 위치를 설정합니다 사본에서.

항상 플레이어 위치를 얻는 것 (복사본을 사용하지 않음) 또는 두 세트를 설정하지 않고 플레이어 x 또는 y 위치를 설정하는 방법을 추가하는 등 여러 가지 가능한 솔루션이 있습니다.