我正在创建pong,但是Collision遇到了麻烦。如何添加像素精确的Collision?我仅在使用主文件时就创建了冲突,但在使用头文件时却无法弄清。有人可以写出Collision的代码并添加到Collision.h和Collision.cpp中以便于存储和修改。

main.cpp

#include "stdafx.h"
#include <SFML\Graphics.hpp>
#include "Paddle.h"
#include "Ball.h"
#include <iostream>
int main()
{
    sf::RenderWindow window(sf::VideoMode::getDesktopMode(), "Pong",
    sf::Style::Close| sf::Style::Resize| sf::Style::Titlebar);
    Paddle paddle1;
    Paddle paddle2;
    Ball ball;
    while (window.isOpen()) {
        sf::Event evnt;
        while (window.pollEvent(evnt))
        {
            switch (evnt.type)
            {
            case sf::Event::Closed:
                window.close();
                break;
            }
        }
        paddle1.Update();
        paddle2.Update();
        ball.Update(ballDirectionX,ballDirectionY);
        window.clear();
        paddle1.Draw(window);
        paddle2.Draw(window);
        ball.Draw(window);
        window.display();
   }
   return 0;
}


Paddle.h

#pragma once
#include <SFML\Graphics.hpp>
class Paddle
{
public:
    Paddle();
    ~Paddle();
    void Draw(sf::RenderWindow& window);
    void Update();
    sf::RectangleShape paddle1;
    sf::RectangleShape paddle2;
private:
};


Paddle.cpp

#include "stdafx.h"
#include "Paddle.h"
Paddle::Paddle()
{
    paddle1.setSize(sf::Vector2f(20.0f, 120.0f));
    paddle1.setFillColor(sf::Color::Red);
    paddle2.setSize(sf::Vector2f(20.0f, 120.0f));
    paddle2.setFillColor(sf::Color::Green);
    paddle2.setPosition(sf::Vector2f(1900.0f, 0.0f));
}
Paddle::~Paddle()
{
}
void Paddle::Draw(sf::RenderWindow& window)
{
    window.draw(paddle1);
    window.draw(paddle2);
}
void Paddle::Update()
{
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::W)) {
        paddle1.move(sf::Vector2f(0, -3));
    }
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::S)) {
        paddle1.move(sf::Vector2f(0, 3));
    }
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) {
        paddle2.move(sf::Vector2f(0, -3));
    }
    if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) {
        paddle2.move(sf::Vector2f(0, 3));
    }
}




#pragma once
#include <SFML\Graphics.hpp>
class Ball
{
public:
     Ball();
     ~Ball();
     void Draw(sf::RenderWindow& window);
     void Update() {
     }
     sf::CircleShape ball;
private:

};


球cpp

#include "stdafx.h"
#include "Ball.h"
Ball::Ball()
{
    ball.setRadius(20);
    ball.setPosition(sf::Vector2f(400, 540));
}
Ball::~Ball()
{
}
void Ball::Draw(sf::RenderWindow & window)
{
window.draw(ball);
}
void Ball::Update()
{
}

最佳答案

由于Pong是一款非常简单的游戏,因此建议您创建一个以sf::CircleShapesf::RectangleShape作为参数的相交函数,因为这是分别表示球和球拍的方式。

我建议您执行以下实现,但是有better ones

bool intersects(const sf::CircleShape &c, const sf::RectangleShape &r){
    sf::FloatRect fr = r.getGlobalBounds();
    sf::Vector2f topLeft(fr.left, fr.top);
    sf::Vector2f topRight(fr.left + fr.width, fr.top);
    sf::Vector2f botLeft(fr.left, fr.top + fr.height);
    sf::Vector2f botRight(fr.left + fr.width, fr.top + fr.height);

    return contains(c, topLeft) ||
        contains(c, topRight) ||
        contains(c, botLeft) ||
        contains(c, botRight);
}


这很容易,只需检查矩形的每个角是否在圆内,如果不包含任何一个,则该圆和该矩形不相交。

如果圆中包含任意一个角,则它们相交。

contains()函数实际上非常简单:

bool contains(const sf::CircleShape &c, const sf::Vector2f &p){
    sf::Vector2f center = c.getPosition();
    float a = (p.x - center.x);
    float b = (p.y - center.y);
    a *= a;
    b *= b;
    float r = c.getRadius() * c.getRadius();

    return (( a + b ) < r);
}


基于this问题,但是为了更好的理解,我在每个步骤中都将其分开。



编辑

请注意,该方法仅在矩形处于垂直/水平方向(即无旋转)时才有效。

关于c++ - 如何在SFML中添加碰撞,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49164739/

10-12 16:04