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 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".
Comentarios
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.
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.
psp.scenebeta.com más que una web una comunidad unida.
Quiero una DS!!!!!!!!!!!
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.
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!
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