Anuncios Google

[SOLUCIONADO POR RG] Duda de principiante sobre tablas en LuaDev...

Hasta yo mismo me digo que es de principiante, porque no puede ser más tonta la duda:

Si tengo almacenada una variable en una tabla, y en la misma quiero usarla con toro objeto, ejemplo:

gnomos = {
   a = 255,
   color = color.new(255,255,255,???),
}

¿Qué debo colocar en "???"? Porque he probado con "gnomos.a" y salta error =/

Un saludo.

SOLUCIONADO POR RG


 

 


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.

En este caso hay que usar un

En este caso hay que usar un poco del tuto de modulación de DeViaNTe. Ahora, entiendo que quieres modificar externamente el valor de a, y que se refleje en el color, verdad? Prueba esto:

gnomos = {
   a = 255,
   getColor = function(self)
      return color.new(255,255,255,self.a)
   end
}
 
--Para obtener el valor con el canal alpha actual, sería algo así...
 
screen.print(5,5,"Lo que sea xD",1,gnomos:getColor(),0xFF000000)  --Color sólido
  gnomos.a = 120  --Modifico el valor del canal alpha
    screen.print(5,5,"Lo que sea xD",1,gnomos:getColor(),0xFF000000)  --Semitransparente

Nótese que uso dos puntos al indexar la tabla, no 1 (usando 2 puntos la tabla es el 1er argumento, recordar).

Ahhhh...

Entiendo, ok, probaré con eso, pero aún así se me ha ocurrido una cosa que también podría funcionar y que podría darme un poco más de personalización...

gnomos = {
   r = 255, -- Designo canal "red"
   g = 255, -- Designo canal "green"
   b = 255, -- Designo canal "blue"
   a = 255, -- Designo canal "alpha"
} -- Aunque sean más, pero se puede modificar completamente ;D
 
while true do -- Bucle Infinito
   screen.print(20,20,"En ocasiones, veo gnomos xD",0.8,color.new(gnomos.r,gnomos.g,gnomos.b,gnomos.a),0x0); -- Función totalmente modificable en cuanto a colores y transparencia :D
   screen.flip(); -- Flip!
end -- Fin

Un saludo ;D


 

 

Pues se pueden combinar ambos

Pues se pueden combinar ambos codes...

gnomos = {
   r = 255, -- Designo canal "red"
   g = 255, -- Designo canal "green"
   b = 255, -- Designo canal "blue"
   a = 255, -- Designo canal "alpha"
   getColor = function (self)
      return color.new(self.r,self.g,self.b,self.a)
   end
} -- Aunque sean más, pero se puede modificar completamente ;D
 
while true do -- Bucle Infinito
   screen.print(20,20,"En ocasiones, veo gnomos xD",0.8,gnomos:getColor(),0x0); -- Función totalmente modificable en cuanto a colores y transparencia :D
   screen.flip(); -- Flip!
end -- Fin

Se desgasta menos el teclado, queda más limpio el code y se ve más "Pro" xD

Muy bueno ;D

Muy bueno ;D

Si lo quieres con setters y

Si lo quieres con setters y getters, podrías añadir esto también:

gnomos = {
	r = 255, -- Designo canal "red"
	g = 255, -- Designo canal "green"
	b = 255, -- Designo canal "blue"
	a = 255, -- Designo canal "alpha"
	getColor = function (self)
		return color.new(self.r,self.g,self.b,self.a)
	end,
	setColor = function (self, r, g, b, a)
		self.r = r or self.r;
		self.g = g or self.g;
		self.b = b or self.b;
		self.a = a or self.a;
	end
} -- Aunque sean más, pero se puede modificar completamente ;D
 
gnomos:setColor(255,0,0,125); 
gnomos.setColor(255,0,0); --No hace falta poner todos los parámetros
 
while true do -- Bucle Infinito
	screen.print(20,20,"En ocasiones, veo gnomos xD",0.8,gnomos:getColor(),0x0); -- Función totalmente modificable en cuanto a colores y transparencia :D
	screen.flip(); -- Flip!
end -

Imagen de User170294

¿Que hace esto? self.r = r or

¿Que hace esto?

self.r = r or self.r;

Es por si no pone nada en el

Es por si no pone nada en el parámetro, si pone algo self.r coge el valor del parámetro r, si no, se queda el mismo valor.

Imagen de User170294

Es decir, si pones nil tomará

Es decir, si pones nil tomará el valor nil y si cuando declaras la función poniendo setColor(255,,,); solamente tomará r el valor 255 y los demás seguirán tal cual no¿


Exacto, en caso de solo

Exacto, en caso de solo querer modificar solo r sería:  setColor(255); 

Imagen de User170294

OK. Y para modificar "blue"

OK. Y para modificar "blue" sería setColor(,,255); no?

No, eso daría error, en todo

No, eso daría error, en todo caso sería setColor(nil,nil,255)

Imagen de User170294

pero entonces cogerían el

pero entonces cogerían el valor nil

No, para eso está la línea

No, para eso está la línea por la que preguntabas arriba: self.r = r or self.r

self.r tomará el valor que indiques de r. Si le das nil, entonces no cambiará su valor (se igualará a self.r).

Para que me entiendas mejor...

--Esto:
self.r = r or self.r
 
--Es lo mismo que poner:
if r then 
  self.r = r
end

Imagen de barney77

Tienes razón RG, no me había

Tienes razón RG, no me había dado cuenta de que r tenía valor XD, bueno una disculpa, me fijare mas a la próxima.

Un saludo.

Imagen de barney77

Pues eso, así debe de

Pues eso, así debe de ser..

Mira:

self.r = r or self.r;

Aca claramente lo dice, usa el operador or. Osea que si A(r) es nill o false(en caso de que no le pases el parametro a la funcion, si sera falso o nill) devolvera B(self.r) que a fín de cuentas es nill.

Y eso hace que la función no te de error por no pasarle todos los parametros.

Lee este tutorial, yo le di varias repasadas( y se las sigo dando), para poder entenderlo, un saludo.

 

Bueno...

Eso lo hice hace bastante tiempo (el setter), pero gracias de todas formas.

El favor me lo harías si me dijeras por qué algunos coders ponen "self" en las funciones, porque yo no sé para que diablos es y me vuelvo un poco loco jeje...

Salu2.


 

 

No se si sabrás Java o C++,

No se si sabrás Java o C++, pero el self es parecido al this (aunque es algo diferente).

Si pones:

gnomos = {
	a = 1
	setA = function (self, newA)
		self.a = newA;
	end
}

Y usas: gnomos:setA(50), como puedes ver solo llamo a la función con un solo parámetro,y en cambio la he declarado con dos, ya que al usar ":" en vez de ".", el primer parámetro se "elimina" y se convierte en la tabla, o sea, que el self se convierte en la tabla de donde se encuentra la función (es este caso self se convertiria en gnomos).

 

Correcto, aunque cabe aclarar

Correcto, aunque cabe aclarar que "self" pudo haber sido cualquier otro nombre de variable válido, no importa realmente (a diferencia de Java, donde forzosamente es this).

Imagen de Chimecho

A ver

Es que hay dos formas de declarar los métodos (funciones) de un objeto (tabla).

La primera, que es la que han estado usando hasta el momento:

objeto = {
   valor = 5,
   print = function(yomismo)
       print(yomismo.valor);
   end
}

Donde puedes poner el nombre que quieras, self, yomismo, o lo que sea. Y la llamas con los dos puntos, así: objeto:print()

Y la segunda, declarar la función a parte, pero de una forma distinta:

objeto = {
   valor = 5
}
 
function objeto:print() -- nótese los dos puntos al declarar
   print(self.valor);
end

Donde para poder acceder al objeto, se debe poner sí o sí self, caso contrario daría error. Además, al declarar la función ya no es necesario poner un parámetro para recibir la tabla. Para llamarla es igual que la anterior, así: objeto:print()

 

Saludos!



PSP FAT [5.00 M33-6] [6.60 ME] [Hard Moded] / Nintendo Wii [4.1U] [cIOS Hermes] [D2X cIOS] / iPhone 3G [4.2.1] [BB 05.13.04] [redsn0w] / iPod Touch 4 [6.1] [evasi0n]

07/05/10: Tuve el placer de llamarle con todo derecho "N00B" a molotovi xDDD

Recuerda: Sé el intérprete -_-

Imagen de barney77

Pero

Pero como hago para que la funcion no solo me sirva con una sola variable de la tabla es decir(un ejemplo, este si me va):

text = "Hola";
 
mostrar = function (self,x,y,color) screen.print(x,y,self.text,color); end
 
while true do
 
	_G:mostrar(10,10,color.new(0,255,0)); --Usamos la tabla global :D
	screen.flip();
 
end

Pero y si quiero añadir otra variable de esa misma tabla, como se hace, he intentado con []:

text = "Hola";
text2 = "Hola2";
 
mostrar = function (self,x,y,color) screen.print(x,y,self[number],color); end
 
while true do
 
	_G[1]:mostrar(10,10,color.new(0,255,0)); --Usamos la tabla global :D
	_G[2]:mostrar(20,20,color.new(255,0,0));
	screen.flip();
 
end

Pero pues no me va me marca error, alguien sabe como ?, también he intentado con .

Un saludo

Imagen de User170294

Pon un valor del 1 al 100 y

Pon un valor del 0 al 100 y listo! ;)

No...

Me refiero a que quiero utilizar el valor de "a" (255) almacenado en la tabla gnomos, es decir, "gnomos.a" en la función del color, para que más adelante pueda modificar ese valor...


 

 

Imagen de User170294

Revisa la documentación pero

Revisa la documentación pero me parece que el rango de valor de alpha es [0,100], pero revisa la docu por si acaso.

Te equivocas =/

Es 255 el máximo.

Imagen de m.rr

Prueba

Prueba:

gnomos = {
   a = 255,
   color = color.new(255,255,255,a),
}

o

gnomos = {
   a = 255,
   color = color.new(255,255,255,gnomos.a)
}

Como he mencionado...

No funciona...

Si os sirve de ayuda (aunque no creo que varíe), en realidad la tabla real es así:

top = {
   bar = {
      image = image.load("RUTA"), -- Sin importancia...
      a = 255,
      color = color.new(255,255,255,top.bar.a), -- Pero así no funciona…
   },
 
   [] -- Resto del code…
 
}


 

 

Imagen de m.rr

¿Has probado de la segunda

¿Has probado de la segunda forma?

Mira prueba así:

top = {
   bar = {
      image = image.load("RUTA"), -- Sin importancia...
      a = 255,
      color = color.new(255,255,255,top.bar.a) -- Quítale las coma..
   }
 
   [] -- Resto del code…
 
}

Sí...

De ambas formas, pero nada...

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.