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 vacias 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 vacia 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. Fijate 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. Fijate 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 serian creadas en el filo derecho de nuestro personaje sin importar la direccion que esta encarando. Fijate 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 todavia 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
--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".
Comentarios
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
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!
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:
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
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.
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!
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 ^^
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