Anuncios Google

[SDL] Ayuda para la creacion del arkanoid

Holaa, tengo una duda con la creacion de este juego.

Mi problema es que cuando la pelota rebota, no se como darle el angulo invertido... Por ejemplo, la pelota rebota contra la base que se mueve y que salga disparada para el otro lado... Lo mismo seria contra las paredes o los ladrillos.

Tengo algo asi:

void Bola::moverBola(int nave_x, int nave_y, int nave_ancho, int nave_alto, int pantalla_ancho, int pantalla_alto) {
 
	if ((y>=nave_y-circunferencia) && (y<=nave_y+nave_ancho) && (x>=nave_x-circunferencia) && (x<=nave_x+nave_ancho)) {
 
                // Se detecto la colision con la base, tendria que disparar para el lado contrario al que viene a bola
 
	}
 
        //Y aca tendria que ir las nuevas direcciones para el angulo X, Y
 
 
}
 

Espero que me puedan ayudar :D, 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.

Mirate este

Imagen de anxoganso

yo pondria estadospor

yo pondria estados

por ejemplos si viene de - x a + x 

pondria

int direccion = 1

y si viene al reves

int direccion = 2

y luego

 

 

if ((y>=nave_y-circunferencia) && (y<=nave_y+nave_ancho) && (x>=nave_x-circunferencia) && (x<=nave_x+nave_ancho)) {   if(direccion == 1)direccion == 2; if(direccion == 2)direccion == 1;  }
No me explico muy bien perdona si no entiendes algo avisaAsi es como lo hago en mi pingpongEdito:Por si no quedo muy claro te pongo un fragmento de mi pingpong
//EL movimeinto de la pelota
        if(yPel >440){direccion_vertical = 2;}
        if(yPel < 0){direccion_vertical = 1;}
        if(direccion_vertical == 1){yPel += velocidad;}
        if(direccion_vertical == 2){yPel -= velocidad;}
 
        if(xPel < 0)gol_local();
        if(xPel > 600)gol_visitante();
        if(direccion_horizontal == 1){xPel += velocidad;}
        if(direccion_horizontal == 2){xPel -= velocidad;}
 
        //Colisiones de la pala con el borde de la pantalla
        if(yProt <= 0)yProt = 0;
        if(yProt >= 380)yProt= 380;
 
        //Colisiones de la bola con las palas
        if(colision(xProt,yProt,wProt, hProt, xPel, yPel, wPel, hPel)== 1)
        {
            direccion_horizontal = 1;
            velocidad += aceleracion;
            Mix_PlayChannel ( 0, sonido, 1 );
        }
        if(colision(xMaq,yMaq,wMaq,hMaq,xPel,yPel,wPel,hPel)== 1)
        {
            direccion_horizontal = 2;
            velocidad += aceleracion;
            Mix_PlayChannel ( 0, sonido, 1 );
        }


 


Primero que muchas gracias

Primero que muchas gracias por tu respuesta!

- Osea lo que decis es crear una variable "direccion" donde guarde la ultima direccion de la bola no?  Y luego dependiendo de la ultima direccion invertir el eje...

Pero suponiendo que cuando venga la bola e invierta el eje, siempre va a tener el mismo angulo no? (pero invertido)... Mas especifico: choque donde choque no va a volver siempre al mismo lugar?

Imagen de anxoganso

Tienes k tener aceleracion

Tienes k tener aceleracion tienes k ponerle una variable para la aceleracion de x y la aceleracion de y(en mi caso uso una para los dos y siempre hace lo mismo)y hacer que el valor de la aceleracion cambie en funcion del lugar de la pala que rebote la pelota(no es lo mismo la esquina que le centro).


Si tenes razon, ahora con el

Si tenes razon, ahora con el tema de la aceleracion... Se puede controlar hasta que limite quiere que aumente? Porque al implementarlo en el sistema que estoy haciendo una ves que la bola choca con algo empieza a aumentar la aceleracion hasta que practicamente es imposible verla jaja, y lo peor que pasa en pocos segundos de haber arrancado el juego D:

Imagen de anxoganso

Pon el codigo  a ver porke

Pon el codigo  a ver porke pasa eso

Y yo pondria un

if(variable<limite)

{

//Aqui aumentas la aceleracion

}

#include "bola.hpp"#define

#include "bola.hpp"
#define circunferencia 10
 
Bola::Bola() {
 
	ultimo_choque = 0;
	primer_tiro = true;
	AceleracionX = 1;
	AceleracionY = 1;
	VelocidadX = -1;
	VelocidadY = 1;
 
	capa_bola = SDL_CreateRGBSurface(
		SDL_HWSURFACE, 
		circunferencia, 
		circunferencia, 
		32, 
		0xff000000, 
		0x00ff0000, 
		0x0000ff00, 
		0x000000ff
	);
	blanco = SDL_MapRGB(capa_bola->format, 255,255,255);
}
 
void Bola::crearBola(SDL_Surface* Pantalla, int nave_x, int nave_y, int nave_ancho, int nave_alto) {
 
	if (primer_tiro == true) {
		destino.x = (nave_x+(nave_ancho / 2));
		destino.y = nave_y-circunferencia;
	} else {
		destino.x+=VelocidadX;
		destino.y+=VelocidadY;
	}
 
	SDL_LockSurface(capa_bola);
	roundedBoxColor(
			capa_bola,
			NULL, NULL,											// Partir de x1=150 y dibujar hasta x2=250
			circunferencia,circunferencia,circunferencia,		// Partir de y1=370 y dibujar hasta y2=360
			blanco
		);
	SDL_UnlockSurface(capa_bola);
 
	SDL_BlitSurface(capa_bola, NULL, Pantalla, &destino);
 
}
 
void Bola::colisionBola(int nave_x, int nave_y, int nave_ancho, int nave_alto, int pantalla_ancho, int pantalla_alto) {
 
	//Base abajo
	if ((destino.y>=nave_y-circunferencia) && (destino.y<=nave_y+nave_alto) && (destino.x>=nave_x-circunferencia) && (destino.x<=nave_x+nave_ancho)) {
		ultimo_choque = 1;
		direccionBola();
	}
 
	// Arriba
	if (destino.y<=0) {
		ultimo_choque = 3;
		direccionBola();
	}
 
	// Derecha
	if (destino.x>=pantalla_ancho-circunferencia) {
		ultimo_choque = 2;
		direccionBola();
	}
 
	// Izquierda
	if (destino.x<=0) {
		ultimo_choque = 4;
		direccionBola();
	}
 
 
}
 
 
void Bola::direccionBola() {
 
	switch(ultimo_choque) {
	case 1:
		VelocidadY = -1;
		AceleracionY *= -1;
		VelocidadY += AceleracionY;
		break;
 
	case 2:
		VelocidadX = -1;
		AceleracionX *= -1;
		VelocidadX += AceleracionX;
		break;
 
	case 3:
		VelocidadY = 1;
		AceleracionY *= -1;
		VelocidadY += AceleracionY;
		break;
 
	case 4:
		VelocidadX = 1;
		AceleracionX *= -1;	
		VelocidadX += AceleracionX;
		break;
	}
 
 
}

Te pongo el codigo de mi clase, espero que se entienda esta dentro de todo ordenado.

- En la funcion Direccion es donde va la parte de la aceleracion, que esta funcionando pero al aumentarla me cambia la direccion de la bola... No se si esta bien. 

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.