Anuncios Google

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 informacion al igual que el array de personaje. Fi­jate que usamos un bucle "for" dentro. Como las balas seran creadas de igual manera, podemos usar este método para definir 5 balas con menos codigo que haciendolo una cada vez. Este bucle creara 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 dira si una bala esta siendo disparada en ese momento. Lo siguiente es "direccion", que guarda la direccion de la bala. Fi­jate que no podemos usar la direccion del personaje para este proposito, ya que cada vez que el personaje cambiase de direccion, las balas también cambiarían. Después tenemos "x". Esto creara la bala en la posicion del personaje x + 32 pixeles para que la bala aparezca en el filo del personaje. Finalmente tenemos "y". Esto creara la bala en la posicion y + 16 pixeles para que la bala aparezca en el centro del personaje.

En la proxima seccion de codigo crearemos una funcion llamada "configBala()" que obtendra toda la informacion que necesitamos saber. Esta funcion sera llamada mas tarde cada vez que se pulse el boton X. Esto preparara una bala para usar, la posicion y la direccion de la bala. Mira el codigo 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 funcion comienza con "if balaActual < 5 then". Esta seccion 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 codigo fijara una bala distinta para usar, asi la ultima bala disparada podra estar en pantalla.

La siguiente parte tiene 4 comprobaciones de direccion. Estas fijaran la posicion de las balas cuando sean disparadas de acuerdo con la posicion del personaje. Sin esto, nuestras balas seri­an creadas en el filo derecho de nuestro personaje sin importar la direccion que esta encarando. Fi­jate que usamos la variable "balaActual" para decir al programa que elemento de "infoBala" debe ser usado.

La ultima parte fija la direccion de la bala actual a la direccion del personaje. La bala mantendra esa direccion hasta que deje de existir. La direccion de la bala no cambiara si la posicion del personaje cambia.

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

Ahora crearemos otra funcion que comprobara si una bala esta siendo disparada y de ser asi­, 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

Aqui­ usamos otro bucle "for", el cual comprobara los elementos del 1 al 5 de "infoBala" para ver si la variable "disparando" esta en "true". Si lo esta, comprobara que direccion tienen. Cuando la direccion es encontrada, incrementara la posicion de la bala en 10 pixeles en la direccion adecuada. Las direcciones izquierda y derecha solo necesitan incrementar la variable "x" y arriba y abajo la varaible "y". Una vez que esta informacion es procesada, se muestra en la pantalla con el comando "blit".

Después tenemos codigo que comprobara si la bala esta todavi­a en pantalla o no. Si la posicion "x" de la bala es menor que 0 entonces esta fuera de pantalla por la izquierda. Si la posicion "x" es superior a 480, esta fuera de pantalla por la derecha. Si la posicion "y" es menor que 0, esta fuera por arriba y si la posicion "y" es mayor que 272, esta fuera por debajo. Si se determina que la bala esta fuera de pantalla, ponemos su variable "disparando" a "false".

No detallaré mucho la siguiente seccion. Esta funcion hace que nuestro personaje se mueva y fija qué direccion 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 codigo que muestra nuestro personaje en pantalla, seguido de la sentencia "if", la cual dice que si el boton X es pulsado, se ejecute la funcion "configBala()". "oldpad" hace que el codigo solo se ejecute si el boton ha sido soltado y vuelto a pulsar de nuevo desde la ultima vez que ha sido ejecutado.

En la siguiente seccion de codigo mostraremos por pantalla informacion con la que veras qué esta pasando cuando lanzamos el programa. Mostraremos los elementos "disparando" del 1 al 5 del array "infoBala" en pantalla, lo que nos dira qué balas son disparadas. "tostring" convierte la informacion en texto, por lo que podemos mostrarlo. También mostraremos la direccion 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 ultimo terminaremos nuestro codigo y finalizaremos el bucle principal.

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

Llamamos a la funcion "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. Mas tarde mostraremos las imagenes con "screen.flip()". Después asignamos el valor de "pad" a "olpad" y terminamos con "end".

5
Tu voto: Ninguno Votos totales: 5 (9 votos)

Anuncios Google

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 DIEGO BOMER

ESO ES LO MEJOR

PRIMERO QUERIA PROGRAMAR CON UNITY PERO ME DI CUENTA DE QUE SOLO HACE JUEGOS PARA LA VITA Y LA PS4 Y LUEGO EL ENTIDAD 3D SOLO ERA PARA PC PERO LUA PARA PSP GRACIAS

 


iori yagami

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!

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. 


Manual del Perfecto Votante Para un voto libre y justo!.

TheGCProjects

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.

Imagen de Arkanist

gracias

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

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.