Anuncios Google

Error con cursor [LuaDev][Solucionado]

He sacado de un tutorial de Deviante un cursor y lo he ajustado un poco.

 

cursor = {
   img = image.load("cur.png"),
   x = 240,
   y = 136,
   procesa = function (yomismo)
      if controls.analogx() > 40 then yomismo.x = yomismo.x + 3; end
      if controls.analogx() < 40 then yomismo.x = yomismo.x - 3; end
      if controls.analogy() > 40 then yomismo.y = yomismo.y + 3; end
      if controls.analogy() < 40 then yomismo.y = yomismo.y - 3; end
   end,
   blit = function (yomismo) 
      yomismo:procesa();
      yomismo.img:blit(yomismo.x,yomismo.y);
   end
}

 

Yo lo puedo mover para donde yo quiera con el Yoistik pero al soltar el Yoistik se sube para la esquina izquierda arriba.

 

¿Solución?

 

Edito: Nueva duda

Lo que e hecho es crear un script para las funciones del cursor:

 

	function mouseclick(x, y, w, h) -- boolean, mouseclick(objeto: x, y, ancho, alto): Devuelve true si el cursor esta encima del objeto
		if mouse.x >= x and mouse.x <= x+w and mouse.y >= y and mouse.y <= y+h then return true else return false end
	end
 
cursor = {
   img = image.load("cur.png"),
   x = 240,
   y = 136,
   procesa = function (yomismo)
      if controls.analogx() > 40 then yomismo.x = yomismo.x + 4; end
      if controls.analogx() < -40 then yomismo.x = yomismo.x - 4; end
      if controls.analogy() > 40 then yomismo.y = yomismo.y + 4; end
      if controls.analogy() < -40 then yomismo.y = yomismo.y - 4; end
   end,
   blit = function (yomismo) 
      yomismo:procesa();
      yomismo.img:blit(yomismo.x,yomismo.y);
   end
}

Y otra para otras cosas:

dofile("cur.lua");
 
 
--Colores
black=color.new(0,0,0)
azul=color.new(0,128,192)
--Cargando imagenes
menu = {}
menu[1] = image.load("Imagenes/log2.png")
 
 
 
options = 1
mActual = 1
while true do
controls.read()
 
image.blit(0,0,menu[mActual])
 
if controls.press("up") then
    if mActual<=1 then mActual=1 else mActual = mActual - 1 end
elseif controls.press("down") then
    if mActual >=1 then mActual = 1 else mActual = mActual + 1 end
end
 
--------------------------------------------------------------------------------------------------------------------------------
 
if mouseclick(185, 129, 110, 14) and controls.cross() then
os.quit()
end
 
cursor:blit(); 
 
screen.flip()
end

Pues bien al ejecutar el programa salta error:

attempt to index global mouse(a nil value)

El error debe de estar en la función mouseclick ya que antes de insertar esa funcion iba todo perfecto.




Anuncios Google

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 NEKERAFA

Gracias Tutos

Gracias por hacerme publicidad en cubierta jajajajaja.

Solo te recomiendo que cites la licencia.

EDITO: Haber, me da igual que me copies el código como ya he dicho más de una vez. No tengais miedo, ya que es libre. ¿Que pasaria si la gente tbiera miedo de copiar Linux? Pues que seguramente no existirian tantas distros como ahora, que es lo que consiste el software libre: Probar, Editar y Compartir


NekeOS, el nuevo shell para PSP

PS4 500GB OFW, PS3 320GB OFW, PS3 500GB OFW, PSP 6.39 PRO-C Fix4.

Sony Xperia Z1 Compact con Android 5.1.1

Portatil Lenovo z50-70 Intel® Core™ i7-4510U y NVIDIA GeForce 840M con Elementary OS 0.3.2 Freya (64 bits) y Windows 10 (64 bits).

Imagen de Tutos14

Claro, por supuesto.

Claro, por supuesto.

Imagen de NEKERAFA

Mmm...

Ya de paso te digo como funciona:

  • La función esta incluida dentro de la tabla mouse antes creada.
  • Las variables mouse.x y mouse.y estan creadas antes.

Si lo quieres adaptar haz esto:

cursor = {
   img = image.load("cur.png"),
   x = 240,
   y = 136,
   procesa = function (yomismo)
      if controls.analogx() > 40 then yomismo.x = yomismo.x + 4; end
      if controls.analogx() < -40 then yomismo.x = yomismo.x - 4; end
      if controls.analogy() > 40 then yomismo.y = yomismo.y + 4; end
      if controls.analogy() < -40 then yomismo.y = yomismo.y - 4; end
   end,
   blit = function (yomismo) 
      yomismo:procesa();
      yomismo.img:blit(yomismo.x,yomismo.y);
   end;
   on(yomismo, x, y, w, h)
      if yomismo.x >= x and yomismo.x <= x+w and yomismo.y >= y and yomismo.y <= y+h then return true else return false end
      end
}

Es lo mismo pero utilizando la tecnica self


NekeOS, el nuevo shell para PSP

PS4 500GB OFW, PS3 320GB OFW, PS3 500GB OFW, PSP 6.39 PRO-C Fix4.

Sony Xperia Z1 Compact con Android 5.1.1

Portatil Lenovo z50-70 Intel® Core™ i7-4510U y NVIDIA GeForce 840M con Elementary OS 0.3.2 Freya (64 bits) y Windows 10 (64 bits).

Imagen de Tutos14

Entonces para que funcione

Entonces para que funcione esto:

if mouse.on(185, 129, 110, 14) and controls.cross() then
os.quit()

como deberia yamarlo, porque eso no esta nombrado como función



Imagen de NEKERAFA

No es así

Ahora la he incluido dentro de cursor, por lo que para llamarla se tendría que hacer así:

if cursor.on(cursor, 185, 129, 110, 14) and controls.cross() then
   os.quit()
end
 
-- O
 
if cursor:on(185, 129, 110, 14) and controls.cross() then
   os.quit()
end

Es como si fuera una nueva función de la tabla anterior


NekeOS, el nuevo shell para PSP

PS4 500GB OFW, PS3 320GB OFW, PS3 500GB OFW, PSP 6.39 PRO-C Fix4.

Sony Xperia Z1 Compact con Android 5.1.1

Portatil Lenovo z50-70 Intel® Core™ i7-4510U y NVIDIA GeForce 840M con Elementary OS 0.3.2 Freya (64 bits) y Windows 10 (64 bits).

Imagen de Tutos14

Pues ahora muestra error en

Pues ahora muestra error en el script del cursor.

Dice : expected (to close( at line 1) near if

Imagen de NEKERAFA

Mmm...

Pues te falta algo...

Imagen de Tutos14

Se que le falta un if ya que

Se que le falta un if ya que dice: Near If pero no se donde.

Creo que el error es

Creo que el error es éste:

on(yomismo, x, y, w, h) --Aquí el error
 
--Debería ser:
on=function(yomismo, x, y, w, h)

Imagen de NEKERAFA

XD

Es verdad, se me olvidó ponerlo como función XD

LOOOL

Imagen de Tutos14

Ok, confirmado. Gracias a

Ok, confirmado.

Gracias a todos por vuestra ayuda

Imagen de cam-maker

puedes

puedes ver este tuto es sobre colisiones, ya que la condicion en al cual dices que si esta en tal punto, se sale, tendra que estar en ese punto exacto, en ese mismo pixel =_= para que la condicion se cumpla


"Las cosas brillantes siempre salen de repente, como la geometría de una flor"


Imagen de Tutos14

No lo he entendido muy bien

No lo he entendido muy bien pero no se si tengo que crear la funcion mouse asi:

function mouse(obj1, obj2) -- esta función, verifica si hay colisión o no entre dos objetos, notar que, DENTRO de la función se usan los parámetros que recibe, más adelante, veremos como se usa
	if obj1.x+obj1.w>obj2.x -- borde derecho obj1 > borde izquierdo obj2
	and obj1.x<obj2.x+obj2.w -- borde izquierdo obj1 < borde derecho obj2
	and obj1.y+obj1.h>obj2.y -- borde inferior obj1 > borde superior obj2
	and obj1.y<obj2.y+obj2.h then -- borde superior obj1 < borde inferior obj2
		return true -- retorna verdadero si hay colisión
	end
return false -- si el if no se cumple, viene a esta línea y retorna false, es decir, no hay colisión
end

O esto adaptarlo un poco:

if colision(link, objetos[i]) and link.status=="walk" then



La función de la colisión ya

La función de la colisión ya la tienes, pero es que estás usando variables que no tienes declaradas (y eso es porque estás usando codes que no entiendes como funcionan). En tu función mouseclick, en lugar de mouse.x y mouse.y prueba a poner cursor.x y cursor.y

Imagen de Tutos14

Ahora no da error, pero voy a

Ahora no da error, pero voy a comprobar si al pulsar X en ese sitio hace eso.

nil = no existe

Entonces... tienes definida la tabla mouse, con sus entradas x,y?

Imagen de Tutos14

Entonces la funcion

Entonces la funcion mouseclick la tendria que poner como tabla en vez de función?

No me refería a eso, sino a

No me refería a eso, sino a que en tu función mouseclick comparas números con las entradas de una tabla llamada mouse, y esa tabla no está definida en ningún lado.

Imagen de Tutos14

Oye, pero si le añado

Oye, pero si le añado esto:

if mouse.on(185, 129, 110, 14) and controls.cross() then
os.quit()

Le estarias diciendo que al pinchar X entre esas condenadas se salga de la aplicacion?



Imagen de Dioni0396

Si has creado una funcion explicita

si, sino no.

Imagen de Tutos14

Bueno e juntado la funcion

Bueno e juntado la funcion con el Code:

	function mouse.on(x, y, w, h) -- boolean, mouse.on(objeto: x, y, ancho, alto): Devuelve true si el cursor esta encima del objeto
		if mouse.x >= x and mouse.x <= x+w and mouse.y >= y and mouse.y <= y+h then return true else return false end
	end
 
cursor = {
   img = image.load("cur.png"),
   x = 240,
   y = 136,
   procesa = function (yomismo)
      if controls.analogx() > 40 then yomismo.x = yomismo.x + 3; end
      if controls.analogx() < -40 then yomismo.x = yomismo.x - 3; end
      if controls.analogy() > 40 then yomismo.y = yomismo.y + 3; end
      if controls.analogy() < -40 then yomismo.y = yomismo.y - 3; end
   end,
   blit = function (yomismo) 
      yomismo:procesa();
      yomismo.img:blit(yomismo.x,yomismo.y);
   end
}

 

Pero da errror

¿Que hay mal?



El nombre de la función

El nombre de la función mouse.on, cámbialo (o quítale el punto). Si la quieres usar tal cual, tendrías que definirla como una tabla:

mouse = {
on=funtion()
--aquí el code
end
}

Imagen de Tutos14

Muchas gracias, ¿Como te lo

Muchas gracias, ¿Como te lo puedo agradecer?

Ya lo hiciste xD

Me conformo con ese "gracias" ;)

Saludos

Imagen de Tutos14

Aora tengo otro error

Aora tengo otro error

Esa es la idea, pero no puedo

Esa es la idea, pero no puedo asegurar que funcione, no sé cómo tengas mouse.on

La solución es leer la

La solución es leer la documentación, porque ese code tiene errores de lógica (sigo pensando que Deviante metió los errores a posta, para darnos algo que hacer xD).

Te copio y pego de la docu lo que devuelve controls.analog: Un número del rango: (-128: izquierda/arriba, +127: derecha/abajo).
Qué significa? Que cuando el analógico está en reposo (en el centro) devuelve cero, y se cumplen las siguientes condiciones:

if controls.analogx() < 40 then yomismo.x = yomismo.x - 3; end
 if controls.analogy() < 40 then yomismo.y = yomismo.y - 3; end

Por lo tanto, el puntero se mueve :P

Imagen de Tutos14

mmm, haciendo unas pruebas e

mmm, haciendo unas pruebas e hecho esto:

 

cursor = {
   img = image.load("cur.png"),
   x = 240,
   y = 136,
   procesa = function (yomismo)
analogx = controls.analogx()
analogy = controls.analogy()
 
		if math.abs(analogx) > 64 then mouse.x = mouse.x + analogx/32 end
		if math.abs(analogy) > 64 then mouse.y = mouse.y + analogy/32 end
   end,
   blit = function (yomismo) 
      yomismo:procesa();
      yomismo.img:blit(yomismo.x,yomismo.y);
   end
}

 

Y ahora se esta quieto y no se mueve, pero a la hora de moverlo con el Joistik me da error: attempt to index global mouse(a nil value)



Eso significa que mouse no

Eso significa que mouse no está definido, o no es una tabla. Lo único que tenías que hacer era invertir un par de signos:

 procesa = function (yomismo)
      if controls.analogx() > 40 then yomismo.x = yomismo.x + 3; end
      if controls.analogx() < -40 then yomismo.x = yomismo.x - 3; end
      if controls.analogy() > 40 then yomismo.y = yomismo.y + 3; end
      if controls.analogy() < -40 then yomismo.y = yomismo.y - 3; end
   end

Y listo =/

Imagen de Tutos14

Ok, gracias

Ok, gracias

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.