Publicidad

Anuncios Google

problemas con nil....

he creado una función para las colisiones entre la bala y las piezas, del juego que puse en el post anterior, llevo 2 dias intentandolo.. pero no hay forma, siempre me da el mismo error y lo peor es que no comprendo porque lo da, ya que ahi nada deberia valer nil, incluso he probhado a poner ifs que comrpeuebs si hay alguna variable que valga nil, y quesi la hay no se ejecute el codigo de dentro del if, pero aun asi me devuelve el mismo error...

Error: /dev_usb000/script.lua:58: attempt to compare number whit nil

lo curioso es que hay un if justo encima de esa linea pero con ese no tirar error... salió la linea 58 porque es la que correspondia a la pieza que debería chocar con la bala, es decir que cuando esa línea devuelve true es cuando da el problema, tambien me lo ha dado con todas las otras que comprueban las colisiones, solo es cuestión de "atacar" a una pieza a u otra, pongo la función en cuestión

function colisiones()
	for i = 1, 100 do
		if piezatip[i] ~= nil and piezay[i] ~= nil and piezax[i] ~= nil then	
			for a = 1, 50 do
				if balasx[a] ~= nil and balasy[a] ~= nil then	
					if piezatip[i] == 1 then
						if (piezax[i] - 8) <= balasx[a] and (piezax[i] + 106) >= balasx[a] and (piezay[i] + 21) >= balasy[a] and piezay[i] <= balasy[i] then
							piezax[i] = nil
							piezay[i] = nil
							piezatip[i] = nil
							balasx[a] = nil
							balasy[a] = nil
							break
						end
					end
					if piezatip[i] == 2 then
						if (piezax[i] - 8) <= balasx[a] and (piezax[i] + 106) >= balasx[a] and (piezay[i] + 41) >= balasy[a] and piezay[i] <= balasy[i] then
							piezax[i] = nil
							piezay[i] = nil
							piezatip[i] = nil
							balasx[a] = nil
							balasy[a] = nil
							break
						end
					end
					if piezatip[i] == 3 then
						if (piezax[i] - 8) <= balasx[a] and (piezax[i] + 108) >= balasx[a] and (piezay[i] + 50) >= balasy[a] and piezay[i] <= balasy[i] then
							piezax[i] = nil
							piezay[i] = nil
							piezatip[i] = nil
							balasx[a] = nil
							balasy[a] = nil
							break
						end
					end
					if piezatip[i] == 4 then
						if (piezax[i] - 8) <= balasx[a] and (piezax[i] + 58) >= balasx[a] and (piezay[i] + 100) >= balasy[a] and piezay[i] <= balasy[i] then -- línea 58 del programa
							piezax[i] = nil
							piezay[i] = nil
							piezatip[i] = nil
							balasx[a] = nil
							balasy[a] = nil
							break
						end
					end
					if piezatip[i] == 5 then
						if (piezax[i] - 8) <= balasx[a] and (piezax[i] + 29) >= balasx[a] and (piezay[i] + 98) >= balasy[a] and piezay[i] <= balasy[i] then
							piezax[i] = nil
							piezay[i] = nil
							piezatip[i] = nil
							balasx[a] = nil
							balasy[a] = nil
							break
						end			
					end
					if piezatip[i] == 6 then
						if (piezax[i] - 8) <= balasx[a] and (piezax[i] + 108) >= balasx[a] and (piezay[i] + 100) >= balasy[a] and piezay[i] <= balasy[i] then
							piezax[i] = nil
							piezay[i] = nil
							piezatip[i] = nil
							balasx[a] = nil
							balasy[a] = nil
							break
						end
					end			
				end
			end
		end
	end
end

PD: el problema nunca lo da al destruir la primera pieza pieza.....[1] pero casi siempre(solo hubo una vez que no lo hizo y creo que fue porque le di a otra pieza) tira el error al destruir pieza.....[2]


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.

Prueba de poner un # (

Prueba de poner un # ( table.maxn) en los for, algo así:

	for i = 1, math.min(#piezax,#piezay) do
		if piezatip[i] ~= nil and piezay[i] ~= nil and piezax[i] ~= nil then	
			for a = 1, math.min(#balasx,#balasy) do
 

Imagen de Daklon

si no me equivoco eso lo que

si no me equivoco eso lo que hace es devolver el valor mínimo de una tabla?, no seria mejor algo así? for i = math.min(#piezax), math.max(#piezax) do... aunque creo que eso podría servir si el [1] siempre tuviera un valor, pero puede que el uno no tenga ningún valor y el [5] por ejemplo si, depende de las piezas que se hayan destruido, se generan a partir del uno y luego van sumando, pero si se destruye la primera pieza generada el índice 1 pasa a nil, hasta que se genere una nueva pieza que entonces ocupa ese lugar

Imagen de NEKERAFA

Mmm...

Pasame todo el código y miraré cual es el error, pero ya te digo una cosa, fíjate de lo que te dice:

attempt to compare number with nil: intento de comparar número con nil (nulo),&nbsp;es decir, que en alguna condición estas comparandolo con un valor núlo.

Solo te digo que vigiles esos for, puede que sea el que provoca un error. Mira, esta es la extrutura que sigues:

- for "condición" do
   BLOQUE
   !- for "condición" do (Advertencia, hasta que este bucle no termine no se ejecutará el bucle principal)
      BLOQUE
   end
   BLOQUE
end

Como ves, el primer bucle se ejecuta como siempre, pero llegados al for secundario, para la ejecución del primero y solo se ejecuta el segundo. Cuando este termine se vuelve al primario, y vuelve a ejecutar todo de nuevo.

 

Saludos ^-^


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 Daklon

si, esa era mi intencion,

si, esa era mi intencion, porque si pongo que compare pieza y balas con un mismo bucle compararia la pieza[1] con la bala[1], la pieza[2] con la bala[2], y asi no comprueba todas las posibles combinaciones, ya que no tiene porque ser la bala 1 la que se cargue la pieza1, por eso puse un bucle que compruebe todas las piezas, y luego, dentro compruebe cada pieza con todas las balas, aqui el enlace al código http://pastebin.com/kBBLRM5B

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.