Anuncios Google

Problema con colisiones [Sin razón aparente]

Pues cómo no otro problema, ya deben estar hartos de mi (En especial GorristeR) pero que más se le puede hacer, en está ocasión traigo un problema que no tengo ni idea de cómo ha ocurrido pues hace 5 minutos funcionaba y cuando pase los archivos a la memoria USB y compilar dentro de ella ya no va bien me he quedado O_O y ni idea de que ha cambiado pues yo lo veo todo igual a la última vez.

int Pelota::collision() {
	right = false;
 
	if ((getX() == 10){
		right = true;
	}
 
	if ((getX() == 620) {
		right = false;
	}
 
	return 0;
}

int Pelota::move() {
 
	if (right == false) {
		subx(1);
	}
 
	if (right == true) {
		addx(1);
	}
 
	return 0;
}

Class:Pelota {
private:
                y
public:
                void addy(int posy) {y+=posy;}
		void suby(int posy) {y-=posy;}
}

Pues creo que un código dice mas que mil palabras, ahora la explicación del error, al llegar la "pelota" 10 en el eje de X  se traba y rebota entre 10 y 8, no se devuelve para rebotar en 630, el problema es que hace 5 minutos funcionaba y no he movido nada. No encuentro comas, puntos, punto y coma, etc... que estén fuera de su lugar que puedan estar causando este comportamiento, aunque estoy casi seguro que este será el problema, simplemente no veo nada.

Lo que debería hacer el código es crear la ilusión de que la pelota está rebotando cambiando de dirección cada que alcanza "X" punto.

Espero que se entienda.

Saludos.


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de pspgorrister

Alguna cosas

Hola xXZeroXx :D

El problema seguramente está en la primera linea de Pelota::collision(), asignas la variable right a false y sólo vale true cuando X vale 10, deberías quitar esa linea y inicializarla en el método constructor (o un método tipo resetPos() por ejemplo). Es más, para que la pelota no siempre vaya a la izda o la derecha, te haces un random, así no siempre saldrá por el mismo lado.

El método move, puedes obtimizarlo un poco de esta forma

int Pelota::move() {
 
    if (right) 
        addx(1);
    else
       subx(1);
 }

Y siguiendo optimizando, otra cosa que puedes hacer es usar un sólo método para desplazar la pelota, y pasarle un valor positivo (derecha) o negativo (izquierda). Idem para arriba y abajo.

Class:Pelota {
private:
                y;
                x;
public:
                void moveX(int posx) {x+=posx;}
		void moveY(int posy) {y-=posy;}
}

Así tan sólo pasas un valor +1 ó -1. De todas formas en este caso no tiene mucha importancia porque ambos métodos son una simple instrucción inline, pero piensa que addy y suby tuvieran varias lineas de código, tendrías código duplicado, que en realidad hace lo mismo, sólo que uno maneja un valor negativo y otro positivo.

Espero haberte sido de ayuda. Un saludo

 

 


LuaDiE: Crea en Lua sin teclear código. Compatible HM7, HMv2, LuaPlayer, LuaDEV y PGE.

Imagen de burnxez

Cómo siempre, gracias

¿Que otra cosa me queda decir? Pues sólo, ¡Gracias GorristeR! Ahora funciona de 10! y lo de poner valores positivos y negativos lo pensé mientras dormía (A que soy raro ¿eh?)

Bueno, si tengo algun otro problema seguro posteo y espero igual tu :P

Saludos.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.