Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - DeMoNcRaZy

#411
#ACTUALIZACIÓN



Acabo de probar otra forma que da resultado por una parte, pero por la otra no.
Si voy de izquierda a derecha colisiona y no puede avanzar "bien", si voy de derecha a izquierda colisiona y no puede avanzar "bien", eso si quitamos la colisión de "y". Y si añado la colisión de "y" se desplaza el rectángulo a los lados como se ve al principio del siguiente vídeo:

[youtube=640,360]https://www.youtube.com/watch?v=KOVwKT6rf54[/youtube]

Código al que hago referencia en el vídeo:

Código (cpp) [Seleccionar]
sf::FloatRect rect = rec.getGlobalBounds();
        sf::FloatRect rect2 = rec2.getGlobalBounds();

        if(rect.intersects(rect2)){

            if(rec.getPosition().x<=rect2.left){
                rec.setPosition(rec.getPosition().x-1, rec.getPosition().y);
            }
            if(rec.getPosition().x>=rect2.left){
                rec.setPosition(rec.getPosition().x+1, rec.getPosition().y);
            }
            if(rec.getPosition().y<=rect2.left){
                rec.setPosition(rec.getPosition().x, rec.getPosition().y-1);
            }
            if(rec.getPosition().y>=rect2.left){
                rec.setPosition(rec.getPosition().x, rec.getPosition().y+1);
            }

        }


Por una parte parece que funciona:

Código (cpp) [Seleccionar]
if(rec.getPosition().x<=rect2.left){
                rec.setPosition(rec.getPosition().x-1, rec.getPosition().y);
            }
            if(rec.getPosition().x>=rect2.left){
                rec.setPosition(rec.getPosition().x+1, rec.getPosition().y);
            }


Ya que colisionan y no pueden avanzar bien, eso si están solo estas funciones.

Si añado las demás funciones que hace referencia a "y" ya al colisionar se desplaza solo.

Código (cpp) [Seleccionar]
f(rec.getPosition().x<=rect2.left){
                rec.setPosition(rec.getPosition().x-1, rec.getPosition().y);
            }
            if(rec.getPosition().x>=rect2.left){
                rec.setPosition(rec.getPosition().x+1, rec.getPosition().y);
            }
            if(rec.getPosition().y<=rect2.left){
                rec.setPosition(rec.getPosition().x, rec.getPosition().y-1);
            }
            if(rec.getPosition().y>=rect2.left){
                rec.setPosition(rec.getPosition().x, rec.getPosition().y+1);
            }



Saludos!
#412
Probé como me dijiste y por una parte responde bien entre sí...

De nuevo un corto vídeo del funcionamiento.
Solo funciona si voy de izquierda a derecha. <-->

[youtube=640,360]https://www.youtube.com/watch?v=DHS5weUasYU[/youtube]

Código (cpp) [Seleccionar]
#include <SFML/Graphics.hpp>
#include <iostream>

int main(){
    //Creamos la ventana
    sf::RenderWindow window(sf::VideoMode(800, 600), "Colision");

    //Rectangualo
    sf::RectangleShape rec(sf::Vector2f(50, 50));
    rec.setFillColor(sf::Color::Cyan);

    //Otro rectangulo
    sf::RectangleShape rec2(sf::Vector2f(50, 50));
    rec2.setFillColor(sf::Color::Magenta);
    rec2.setPosition(400, 300);

    window.setFramerateLimit(200);

    //Si la ventana está abierta
    while(window.isOpen()){
        //Creamos un evento
        sf::Event ventana;
        //Llamamos a los eventos
        while(window.pollEvent(ventana)){
            //Cerramos la ventana cuando se solicite
            if(ventana.type == sf::Event::Closed){
                window.close();
            }
        }

        //Movimiento rectangulo
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up)){
            rec.move(0, -1);
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down)){
            rec.move(0, 1);
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left)){
            rec.move(-1, 0);
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right)){
            rec.move(1, 0);
        }

        //Colisiones
        if(rec.getPosition().x<0){
            rec.setPosition(0, rec.getPosition().y);
        }
        if(rec.getPosition().x>750){
            rec.setPosition(750, rec.getPosition().y);
        }
        if(rec.getPosition().y<0){
            rec.setPosition(rec.getPosition().x, 0);
        }
        if(rec.getPosition().y>550){
            rec.setPosition(rec.getPosition().x, 550);
        }

        sf::FloatRect rect = rec.getGlobalBounds();
        sf::FloatRect rect2 = rec2.getGlobalBounds();

        if(rect.intersects(rect2)){

            if(rec.getPosition().x==rect2.left){
                rec.setPosition(rec.getPosition().x-50, rec.getPosition().y);
            }
            if(rec.getPosition().x==rect2.left){
                rec.setPosition(rec.getPosition().x+50, rec.getPosition().y);
            }
            if(rec.getPosition().y==rect2.left){
                rec.setPosition(rec.getPosition().x, rec.getPosition().y-50);
            }
            if(rec.getPosition().y==rect2.left){
                rec.setPosition(rec.getPosition().x, rec.getPosition().y+50);
            }

        }

        //Limpiamos ventana
        window.clear();

        //Dibujamos el rectangulo
        window.draw(rec);
        window.draw(rec2);

        //Actualizamos ventana
        window.display();

    }
}


Parte que modifiqué:

Código (cpp) [Seleccionar]
if(rect.intersects(rect2)){

            if(rec.getPosition().x==rect2.left){
                rec.setPosition(rec.getPosition().x-50, rec.getPosition().y);
            }
            if(rec.getPosition().x==rect2.left){
                rec.setPosition(rec.getPosition().x+50, rec.getPosition().y);
            }
            if(rec.getPosition().y==rect2.left){
                rec.setPosition(rec.getPosition().x, rec.getPosition().y-50);
            }
            if(rec.getPosition().y==rect2.left){
                rec.setPosition(rec.getPosition().x, rec.getPosition().y+50);
            }

        }


Gracias.

Saludos!
#413
He probado tu forma pero no funcionaba y al igual con tu idea intente hacer algo similar haber si funcionaba al principio parecía que iba a funcionar pero al final no.

Probé con algo así:

Código (cpp) [Seleccionar]
sf::FloatRect rect = rec.getGlobalBounds();
        sf::FloatRect rect2 = rec2.getGlobalBounds();

        if(rect.intersects(rect2)){

            if(rec.getPosition().x<rect2.left){
                rec.setPosition(rec2.getPosition().x-50, rec2.getPosition().y);
            }
            if(rec.getPosition().x>rect2.left){
                rec.setPosition(rec2.getPosition().x+50, rec2.getPosition().y);
            }
            if(rec.getPosition().y<rect2.left){
                rec.setPosition(rec2.getPosition().x, rec2.getPosition().y-50);
            }
            if(rec.getPosition().y>rect2.left){
                rec.setPosition(rec2.getPosition().x, rec2.getPosition().y+50);
            }

        }


Puse rect2.left ya que tenia que declararla y no valía rec2.left
Disculpa que te esté dando trabajo, te agradezco la mano que intentas echarme.


He estado buscando información y tal y encontré alguna otra forma también posible de hacerlo:

Código (cpp) [Seleccionar]
#include <SFML/Graphics.hpp>
#include <iostream>

void comprobarIntersecta();

int main(){
    //Creamos la ventana
    sf::RenderWindow window(sf::VideoMode(800, 600), "Colision");

    //Rectangualo
    sf::RectangleShape rec(sf::Vector2f(50, 50));
    rec.setFillColor(sf::Color::Cyan);

    //Otro rectangulo
    sf::RectangleShape rec2(sf::Vector2f(50, 50));
    rec2.setFillColor(sf::Color::Magenta);
    rec2.setPosition(400, 300);

    window.setFramerateLimit(200);

    //Si la ventana está abierta
    while(window.isOpen()){
        //Creamos un evento
        sf::Event ventana;
        //Llamamos a los eventos
        while(window.pollEvent(ventana)){
            //Cerramos la ventana cuando se solicite
            if(ventana.type == sf::Event::Closed){
                window.close();
            }
        }

        //Colisiones ventana bordes
        if(rec.getPosition().x<0){
            rec.setPosition(0, rec.getPosition().y);
        }
        if(rec.getPosition().x>750){
            rec.setPosition(750, rec.getPosition().y);
        }
        if(rec.getPosition().y<0){
            rec.setPosition(rec.getPosition().x, 0);
        }
        if(rec.getPosition().y>550){
            rec.setPosition(rec.getPosition().x, 550);
        }

        sf::FloatRect rect = rec.getGlobalBounds();
        sf::FloatRect rect2 = rec2.getGlobalBounds();

        bool chocar [4] = {false,false,false,false}; //Norte, sur, este y oeste

        if(rect.intersects(rect2)){
                comprobarIntersecta();
        }

        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up)){
            if(!chocar[0])
                rec.move(0, -1);
        }
        else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down)){
            if(!chocar[1])
                rec.move(0, 1);
        }
        else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left)){
            if(!chocar[2])
                rec.move(-1, 0);
        }
        else if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right)){
            if(!chocar[3])
                rec.move(1, 0);
        }

        //Limpiamos ventana
        window.clear();

        //Dibujamos el rectangulo
        window.draw(rec);
        window.draw(rec2);

        //Actualizamos ventana
        window.display();

    }
}

void comprobarIntersecta(){
    sf::RectangleShape rec(sf::Vector2f(50, 50));
    rec.setFillColor(sf::Color::Cyan);
    if(rec.getPosition().x<400){
        chocar[0] = true;
    }
}


Pero de igual modo supuestamente hay que modificar el bool por true cuando colisione o tal así.

Gracias.

Saludos!
#414
Así está repartido:

Código (cpp) [Seleccionar]
sf::RenderWindow window(sf::VideoMode(800, 600), "Colision");

    //Rectangualo
    sf::RectangleShape rec(sf::Vector2f(50, 50));
    rec.setFillColor(sf::Color::Cyan);

    //Otro rectangulo
    sf::RectangleShape rec2(sf::Vector2f(50, 50));
    rec2.setFillColor(sf::Color::Magenta);
    rec2.setPosition(400, 300);


En el centro de la ventana (800x600).


Código completo:

Código (cpp) [Seleccionar]
#include <SFML/Graphics.hpp>
#include <iostream>

int main(){
    //Creamos la ventana
    sf::RenderWindow window(sf::VideoMode(800, 600), "Colision");

    //Rectangualo
    sf::RectangleShape rec(sf::Vector2f(50, 50));
    rec.setFillColor(sf::Color::Cyan);

    //Otro rectangulo
    sf::RectangleShape rec2(sf::Vector2f(50, 50));
    rec2.setFillColor(sf::Color::Magenta);
    rec2.setPosition(400, 300);

    window.setFramerateLimit(200);

    //Si la ventana está abierta
    while(window.isOpen()){
        //Creamos un evento
        sf::Event ventana;
        //Llamamos a los eventos
        while(window.pollEvent(ventana)){
            //Cerramos la ventana cuando se solicite
            if(ventana.type == sf::Event::Closed){
                window.close();
            }
        }

        //Movimiento rectangulo
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Up)){
            rec.move(0, -1);
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Down)){
            rec.move(0, 1);
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Left)){
            rec.move(-1, 0);
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Right)){
            rec.move(1, 0);
        }

        //Colisiones
        if(rec.getPosition().x<0){
            rec.setPosition(0, rec.getPosition().y);
        }
        if(rec.getPosition().x>750){
            rec.setPosition(750, rec.getPosition().y);
        }
        if(rec.getPosition().y<0){
            rec.setPosition(rec.getPosition().x, 0);
        }
        if(rec.getPosition().y>550){
            rec.setPosition(rec.getPosition().x, 550);
        }

        sf::FloatRect rect = rec.getGlobalBounds();
        sf::FloatRect rect2 = rec2.getGlobalBounds();

        if(rect.intersects(rect2)){

            if(rec.getPosition().x<400){
                std::cout << rec.getPosition().x << std::endl;
                rec.setPosition(350, rec.getPosition().y);
            }
            if(rec.getPosition().x>400){
                rec.setPosition(450, rec.getPosition().y);
            }
            if(rec.getPosition().y<400){
                rec.setPosition(rec.getPosition().x, 350);
            }
            if(rec.getPosition().y>400){
                rec.setPosition(rec.getPosition().x, 450);
            }

        }

        //Limpiamos ventana
        window.clear();

        //Dibujamos el rectangulo
        window.draw(rec);
        window.draw(rec2);

        //Actualizamos ventana
        window.display();

    }
}


Saludos!
#415
Intenté hacer lo que me indicaste pero no daba resultado al igual también intenté esto:

Código (cpp) [Seleccionar]
if(rec.getPosition().x<400){
                std::cout << rec.getPosition().x << std::endl;
                rec.setPosition(rec.getPosition().x, rec.getPosition().y);
            }


Que no pueda avanzar más si colisiona sin ser posicionado, pero al igual sigue con el mismo error.

Gracias por la respuesta.

Saludos!
#416
Buenas,

Tengo un problema al intentar colisionar dos figuras en sfml, la cosa es que colisiona pero en vez de chocar y estarse quieto sin poder avanzar se coloca en la otra parte de la otra figura y así consecutivamente.

Aquí un vídeo previo del error:
El vídeo es capturado por mi, dura 30 seg. Para mostrar el error.
[youtube=640,360]https://www.youtube.com/watch?v=i8TFZbfo7EE[/youtube]


Código (cpp) [Seleccionar]
sf::FloatRect rect = rec.getGlobalBounds();
        sf::FloatRect rect2 = rec2.getGlobalBounds();

        if(rect.intersects(rect2)){

            if(rec.getPosition().x<400){
                std::cout << rec.getPosition().x << std::endl;
                rec.setPosition(350, rec.getPosition().y);
            }
            if(rec.getPosition().x>400){
                rec.setPosition(450, rec.getPosition().y);
            }
            if(rec.getPosition().y<400){
                rec.setPosition(rec.getPosition().x, 350);
            }
            if(rec.getPosition().y>400){
                rec.setPosition(rec.getPosition().x, 450);
            }

        }


rec -> es el rectángulo que manejo con el keyboard.
rec2 -> es el rectángulo que está situado fijamente en el centro de la ventana.


Si supiesen a que debe deberse dicho error agradecería alguna respuesta.
Gracias.


Saludos!
#417
He probado de esta forma:

Código (cpp) [Seleccionar]
sf::FloatRect rect = rec.getGlobalBounds();
        sf::FloatRect rect2 = rec2.getGlobalBounds();

        if(rect.intersects(rect2)){
            std::cout << "Toca" << std::endl;
        }


Y funciona correctamente.

Pero me gustaría saber como funcionaría como me has dicho, si es otra forma más fácil.

Código (cpp) [Seleccionar]
bool intersecs(Rect a, Rect b);


Saludos.
#418
Es lo mismo que whatsapp web, solo que en escritorio. Es preferible la de web por que no ocupa espacio en disco y es oficial.
#419
He probado lo que me has dicho y funciona bien

Código (cpp) [Seleccionar]
if(rec.getPosition().x<0){
           rec.setPosition(0, rec.getPosition().y);
}


Nunca había usado getPosition, pero más o menos me hago la idea estoy buscando información sobre ello de igual modo si me puedes comentar así por encima como funciona lo agradecería.

Una pregunta:

Código (cpp) [Seleccionar]
if(rec.intersects(rec2)){
           std::cout << "Toca" << std::endl;
       }


Por que al usar dicha función me salta este error:

error: 'class sf::RectangleShape' has no member named 'intersects'|

Cuando supuestamente está bien definida.
Gracias.

Saludos.
#420
Hice algo así:

Código (cpp) [Seleccionar]
if(pared_x <= pared_izq){
                std::cout << pared_x;
                std::cout << pared_izq;
            x_incremento =- x_incremento;
}


Me da el resultado de -10:



Saludos.