Una nueva utilidad de programación se nos une a nuestra larga lista. Esta vez se trata de WeaponLib, una librería creada por xerpi, coder de nuestra comunidad, cuya función es realizar múltiples disparos hacia multiples direcciones con la imagen que queráis. Sin duda, esta fantástica librería será muy util para muchos coders que andan liados con este tema.
Autor: xerpi (Coder de la Comunidad).
Lo primero de todo tenemos que hacer un dofile a la libreria.
dofile("weaponlib.lua")
Luego cargamos la imagen de la bala ( DEBE DE ESTAR EN HORIZONTAL):
bala = image.load("bala.png")
Luego de eso creamos el "arma":
arma = (imagen_de_la_bala,tiempo)
El primer parámetro es la imagen de la bala previamente cargada/creada, y el segundo el tiempo en milisegundos entre disparo y disparo .
Ahora inicializamos el "arma":
weapon.action(tabla,accion)
En acción va "start" o "stop".
El siguiente paso será disparar:
weapon.shoot(arma,x,y,velocidad,ángulo)
Por último será blitear las balas:
weapon.blit(arma)
Si quieremos comprobar una colisión tan solo debemos hacer esto:
weapon.collision(tabla,x,y,w,h,boolean)
"x","y","w" y "h" són las coordenadas y el ancho y alto del "sitio" donde queremos colisionar. En boolean va true si quieres que al colisionar la bala desaparezca o false o un espacio vacio si no.
Este es un script de ejemplo creado por xerpi para orientaros mejor en la utilización de WeaponLib:
--Dofile a la libreria dofile("weaponlib.lua") --Cargamos la imagen de la bala (podemos hacer un image.create) NOTA: LA IMAGEN DEBE DE ESTAR EN HORIZONTAL bala = image.load("bala.png") --image.create(20,5,color.new(255,0,0)) --Esa función devuelve un color sin alpha aleatorio function random_color() return color.new(math.random(0,255),math.random(0,255),math.random(0,255)) end --Array de los enemigos object = {} --Creamos 10 enemigos for i = 1, 10 do table.insert(object,{x=math.random(20,460), y=math.random(20,252),w=math.random(15,90),h=math.random(15,90),color=random_color()}) end --Variables del "personaje" x=240 y=136 ang =0 ---CREAMOS UNA NUEVA "ARMA" disparo = weapon.create(bala,100) --LA INICIAMOS JUSTO ANTES DEL BUCLE weapon.action(disparo,"start") while true do --Limpiamos buffer de color blanco screen.clear(color.new(255,255,255)) --Leemos controles controls.read() --Movemos el personaje con el joystick if math.abs(controls.analogx())>50 then x=x+controls.analogx()/50 end if math.abs(controls.analogy())>50 then y=y+controls.analogy()/50 end --Dibuja un cuadrado verde donde está nuestro "personaje" y el cañón draw.fillrect(x-5,y-5,10,10,color.new(0,255,0)) draw.line(x,y,x+math.cos(math.rad(ang))*40,y+math.sin(math.rad(ang))*40,color.new(0,0,255)) --DISPARA CON LA ARMA PREVIAMENTE CREADA if controls.cross() then weapon.shoot(disparo,x,y,7,ang) end --Rotamos el "cañón" del personaje if controls.r() then ang = ang+2 end if controls.l() then ang = ang-2 end --Dibuja los enemigos y cambia su color si hay colision con las balas for i =1, 10 do --Dibuja enemigos draw.fillrect(object[i].x,object[i].y,object[i].w,object[i].h,object[i].color) --COMPRUEBA LA COLISIÓN if weapon.collision(disparo,object[i].x,object[i].y,object[i].w,object[i].h,true) then object[i].color = random_color() end end --BLITEAMOS LAS BALAS weapon.blit(disparo) --------------------------------------------------------------------- screen.print(5,5,"JoyStick: Move - R/L: Change angle - X: Shoot",color.new(255,0,0)) screen.print(5,25,"WeaponLib sample by xerpi",color.new(0,255,0)) screen.print(5,45,"Bullets in the screen: "..#disparo.bullets,color.new(255,0,255)) screen.print(430,5,"@"..screen.fps(),color.new(0,0,255)) if controls.select() then make_an_error() end screen.flip() end
Mejoras:
Descargar WeaponLib v4.0 (Sólo Usuarios Registrados y Programadores).
Mejoras:
Descargar WeaponLib v3.0 (Sólo Usuarios Registrados y Programadores).
Descargar WeaponLib v1.0 (Sólo Usuarios Registrados y Programadores).
Comentarios
¿Sirve en LD4W?
¿Sirve en LD4W?
¿ O hay una adaptacion para Nintendo?
Si, sirve prfectamente. Si la
Si, sirve prfectamente. Si la vas a usar usa la que hay un comentario más abajo ya que es una versión más nueva.
No me funciona en LD4W me da
No me funciona en LD4W
me da error en linea 22
Ya se el problema, en LD4W no
Ya se el problema, en LD4W no hay timers xD
Si tuviera el source de LD4W le podría poner pero como no lo tengo :(
A bueno espera que se pueden hacer en Lua, ahora lo hago.
EDITO: ya lo teng hecho:
Ejemplo de como se usa (solo debes hacer dofile("timer.lua") en el weaponlib y ya funcionará):
Grax amigo, ahora lo pruebo
Grax amigo, ahora lo pruebo
Espera, lo unico que debo
Espera, lo unico que debo hacer es copiar tu code, ponerlo en un timer.lua y hacer un dofile y funcionara???
Porque yo hice esto mira:
------------------------- WeaponLib v4.0 - (c) 2011 xerpi -------------------------
dofile("timer.lua")
weapon = {};
function weapon:new(image,time)
local obj = {img = image, time = time,bullets={}, nbullets=0,time_act = timer.new(), running = false,current=1,dec=0};
function obj:blit()
for k,v in ipairs(self.bullets) do
self.img:rotate(v.ang);
self.img:blit(v.x,v.y);
end
end
function obj:start()
self.running = true;
self.time_act:start();
end
function obj:stop()
self.running = false;
self.time_act:stop();
self.time_act:reset();
end
function obj:shoot(x,y,vel,ang)
if self.running then
if self.time_act:time() > self.time then
table.insert(self.bullets,{vel=vel,x=x,y=y,ang=ang,inc_x = math.cos(math.rad(ang)),inc_y = math.sin(math.rad(ang))});
self.time_act:reset();
end
else
self:start();
end
end
function obj:move()
for k,v in ipairs(self.bullets) do
v.x = v.x + v.inc_x * v.vel;
v.y = v.y + v.inc_y * v.vel;
if v.x > 480 or v.x < 0 or v.y > 272 or v.y < 0 then table.remove(self.bullets,k); end
end
end
function obj:collision(x,y,w,h,deadcollision)
for k,v in ipairs(self.bullets) do
if v.x >= x and v.x <= x+w and
v.y >= y and v.y <= y+h then
if deadcollision then
table.remove(obj.bullets,k);
end
return true;
end
end
end
return obj;
end
Como ves lo unico que hice fue agregar el dofile al principio del codigo, esta bien hecho??
Si, perfecto.
Si, perfecto.
Error : 2 Error :
Error : 2
Error : weaponlib.lua:23: attempt to compare nil with number
No funciona
¿Que hay en esta linea?
¿Que hay en esta linea?
23 if
23 if self.time_act:time() > self.time then
Te dejo el if completo:
function obj:shoot(x,y,vel,ang)
if self.running then
if self.time_act:time() > self.time then
table.insert(self.bullets,{vel=vel,x=x,y=y,ang=ang,inc_x = math.cos(math.rad(ang)),inc_y = math.sin(math.rad(ang))});
self.time_act:reset();
end
else
self:start();
end
end
Hiciste el dofile al
Hiciste el dofile al timer.lua?
Lo hizo
Según el code de ahí arriba, lo hace en la segunda línea
Saludos!
Es raro, porque hice el
Es raro, porque hice el dofile al timer.lua, quizas hice algo mal, no me puedes hacer un zip con el timer.lua ya cargado?? porque yo estoy haciendo algo mal.
Ya lo he
Ya lo he solucionado:
Weaponlib: http://pastebin.com/raw.php?i=awuwarvP
Sample: http://pastebin.com/raw.php?i=EgnY2Rth
No funcioooonaaaaa!!!!! A
No funcioooonaaaaa!!!!!
A ver.. a ver... te dejo mi script junto con el timer.lua y la weaponlib.lua para a ver si encuentras algo.
http://www.mediafire.com/?r8xczxbb7n78r7w
Ya vi el fallo, al crear la
Ya vi el fallo, al crear la "weapon" debes hacer weapon.new con un solo punto ".", una vez creada las siguientes funciones van con dos puntos ":".
O sea debes cambiar eso así:
Por cierto el arma:blit debería ir dentro del while pero fuera de cualquier condición.
Aaaaaa!!!! No funciona!!!! Me
Aaaaaa!!!! No funciona!!!!
Me sigue dando error en la weaponlib.lua linea 24
Espera mañana y lo pruebo en
Espera mañana y lo pruebo en la wii.
Gracias. Oye, que le sucedio
Gracias.
Oye, que le sucedio a Chimecho??
Bueno al final ya vi el error
Bueno al final ya vi el error xD
Fíjate aqui: arma1 = weapon.new{bala,2000}
que para llamar a la función usas "{" y "}", debes usar los paréntesis normales.
Bueno muchas gracias. Me lo
Bueno muchas gracias.
Me lo has resuelto perfecto =D
Oye, el link del xKeyBoard esta caido.
Ok xerpi porque la v3.0 me da
Ok xerpi porque la v3.0 me da un error en la linea 67
Probare con la v4
Saludos!
Nueva versión
Nueva versión 4.0
DESCARGA: http://pastebin.com/raw.php?i=K6hmt44j
USO:
Lo primero de todo tenemos que hacer un dofile a la libreria.
dofile("weaponlib.lua")
Luego cargamos la imagen de la bala ( DEBE DE ESTAR EN HORIZONTAL):
bala = image.load("bala.png")
Luego de eso creamos el "arma":
disparo = weapon:new(bala,50);
El primer parámetro es la imagen de la bala previamente cargada/creada, y el segundo el tiempo en milisegundos entre disparo y disparo .
Ahora inicializamos el "arma":
disparo:start();
El siguiente paso será disparar:
disparo:shoot(x,y,velocidad,ángulo)
Por último será blitear las balas:
disparo:blit()
Si quieremos comprobar una colisión tan solo debemos hacer esto:
disparo:collision(x,y,w,h,boolean)
"x","y","w" y "h" són las coordenadas y el ancho y alto del "sitio" donde queremos colisionar. En boolean va true si quieres que al colisionar la bala desaparezca o false o un espacio vacio si no.
SNIPPET DE EJEMPLO:
Ya hay la 4.0 desde hace
Ya hay la 4.0 desde hace tiempo.
El link de descarga de la v3
El link de descarga de la v3 está mal, se descarga la 1.5.
Genial :D
Gran librería y gran coder ;)
gracias
esta bien pero no entendi en todo
By Jorge_97
wtf:
Fecha en la que xerpi subio la V3: Sáb, 2011-07-30 12:47
Fecha en la que subieron esto a portada: Jue, 2011-08-11 11:43
Buen aporte!! Un salu2 a todos
Dos años en SCENEBETA
Click aquí para ver la Entrada de Bitácora.
supongo
tu lo harias mejor no?
By Jorge_97
La verdad nunca lo sabremos...
Solo digo que hace falta un poco mas de velocidad (Critica) Siento que este no sea el lugar adecuado para decir esto pero me da pereza crear otro tema...
PD: Cuando creas algo y ya tienes por ejemplo la version 2.0 y aun no han subido la V1.0 ... molesta mucho xD (Ej:Lethal Shot)
Salu2 espero no ofender a nadie
Dos años en SCENEBETA
Click aquí para ver la Entrada de Bitácora.
Perdon Patron
Tambien tengo vida y otras prioridades.
Si prefieres ponlas en el foro aportes de usuarios.
PD: ahora me pongo a actualizar noticias...
Fin del off-topic.
By Jorge_97
No eres el unico editor no te des por aludido...
Yo tambien soy humano
Salu2
...
Y por eso te digo, si me lo mandas por MP solo yo puedo hacerlo, si lo pones en el foro de aportes cualquier editor lo hara.
Si tanto te urge que vean tus
Si tanto te urge que vean tus creaciones, postealas en el foro mientras suban a Portada, o lo más justo de todo, postearla en el foro y que se gane la portada..
Salu2.
By Jorge_97
Interesante... Muy interesante
Con solo decirte
que en cada noticia, tienes que tener una limpieza y orden extrictas.... Y renombrar los archivos, crear una cabezera "apetitosa", etc,etc,etc.
Ademas, yo tambien espero que publiquen lo mio. Pero tengo paciencia.
By Jorge_97
Ya lo se xD y ademas realizan trabajos no remunerados que eso cuenta ;D
Salu2.
PD: Grandiosa esta Libreria sin duda es la mejor!!
Si lo dices por la
Si lo dices por la tardanza:
Fecha en la que xerpi subio la V3: Sáb, 2011-07-30 12:47
Fecha en la que se actualizo la lib : Dom, 2011 -07 -31 16:26
Fecha en la que subieron esto a portada: Jue, 2011-08-11 11:43
Salu3!
Click en la imagen si kieres un avatar o una firma tan espectacular como los mios =P.
Psp 2001 Gen d3 + Memory stick 4 gb
Ps3 Fat 60GB + CFW Rebug 3.55 + Disco duro externo 250 GB+ Multiman
Los editores
tienen bastante trabajo aunque no lo parezca, ademas de que una libreria de lua es menos urgente que una actualizacion de firmware.
Por eso la tardanza.
by jorge_97
Ya, no quiero criticar el trabajo de nadie ni mucho menos ademas de que lo hacen sin animo de lucro...
Pero es cierto que llevan un poco de tardanza...
Salu4
Dos años en SCENEBETA
Click aquí para ver la Entrada de Bitácora.
Más bien dicho yo diría que
Más bien dicho yo diría que fuerón rapidos, según la fecha que dá nevado, ya estaba actualizada un día despues de que Xerpi posteo la V3, recuerda, que cada noticia que pasa a portada, primero pasa por doscificación, y se queda ahí de acuerdo a su importancía.
Salu2!.
Como si esperas 3 meses si te
Como si esperas 3 meses si te interesa miras la noticia de vez en cuando y listo y la gente tiene mas k hacer xd xd no es una critica solo un comentario
Te repito
Que una lib tarda mas en actualizarse que un HB, aunque ya dijeron que se actualizo y no se publico. Asi que la espera era solo de esperar a la portada pero la lib ya estaba ahi.
Versión
Versión 3.
Mejoras:
Como usarlo:
Lo primero de todo tenemos que hacer un dofile a la libreria.
dofile("weaponlib.lua")
Luego cargamos la imagen de la bala ( DEBE DE ESTAR EN HORIZONTAL):
bala = image.load("bala.png")
Luego de eso creamos el "arma":
disparo = weapon.create(imagen_de_la_bala, tiempo)
El primer parámetro es la imagen de la bala previamente cargada/creada, y el segundo el tiempo en milisegundos entre disparo y disparo .
Ahora inicializamos el "arma":
weapon.action(arma,accion)
En acción va "start" o "stop".
El siguiente paso será disparar:
weapon.shoot(arma, x, y, velocidad, ángulo)
Por último será blitear las balas:
weapon.blit(arma)
Si quieremos comprobar una colisión tan solo debemos hacer esto:
weapon.collision(tabla,x,y,w,h,boolean)
"x","y","w" y "h" són las coordenadas y el ancho y alto del "sitio" donde queremos colisionar. En boolean va true si quieres que al colisionar la bala desaparezca o false o un espacio vacio si no.
Descarga weaponlib v3 + sample
NO RESPONDAIS EN ESE COMENTARIO
Lo mirare
Lo mirare
Si la vas a usar, usa la que
Si la vas a usar, usa la que hay unos comentarios mas abajo.
Ya funciona con la libreria
Ya funciona con la libreria animlib? osea que la bala sea una animacion?
Forma sencilla
Yo use algo parecido en shooter soccer.
En teoria debe funcionar
Follow me twitter nautilus1_jmccu!!
Sony, ya a nadie le interesa tus UMD si alguien compra una psp es por nosotros los coders. Madura y has un FW que haga la diferencia y anime a las personas en comprar un PSP
Mira unos cuantos comentarios
Mira unos cuantos comentarios más abajo y verás una forma mucho más rápida y sencilla, por cierto os recomiendo no usar la lib de la noticia, es mejor la que he puesto unos comentarios más abajo.
Perodonen mi ignorancia pero
Perodonen mi ignorancia pero esk no entiendo para que sirve este hombrew y eso de disparar...
Explicarmelo .
Gracias por adelantao