2017-03-05 2 views
0

들어오는 상자 (물건)를 피하는 곳에 게임을 만들려고합니다. if 문을 사용하여 쉽고 빠르게 충돌을 감지하는 방법을 모르겠습니다. "// 충돌 감지"에서이 코드를 작성하려고했습니다. 화살표 (플레이어)가 상자를 만지면 게임이 닫히기를 바랍니다.C++ SFML 콜리 손 감지

홈페이지 Menu.h

#include <SFML/Graphics.hpp> 
#include <iostream> 
using namespace sf; 
using namespace std; 
#pragma once 

class main_menu 
{ 
public: 
    void startmenu(RenderWindow &gameDisplay, Font &font1, bool &MainMenu, RectangleShape &start, Event &evnt) 
    { 
    gameDisplay.setMouseCursorVisible(true); 


    Text starttext; 
    starttext.setCharacterSize(100); 
    starttext.setFont(font1); 
    starttext.setString("DODGE"); 
    starttext.setFillColor(Color(255, 255, 255)); 
    starttext.setStyle(Text::Bold); 

    FloatRect starttextRect = starttext.getLocalBounds(); 
    starttext.setOrigin(starttextRect.width/2, starttextRect.height/2); 
    starttext.setPosition(Vector2f(1366/2.0f - 30, 768 - 700.0f)); 




    RectangleShape outlinetop(Vector2f(1366, 50)); 
    outlinetop.setFillColor(Color(255, 255, 255)); 
    outlinetop.setPosition(0, 0); 

    RectangleShape outlinebottom(Vector2f(1366, 50)); 
    outlinebottom.setFillColor(Color(255, 255, 255)); 
    outlinebottom.setPosition(0, 718); 

    RectangleShape outlineright(Vector2f(50, 768)); 
    outlineright.setFillColor(Color(255, 255, 255)); 
    outlineright.setPosition(1316, 0); 

    RectangleShape outlineleft(Vector2f(50, 768)); 
    outlineleft.setFillColor(Color(255, 255, 255)); 
    outlineleft.setPosition(0, 0); 


    Text startbuttontext; 
    startbuttontext.setFont(font1); 
    startbuttontext.setCharacterSize(70); 
    startbuttontext.setString("PLAY"); 
    startbuttontext.setFillColor(Color(255, 255, 255)); 

    FloatRect startbuttontextRect = starttext.getLocalBounds(); 
    startbuttontext.setOrigin(starttextRect.width/2, startbuttontextRect.height/2); 
    startbuttontext.setPosition(Vector2f(1366/2.0f + 60 - 30, 768 - 480.0f)); 














    if (MainMenu == true) 
    { 
     Vector2f tempMouse(Mouse::getPosition(gameDisplay)); 
     if (start.getGlobalBounds().contains(tempMouse) && 
      evnt.type == Event::MouseButtonPressed && 
      evnt.key.code == Mouse::Left) 
     { 
      MainMenu = false; 

     } 







     //mouseposx = (Mouse::getPosition(gameDisplay).x); 
     //mouseposy = (Mouse::getPosition(gameDisplay).y); 


     /* 
      while (Mouse::getPosition(gameDisplay).x > 1366/2.0 && Mouse::getPosition(gameDisplay).x < 1083) 
       while (Mouse::getPosition(gameDisplay).y > 768 - 450 && Mouse::getPosition(gameDisplay).y < 868) 
        if (Mouse::isButtonPressed(Mouse::Left)) 
         MainMenu = false; 
         */ 



     if (Keyboard::isKeyPressed(Keyboard::Q)) 
     { 
      MainMenu = false; 
      gameDisplay.close(); 

     } 


     gameDisplay.draw(outlinebottom); 
     gameDisplay.draw(outlineleft); 
     gameDisplay.draw(outlineright); 
     gameDisplay.draw(outlinetop); 
     gameDisplay.draw(start); 
     gameDisplay.draw(starttext); 
     gameDisplay.draw(startbuttontext); 
     gameDisplay.display(); 

    } 



} 

    }; 

things.h

#include <SFML/Graphics.hpp> 
#include <iostream> 
#include <cstdlib> 
using namespace sf; 
using namespace std; 
#pragma once 
int RandomXpos = 0; 

class Thing 
{ 
public: 
void thingspawn(RenderWindow &gameDisplay, int &enemystartx, int &enemystarty, int &enemywidth, int &enemyheight, RectangleShape &thing, int enemyspeed) 
{ 
    thing.setFillColor(Color(255,255,255)); 
    if (thing.getPosition().y < 800) 
     thing.move(0.0f, 0.4f); 
    if (thing.getPosition().y >= 800) 
    { 
     RandomXpos = rand() % 1000; 
     thing.setPosition(RandomXpos, -200); 
    } 

    } 
    }; 

MAIN.CPP

#include <iostream> 
#include <SFML/Graphics.hpp> 
#include "things.h" 
#include "Main Menu.h" 
#include <cstdlib> 
#include <Windows.h> 
using namespace std; 
using namespace sf; 




int main() 
{ 
//FreeConsole(); 
RenderWindow gameDisplay(VideoMode(1366, 768), "Game", Style::Fullscreen); 
gameDisplay.clear(); 
int enemystarty = -200; 
int enemystartx = 300; 
int enemyheight = 30; 
int enemywidth = 300; 
int enemyspeed = 0.3; 
int enemycount = 1; 
int dodged = 0; 
int blockcolor = 0; 
bool MainMenu = true; 


Font font1; 
if (!font1.loadFromFile("OCRAEXT.ttf")) 
{ 
    //error... 
} 

RectangleShape start(Vector2f(400, 100)); 
start.setFillColor(Color(0, 0, 0)); 
start.setOutlineThickness(20); 
start.setOutlineColor(Color(255, 255, 255)); 

FloatRect startRect = start.getLocalBounds(); 
start.setOrigin(startRect.width/2, startRect.height/2); 
start.setPosition(Vector2f(1366/2.0f, 768 - 450.0f)); 

/* 
RectangleShape player(Vector2f(200, 50)); 
player.setFillColor(Color(0, 0, 255)); 
player.setPosition(400, 700); 
*/ 

Texture playertexture; 
if (!playertexture.loadFromFile("whiter_arrow.jpg")) 
{ 
    //error... 
} 

Sprite player; 
player.setTexture(playertexture); 
player.setPosition(300, 600); 

RectangleShape thing(Vector2f(enemywidth, enemyheight)); 
thing.setPosition(300, -200); 


Event evnt; 







while (gameDisplay.isOpen()) 
{ 

    while (gameDisplay.pollEvent(evnt)) 
    { 
     switch (evnt.type) 
     { 
     case Event::Closed: 
      gameDisplay.close(); 
     case Event::KeyPressed: 
      if (Keyboard::isKeyPressed(Keyboard::Q)) 
       gameDisplay.close(); 

     } 

    } 



    main_menu object; 
    object.startmenu(gameDisplay, font1, MainMenu, start, evnt); 


    while (MainMenu == false) 
    { 
     gameDisplay.setMouseCursorVisible(false); 

     if (Keyboard::isKeyPressed(Keyboard::D)) 
      if (player.getPosition().x < 1200) 
      { 
       player.move(0.3f, 0.0f); 
      } 

     if (Keyboard::isKeyPressed(Keyboard::A)) 
      if (player.getPosition().x > 50) 
      { 
       player.move(-0.3f, 0.0f); 
      } 
     if (Keyboard::isKeyPressed(Keyboard::Q)) 
      gameDisplay.close(); 


     Thing thingobject; 
     thingobject.thingspawn(gameDisplay, enemystartx, enemystarty, enemywidth, enemyheight, thing, enemyspeed); 

     //collision detection 
     if (player.getPosition().y <= thing.getPosition().y) 
      if (player.getPosition().x == thing.getPosition().x) 
       gameDisplay.close(); 


     gameDisplay.clear(); 
     gameDisplay.draw(player); 
     gameDisplay.draw(thing); 
     gameDisplay.display(); 

    } 



    } 
    } 

답변

0

오브젝트의 세트 사이 2D 충돌 감지 ("할 수있는 여러 가지 방법이 있습니다 이 물체들 중 하나라도 서로 만지십시오. ")이 질문의 범위를 벗어납니다. 당신이 묻는 것보다 훨씬 간단합니다 : "두 개의 2D 사각형을 만듭니 까?". 의 당신이 사각형의 R1과 R2를 가정 해 봅시다, 당신은 사용할 수 있습니다

collision = r1.x <= r2.x + r2.width && 
    r2.x <= r1.x + r1.width && 
    r1.y <= r2.y + r2.height && 
    r2.y <= r1.y + r1.height; 

을 또한 게임에서, 당신은 이동의 증가로 인해 프레임 속도 대 개체 속도의 너무 큰 존재의 가능성을 허용해야한다는 것을 주목할 필요가있다 오브젝트가 서로 움직이는 것처럼 보입니다. 스윕 스루 시간 볼륨의 교차를 포함하는보다 복잡한 계산으로 들어가기 전에 두 객체의 전/후 위치를 포함하는 경계 사각형을 작성하고 먼저 테스트하여 보완 할 수 있습니다.

+0

감사합니다. 경계 상자를 사용하지 않고 Collison 탐지를 만드는 방법을 찾지 만 감사합니다. 3 –

0

충돌을 수행하는 SFML 방법이 있지만, 그것은 당신의 경우에 적용됩니다.

당신은 이런 식으로 작업을 수행 할 수 있습니다

if (player.getGlobalBounds().intersects(thing.getGlobalBounds())) 
{ 
     // player and thing is collided! do something 
} 

Wheezil의 @ 답은 귀하의 경우처럼 축 정렬 된 객체에 대해, 그것을 할 수있는 표준 방법입니다. 어떻게 구현되는지 직접 알기 쉽게 구현하는 것이 좋습니다.