Ir ao conteúdo

Posts recomendados

Postado

eu não consigo fazer um sistema de colisão que funciona da forma que eu queria, minha ideia era fazer que quando um objeto colidisse com outro o objeto parasse eu consegui fazer de uma forma mas quando o objeto colide ele para mas não consigo movelo de novo.

 

meu codigo:

#include <SFML/Graphics.hpp>
#include <iostream>
#include "cppgame/classes.hpp"


bool collide(cpg::Entity& sprite1, cpg::Entity& sprite2){
    if(sprite1.sprite.getPosition().x + 100 >= sprite2.sprite.getPosition().x &&
        sprite1.sprite.getPosition().x < sprite2.sprite.getPosition().x + sprite2.rect.width &&

        sprite1.sprite.getPosition().y + 100 >= sprite2.sprite.getPosition().y &&
        sprite1.sprite.getPosition().y < sprite2.sprite.getPosition().y + sprite2.rect.height){
        return true;
        }
}

int main(){
    sf::RenderWindow window(sf::VideoMode(800, 600), "inicio");

    sf::Texture tx0;
    tx0.loadFromFile("texture/tx0.jpg");

    cpg::Entity s1(100.f, 100.f, 100.f, 100.f, tx0);
    cpg::Entity s2(300.f, 100.f, 100.f, 100.f, tx0);

    float v = 0.5;

    while (window.isOpen()){
        sf::Event event;
        while (window.pollEvent(event)){
            if (event.type == sf::Event::Closed)
                window.close();
                }

        window.clear();
        s1.draw(window);
        s2.draw(window);

        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right)){
            s1.sprite.move(s1.v, 0);
            }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left)){
            s1.sprite.move(-s1.v, 0);
            }

        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up)){
            s1.sprite.move(0, -s1.v);
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down)){
            s1.sprite.move(0, s1.v);
            }

        if(collide(s1, s2)){
            s1.v = 0;
        }

        window.display();

        }

    return 0;
}

 

 

  • Curtir 1
Postado

Suponho que o membro v de s1 represente uma velocidade utilizada pelo método move() pra atualizar as posições x e y. Bom, ocorre que quando você resolve que houve uma colisão, zera a velocidade aqui:

 

2 horas atrás, dev9 disse:
s1.v = 0;


E ela não volta a receber um valor não nulo e, portanto, não é mais possível atualizar a posição. 

Ao invés de zerar a velocidade, você poderia tentar o seguinte: no inicio de cada passo, depois de receber o evento event, testar se haverá colisão pra cada uma das direções (cima, baixo, esquerda e direita) e apenas atualizar a posição naquela direção se não houver colisão. Então são quatro chamadas da função collide() primeiro pra determinar qual direção não há colisão e apenas depois dessa etapa uma chamada de move() pra cada direção sem obstaculo. Seria melhor redefinir collide() pra facilitar o trabalho.

A velocidade não deve ser alterada.

  • Curtir 1

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...