Patrocinadores

www.soporteoptico.com

www.zonavirtual.es

01. Disparos multiples

Tutoriales Avanzados Homebrewes

En este programa de ejemplo crearemos un personaje capaz de disparar multiples balas cuando pulsas el boton X. Iré explicando cada seccion de codigo.

Para empezar el primer fragmento de codigo simplemente creara dos objetos color para usarlos en nuestro programa:

--Creamos los colores.
verde=Color.new(0,255,0)
blanco = Color.new(255,255,255)

La siguiente seccion de codigo creara imagenes vaci­as y las rellenara de color verde y blanco. Una imagen sera nuestro personaje y la otra la bala. Los numeros entre paréntesis son el tamaño de la imagen en pixeles (anchura y altura).

--Creamos una imagen vaci­a y la rellenamos de color verde. Esta sera nuestra bala.
bala = Image.createEmpty(4,4)
bala:clear(verde)

--Creamos el personaje.
personaje = Image.createEmpty(32,32)
personaje:clear(blanco)

Ahora, crearemos tres variables: "olpad" para comprobar la ultima entrada de boton, "balaActual" guardara la bala actual para ser disparada y "direccion" nos dira qué direccion encara nuestro personaje.

--Variables.
oldpad = Controls.read()
balaActual = 0
direccion = "derecha"

Lo siguiente es crear dos arrays. El primero para el personaje, en el que guardaremos la posicion "x" e "y" del personaje en pantalla. El segundo array, "infoBala", parece algo mas confuso, por lo que primero miralo y después lo explicaré.

--Array del Personaje.
Personaje = {}
Personaje[1] = { x = 30, y = 100 }

--Array para las balas.
infoBala = {}
for a = 1,5 do
   infoBala[a] = { imagen = bala , disparando = false, direccion = "derecha", x = Personaje[1].x + 32, y = Personaje[1].y + 16 }
end

El array "infoBala" guarda información al igual que el array de personaje. Fíjate que usamos un bucle "for" dentro. Como las balas serán creadas de igual manera, podemos usar este método para definir 5 balas con menos código que haciendolo una cada vez. Este bucle creará los elementos "infoBala[1]", "infoBala[2]", "infoBala[3]", "infoBala[4]", "infoBala[5]". Dentro de cada elemento de "infoBala" tenemos cinco tipos. Primero almacenamos qué imagen usar para la bala y la almacenamos en "imagen". Después tenemos "disparando", que nos dirá si una bala está siendo disparada en ese momento. Lo siguiente es "direccion", que guarda la dirección de la bala. Fíjate que no podemos usar la dirección del personaje para este propósito, ya que cada vez que el personaje cambiase de dirección, las balas también cambiarían. Después tenemos "x". Esto creará la bala en la posición del personaje x + 32 pixeles para que la bala aparezca en el filo del personaje. Finalmente tenemos "y". Esto creará la bala en la posición y + 16 pixeles para que la bala aparezca en el centro del personaje.

En la próxima sección de código crearemos una función llamada "configBala()" que obtendrá toda la información que necesitamos saber. Esta función será llamada más tarde cada vez que se pulse el botón X. Esto preparará una bala para usar, la posición y la dirección de la bala. Mira el código y después lo detallaré.

--Funciones.

function configBala()
--Incrementamos la balaActual en 1 or la reiniciamos a 1.
if balaActual < 5 then
   balaActual = balaActual + 1
else
   balaActual = 1
end
if direccion == "izquierda" then
   infoBala[balaActual].x = Personaje[1].x
   infoBala[balaActual].y = Personaje[1].y + 16
end
if direccion == "derecha" then
   infoBala[balaActual].x = Personaje[1].x + 32
   infoBala[balaActual].y = Personaje[1].y + 16
end

if direccion == "arriba" then
   infoBala[balaActual].x = Personaje[1].x + 16
   infoBala[balaActual].y = Personaje[1].y
end
if direccion == "abajo" then
   infoBala[balaActual].x = Personaje[1].x + 16
   infoBala[balaActual].y = Personaje[1].y + 32
end
infoBala[balaActual].direccion = direccion
infoBala[balaActual].disparando = true
end

La primera parte de la función comienza con "if balaActual < 5 then". Esta sección dice que si la variable "balaActual" es menor que 5 entonces la incrementamos en 1. Si no es inferior a 5 entonces la igualamos a 1. Cada vez que disparemos una bala este código fijará una bala distinta para usar, asi la última bala disparada podrá estar en pantalla.

La siguiente parte tiene 4 comprobaciones de dirección. Estas fijarán la posición de las balas cuando sean disparadas de acuerdo con la posición del personaje. Sin esto, nuestras balas serían creadas en el filo derecho de nuestro personaje sin importar la dirección que está encarando. Fíjate que usamos la variable "balaActual" para decir al programa que elemento de "infoBala" debe ser usado.

La última parte fija la dirección de la bala actual a la dirección del personaje. La bala mantendrá esa dirección hasta que deje de existir. La dirección de la bala no cambiará si la posición del personaje cambia.

El último comando fija la variable "disparando" a "true". Esto significa que estamos disparando.

Ahora crearemos otra función que comprobará si una bala está siendo disparada y de ser así, la dibujara en pantalla.

function disparoBala()
for i = 1,5 do
   if infoBala[i].disparando == true then
      if infoBala[i].direccion == "derecha" then infoBala[i].x = infoBala[i].x + 10 end
      if infoBala[i].direccion == "izquierda" then infoBala[i].x = infoBala[i].x - 10 end
      if infoBala[i].direccion == "arriba" then infoBala[i].y = infoBala[i].y - 10 end
      if infoBala[i].direccion == "abajo" then infoBala[i].y = infoBala[i].y + 10 end
      screen:blit(infoBala[i].x,infoBala[i].y,infoBala[i].imagen)
   end
   if infoBala[i].x < 0 or infoBala[i].x > 480 or infoBala[i].y < 0 or infoBala[i].y > 272 then
      infoBala[i].disparando = false
   end
end
end

Aquí usamos otro bucle "for", el cual comprobará los elementos del 1 al 5 de "infoBala" para ver si la variable "disparando" está en "true". Si lo está, comprobará que dirección tienen. Cuando la dirección es encontrada, incrementará la posición de la bala en 10 pixeles en la dirección adecuada. Las direcciones izquierda y derecha sólo necesitan incrementar la variable "x" y arriba y abajo la varaible "y". Una vez que esta información es procesada, se muestra en la pantalla con el comando "blit".

Después tenemos código que comprobará si la bala está todavía en pantalla o no. Si la posición "x" de la bala es menor que 0 entonces está fuera de pantalla por la izquierda. Si la posición "x" es superior a 480, está fuera de pantalla por la derecha. Si la posición "y" es menor que 0, está fuera por arriba y si la posición "y" es mayor que 272, está fuera por debajo. Si se determina que la bala está fuera de pantalla, ponemos su variable "disparando" a "false".

No detallaré mucho la siguiente sección. Esta función hace que nuestro personaje se mueva y fija qué dirección encara.

function moverPersonaje()
pad = Controls.read()
if pad:left() then
   Personaje[1].x = Personaje[1].x - 1
   direccion = "izquierda"
end
if pad:right() then
   Personaje[1].x = Personaje[1].x + 1
   direccion = "derecha"
end
if pad:up() then
   Personaje[1].y = Personaje[1].y - 1
   direccion = "arriba"
end
if pad:down() then
   Personaje[1].y = Personaje[1].y + 1
   direccion = "abajo"
end

end

Es hora de entrar dentro del bucle principal. Lo primero es:

--Bucle principal.
while true do
pad = Controls.read()
screen:clear()
screen:blit(Personaje[1].x, Personaje[1].y, personaje)
if pad:cross() and oldpad:cross() ~= pad:cross() then
   configBala()
end

Esto inicia nuestro bucle. Primero nuestros controles son iniciados. Luego limpiamos la pantalla a cada pasada del bucle. Después el código que muestra nuestro personaje en pantalla, seguido de la sentencia "if", la cual dice que si el botón X es pulsado, se ejecute la función "configBala()". "oldpad" hace que el código sólo se ejecute si el botón ha sido soltado y vuelto a pulsar de nuevo desde la última vez que ha sido ejecutado.

En la siguiente sección de código mostraremos por pantalla información con la que verás qué está pasando cuando lanzamos el programa. Mostraremos los elementos "disparando" del 1 al 5 del array "infoBala" en pantalla, lo que nos dirá qué balas son disparadas. "tostring" convierte la información en texto, por lo que podemos mostrarlo. También mostraremos la dirección del personaje en pantalla.

--Mostramos la informacion de las balas en pantalla.
screen:print(10,10,"Bala 1: ".. tostring(infoBala[1].disparando),verde)
screen:print(10,20,"Bala 2: "..tostring(infoBala[2].disparando),verde)
screen:print(10,30,"Bala 3: "..tostring(infoBala[3].disparando),verde)
screen:print(10,40,"Bala 4: "..tostring(infoBala[4].disparando),verde)
screen:print(10,50,"Bala 5: "..tostring(infoBala[5].disparando),verde)
screen:print(10,60,"Direccion: "..direccion,verde)

Por último terminaremos nuestro código y finalizaremos el bucle principal.

moverPersonaje()
disparoBala()
screen.waitVblankStart()
screen.flip()
oldpad = pad
end

Llamamos a la función "moverPersonaje()" para comprobar el movimiento del personaje en cada pasada del bucle. Luego llamamos a "disparoBala()" cada pasada del bucle para mostrar las balas en pantalla si son disparadas. Más tarde mostraremos las imagenes con "screen.flip()". Después asignamos el valor de "pad" a "olpad" y terminamos con "end".

0

Comentarios

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 arkanist

una pregunta

quisiera saber como hacer para que aparte de controlar tu un "personaje", que la consola controle a otro personaje y te dipare.

o donde lo encontraria. se agradeceria mucho.

saludos!


Mi entrada de bitácora: Entrar en el staff: Un sueño hecho realidad.

Imagen de Guillermo_Cornielle

Uff

Bueno, eso es un tanto dificil, por lo menos para mi lo ha sido, peor ya voy mjorando.

Bueno, pues creo que puedes lograr eso:

  1. Usando timers (creo).
  2. usando expresiones matematicas ligadas a coordenadas y esas cosas, osea restando, sumando, multiplicando, dividiendo etc. (aunque creo que se usa para dar movimiento).
  3. Usando funciones matematicas, math.random... etc. (es complicado usarlas en un rpograma, por lo menos para mi).

Saludos, si quieres saber cuales son las funciones  matematicas, pasate por aqui. (en ingles).

Las expresiones matematicas, las tienes en un tuto de esta web, llamdo expresiones.

y los timers o temporizadores, por igual. 

Saludos. 


psp.scenebeta.com más que una web una comunidad unida.

Quiero una DS!!!!!!!!!!!

Imagen de arkanist

ya lo tengo

estube pensando la forma de que algun objeto te siguera y despues de corregir muchos errores que tenia (tipico de mi xd) lo he conseguido, una forma de que un objeto siga a otro hasta llegar a el a la velocidad que queramos:

function mov2()
if S[1].x > caja[1].x then
caja[1].x = caja[1].x +1
end

if S[1].x < caja[1].x then
caja[1].x = caja[1].x -1
end

if S[1].y < caja[1].y then
caja[1].y = caja[1].y -1
end

if S[1].y > caja[1].y then
caja[1].y = caja[1].y +1
end
end

 

esto es solo la funcion de movimiento de en mi caso, una caja xD

es la primera cosa que me creo yo (supongo k ya estava pero yo no lo encontre) que me resulta realmente util.


Mi entrada de bitácora: Entrar en el staff: Un sueño hecho realidad.

Imagen de arkanist

gracias

mirare lo que se puede hacer y haber si encuentro una solucion :)


Mi entrada de bitácora: Entrar en el staff: Un sueño hecho realidad.

Esta muy bien, pero yo tengo

Esta muy bien, pero yo tengo una duda. En infoBala[i].(cualkier info), para que es la i?

Salu2!

Imagen de ELeNDeR

La "i" es el índice del

La "i" es el índice del array. Como está dentro de un bucle for, la "i" cada vez tiene un valor distinto, primero vale 1, luego 2, después 3, más tarde 4 y por último 5, así "infoBala[i].disparando == true" , primero se comprobará: infoBala[1].disparando == true, despues infoBala[2].disparando == true y así hasta 5. Espero haberme explicado, un saludo.

¿Se uede usar la i para una

¿Se uede usar la i para una array normal y corriente? como por ejemplo tengo la tabla:
Jugador = {}
Jugador[1] = { x = 200 , y = 200 }
Jugador[2] = { x = 300 , y = 300 }
Jugador[3] = { x = 400 , y = 400 }
Jugador[4] = { x = 500 , y = 500 }

Podria hacer if jugador[i].x == 350 then...

Es solo un ejemplo, pero pregunto si se le peude dar ese mismo uso.

Salu2 y garcias ^^

Imagen de ELeNDeR

Para poder hacer "if

Para poder hacer "if jugador[i].x == 350 then..." primero le tienes que asignar un valor a la "i". Por ejemplo:

i=2
  if jugador[i].x == 350 then...

Eso es correcto, pero poco útil. Lo más común es utilizar la variable del bucle for como índice de los arrays, así puedes recorrer todos los elementos del array:

for i=1,5 do
     jugador[i].x = 387
  end

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.