Sei sulla pagina 1di 8

Física y matemáticas

Trabajar con medidas reales


vectores
Ejemplo: Mario bros
1. Coloca el mapa en la pantalla

maxY

mapa_h

mapa=BitmapFactory.decodeResource(getResources(),R.drawable.mapamario);
mapa_h=mapa.getHeight();
mapa_w=mapa.getWidth();
dest_mapa_y=(maxY-mapa_h)/2;
Full screen + orientación landscape
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
hideSystemUI(); //snippet de fpribera

canvas.drawBitmap(mapa,new Rect(0,0,maxX,mapa_h),new Rect(0,dest_mapa_y,maxX,dest_mapa_y+mapa_h),null);

Toma las dimensiones del canvas


Canvas c=holder.lockCanvas();
maxX = c.getWidth();
maxY = c.getHeight();
holder.unlockCanvasAndPost(c);
2. Carga el Sprite de Mario y calcula coordenadas
mario_w
Mario_h

“Calcula las coordenadas del primer Mario y posiciónalo en el mapa”

0,0

90%
mario_w/21,mario_h*2/3

canvas.drawBitmap(mario,new Rect(0,0, mario_w/21,mario_h*2/3),new Rect(100,dest_mapa_y+mapa_h*9/10-mario_h*2/3,100+mario_w/21,(dest_mapa_y+mapa_h*9/10))


3. Animación: Pintar secuencia:
estado+puntero 0,0

int puntero_mario_sprite=mario_w/21*estado_mario;
mario_w/21,mario_h*2/3

estado_mario… 0 1 2 3
canvas.drawBitmap(mario,new Rect(puntero_mario_sprite,0,puntero_mario_sprite+mario_w/21,mario_h*2/3),
new Rect(100,dest_mapa_y+mapa_h*9/10-mario_h*2/3,100+mario_w/21,(dest_mapa_y+mapa_h*9/10))
,null);
Vector posición y vector velocidad
• Definiciones:
• deltaT ∆t -> iteración del game loop. Fracción de segundo
deltaT=1f/BucleJuego.MAX_FPS;
• Vector posición M: Indica [en float] las coordenadas x e y destino de Mario:
• En cada iteración M’ = M + ∆t V
• Vector velocidad V: Proporciona una dirección V=e/ t
• Vx > 0, Vy = 0
• Vx < 0, Vy = 0
• Vx = 0, Vy > 0
• Vx = 0, Vy < 0
Movimiento lineal de Mario con M y V
mInicialMario[Y]=dest_mapa_y+mapa_h*9/10;
mInicialMario[X]=maxX*0.1f;
private float [] posicionMario=new float[2];
posicionMario[X]=mInicialMario[X];
private float [] velocidadMario=new float[2];
posicionMario[Y]=mInicialMario[Y];
private final int X=0;
private final int Y=1;
deltaT=1f/BucleJuego.MAX_FPS;
private float deltaT;
private float tiempoCrucePantalla=5; //en segundos velocidadMario[X]=maxX/tiempoCrucePantalla; //espacio / tiempo

public void actualizar(){


contadorFrames++;
if(contadorFrames%3==0){
estado_mario++; ANIMACIÓN
if(estado_mario==4) estado_mario=1;
}

posicionMario[X]=posicionMario[X]+deltaT*velocidadMario[X];
posicionMario[Y]=posicionMario[Y]+deltaT*velocidadMario[Y];
CAMBIO DE COORDENADA
}

Renderizar:
canvas.drawBitmap(mario,
new Rect(puntero_mario_sprite,0,puntero_mario_sprite+mario_w/21,mario_h*2/3),
new Rect((int)posicionMario[X],(int) posicionMario[Y]-mario_h*2/3,(int)posicionMario[X]+mario_w/21,(int)posicionMario[Y]),
null);
Movimiento parabólico
• V’ = V + ∆t G
• Vector gravedad
V
private float [] gravedad=new float [2];
V V
• V y G Iniciales
velocidadMario[X]=maxX/tiempoCrucePantalla; //espacio / tiempo
velocidadMario[Y]=-velocidadMario[X]*2; //componente Y dos veces componente X V V
gravedad[X]=0;
gravedad[Y]=-velocidadMario[Y]*2; //DOS VECES VELOCIDAD Y
G
• RENDERIZAR: V depende de G V V
velocidadMario[X]=velocidadMario[X]+deltaT*gravedad[X];
velocidadMario[Y]=velocidadMario[Y]+deltaT*gravedad[Y];

//rebote vertical
if(posicionMario[Y]>=mInicialMario[Y])
velocidadMario[Y]=-(maxX/tiempoCrucePantalla)*2; //velocidad inicial Y

//rebote horizontal
if(posicionMario[X]>maxX || posicionMario[X]<0 )
velocidadMario[X]=velocidadMario[X]*-1;

Potrebbero piacerti anche