Jump to content

Necesito que me expliquen algo, por favor


Rose

Recommended Posts

Tengo una duda y espero la entiendan.  Tengo un inventario (gridlist) donde hay 4 slots (rows), y lo qur quiero es crear un objeto para cada row, o sea, si selecciono la row 1 se crea un objeto, luego puedo mover ese objeto con WASD hacia cualquier lado; mi duda es que, al crear el objeto de la row 2 y lo trato de mover con WASD, seguro se bugeara y no se moverá un objeto, sé que se debe usar tablas pero no se me ocurre nada. 

Si entendieron lo que digo les agradecería si pueden darme un ejemplo, porque me confundo mucho a veces con el uso de tablas.

Y para resumir: que el objeto A no interfiera con el B, y el B no interfiera con el A, C, D, etc. 

Link to comment

Mira básicamente tienes que crear una array donde vas a almacenar todos los objetos cada vez que le des a la row del object.

 

Es decir le das al botón creas el objeto y lo metes a la array puedes dibujar la array en una gird así puedes ver los objetos que vas creando y controlarlos de esa manera

 

Para controlar uno u otro objeto vas a tener que hacer que cada vez que crees el objeto cambias una variable por ejemplo que sea local active

Creas un objeto y cambie al active y haciendo una cosa tal que así


 

local objetos = {}
local active = false

function createNewObject()
	local obj = createObject(8858, 0, 0, 0)
  	table.insert(objetos, obj)
  	active = #objetos
end

addCommandHandler("crear",
function ()
  createNewObject()
end)

function renderMovements()
  	local obj = active and objetos[active] or false
  	if obj then
    	local x, y, z = getElementObject(obj)
     	 if getKeyState("a") then
			setElementPosition(obj, x + 1, y, z)
     	 end
     	 if getKeyState("d") then
			setElementPosition(obj, x - 1, y, z)
      	 end
     	 if getKeyState("w") then
			setElementPosition(obj, x, y + 1, z)
      	 end
     	 if getKeyState("s") then
			setElementPosition(obj, x, y - 1, z)
     	 end
    end
end
addEventHandler("onClientRender", root, renderMovements)

No estoy seguro que el código haga lo que tiene que hacer porque ni lo he testeado ni nada pero es mas o menos lo que necesitas.

Edited by Arsilex
Link to comment

Gracias a los dos, voy a probar más tarde (o quizás mañana). Pero tengo una pregunta, si hago el movimiento del objeto desde client, los demás pueden ver hacía donde lo estoy moviendo? supongo que sí, ya que es cambio de posición, pero tengo esa duda ya que lo tengo hecho mediante un trigger a server, una variable marca la acción ("w", por ejemplo) y en server se mueve hacía adelante.

Otra pregunta, si quiero que el movimiento del objeto A no afecte al objeto B, tengo que almacenar una variable en una tabla para cada objeto que se cree?

Link to comment

No me deja editar el post.

Ya probé y me funcionó bien, junte algunas cosas del código de @Tomas y @Arsilex y va perfecto.

Olviden las otras preguntas, tengo otra: si quiero que el objeto se mueve hacía adelante según donde esté mirando el jugador( o la cámara ), cómo lo podría hacer?

intente copiando algunas cosas de lo que paso Tomas, pero el objeto no se mueve de esa manera, a veces si estoy mirando al frente sale para los lados, si miro atrás sale para adelante, etc. Estoy usando el bone_attach y la función exportada setElementBonePositionOffset, no sé si tenga algo que ver.

function drawing(button)
	local obj = vlb and tbl[vlb] or false
  	if obj then
		local action = c_Buttons[button]
		local camRotX, camRotY, camRotZ = getCameraRotation()
		camRotZ = camRotZ % 360
		local remainder = math.mod ( camRotZ, 90 )
		camRotZ = camRotZ + roundRotation ( remainder )
		local distanceX = c_speed * math.cos(camRotZ)
		local distanceY = c_speed * math.sin(camRotZ)
		c_Ped, c_Bone, c_Po.x, c_Po.y, c_Po.z, c_Po.rx, c_Po.ry, c_Po.rz = exports.bone_attach:getElementBoneAttachmentDetails(c_element)
		if action == "forward" then
			exports.bone_attach:setElementBonePositionOffset (c_element, c_Po.x + distanceX, c_Po.y + distanceY, c_Po.z) -- update offsets
		elseif  action == "backward" then 
			exports.bone_attach:setElementBonePositionOffset (c_element, c_Po.x - distanceX, c_Po.y - distanceY, c_Po.z) -- update offsets
		elseif  action == "right" then 
			exports.bone_attach:setElementBonePositionOffset (c_element, c_Po.x + distanceX, c_Po.y - distanceY, c_Po.z) -- update offsets
		elseif  action == "left" then 
			exports.bone_attach:setElementBonePositionOffset (c_element, c_Po.x - distanceX, c_Po.y + distanceY, c_Po.z) -- update offsets
		elseif  action == "up" then 
			exports.bone_attach:setElementBonePositionOffset (c_element, c_Po.x, c_Po.y, c_Po.z + c_speed) -- update offsets
		elseif  action == "down"  then 
			exports.bone_attach:setElementBonePositionOffset (c_element, c_Po.x, c_Po.y, c_Po.z - c_speed) -- update offsets
		elseif  action == "rotate+"  then 
			exports.bone_attach:setElementBonePositionOffset (c_element, c_Po.x, c_Po.y, c_Po.z, c_Po.rx, c_Po.ry, c_Po.rz + 1 * c_rotate ) -- update offsets
		elseif  action == "rotate-"  then 
			exports.bone_attach:setElementBonePositionOffset (c_element, c_Po.x, c_Po.y, c_Po.z, c_Po.rx, c_Po.ry, c_Po.rz - 1 * c_rotate ) -- update offsets
		elseif  action == "save"  then 
			stopEditionMode( )
		end
	end
end

function getCameraRotation ()
	local px, py, pz, lx, ly, lz = getCameraMatrix()
	local rotz = 6.2831853071796 - math.atan2 ( ( lx - px ), ( ly - py ) ) % 6.2831853071796
 	local rotx = math.atan2 ( lz - pz, getDistanceBetweenPoints2D ( lx, ly, px, py ) )
	--Convert to degrees
	rotx = math.deg(rotx)
	rotz = -math.deg(rotz)
	
 	return rotx, 180, rotz
end

function roundRotation ( rot )
	if rot < 45 then
		return -rot
	else return (90 - rot) end
end

Todo está funcionando bien, solo ese pequeño detalle.

 

 

Edited by Hit+
Link to comment
On 12/1/2017 at 4:27 AM, Tomas said:

local relativePosition = Vector3(0, 1, 0)
local matrix = player.matrix
objeto.position = matrix:transformPosition(relativePosition)

Debes activar OOP en el meta.xml

Gracias.

Tengo un problema, y es la ahora de editar la posición del objeto, intenté con algo que estaba en el código que me pasaste pero me da nil value como error.

Tengo esto:

local c_element
local c_speed = .15
local c_rotate = 3
local c_EditionActive = false
local c_offSetsPo = { }
local c_Buttons = { ["a"] = "left", ["w"] = "forward", ["d"] = "right", ["s"] = "backward", ["1"] = "up", ["2"] = "down", ["backspace"] = "reset", ["3"] = "rotate+", ["4"] = "rotate-", ["mouse_wheel_up+"] = "rotate", ["mouse_wheel_down"] = "rotate-", ["enter"] = "save"}

addEvent("onObjectMovement", true)
addEventHandler("onObjectMovement", root, 
	function( active, acce, acc ) 
		vlb = active
		tbl = acce
		c_element = acc
	end 
)





function startEditionMode(  )
	addEventHandler("onClientKey", root, drawing)
	toggleAllControls(false, true, true)
	if isElement(c_element)  then
		addEventHandler("onClientClick", root, processCursorClick)
	end
end

addEvent("startEditionMode", true)
addEventHandler("startEditionMode", root,
	function(  )
		addEventHandler("onClientClick", root, processCursorClick)
	end 
)

function stopEditionMode(  )
	removeEventHandler("onClientKey", root, drawing)
	toggleAllControls(true, true, true)
	current_cElement(nil)
	c_offSetsPo = { }
end

function processCursorClick (button, state, absoluteX, absoluteY, worldX, worldY, worldZ, clickedElement, fromPreview)
	if ( button == "left" and state == "up" and clickedElement and not c_element or c_element ~= clickedElement and clickedElement ) then
		startEditionMode(  )
		outputChatBox("Click")
	end
end



function current_cElement( elem ) 
	c_element = elem
	return true
end 

function drawing(button)
	local obj = vlb and tbl[vlb] or false
  	if obj then
		local action = c_Buttons[button]
		local camRotX, camRotY, camRotZ = getCameraRotation()
		camRotZ = camRotZ % 360
		local remainder = math.mod ( camRotZ, 90 )
		camRotZ = camRotZ + roundRotation ( remainder )
		local distanceX = c_speed * math.cos(camRotZ)
		local distanceY = c_speed * math.sin(camRotZ)
		c_Ped, c_Bone, c_offSetsPo.x, c_offSetsPo.y, c_offSetsPo.z, c_offSetsPo.rx, c_offSetsPo.ry, c_offSetsPo.rz = exports.bone_attach:getElementBoneAttachmentDetails(c_element)
		if action == "forward" then
			exports.bone_attach:setElementBonePositionOffset (c_element, c_offSetsPo.x + distanceX, c_offSetsPo.y + distanceY, c_offSetsPo.z) -- update offsets
		elseif  action == "backward" then 
			exports.bone_attach:setElementBonePositionOffset (c_element, c_offSetsPo.x - distanceX, c_offSetsPo.y - distanceY, c_offSetsPo.z) -- update offsets
		elseif  action == "right" then 
			exports.bone_attach:setElementBonePositionOffset (c_element, c_offSetsPo.x + distanceX, c_offSetsPo.y - distanceY, c_offSetsPo.z) -- update offsets
		elseif  action == "left" then 
			exports.bone_attach:setElementBonePositionOffset (c_element, c_offSetsPo.x - distanceX, c_offSetsPo.y + distanceY, c_offSetsPo.z) -- update offsets
		elseif  action == "up" then 
			exports.bone_attach:setElementBonePositionOffset (c_element, c_offSetsPo.x, c_offSetsPo.y, c_offSetsPo.z + c_speed) -- update offsets
		elseif  action == "down"  then 
			exports.bone_attach:setElementBonePositionOffset (c_element, c_offSetsPo.x, c_offSetsPo.y, c_offSetsPo.z - c_speed) -- update offsets
		elseif  action == "rotate+"  then 
			exports.bone_attach:setElementBonePositionOffset (c_element, c_offSetsPo.x, c_offSetsPo.y, c_offSetsPo.z, c_offSetsPo.rx, c_offSetsPo.ry, c_offSetsPo.rz + 1 * c_rotate ) -- update offsets
		elseif  action == "rotate-"  then 
			exports.bone_attach:setElementBonePositionOffset (c_element, c_offSetsPo.x, c_offSetsPo.y, c_offSetsPo.z, c_offSetsPo.rx, c_offSetsPo.ry, c_offSetsPo.rz - 1 * c_rotate ) -- update offsets
		elseif  action == "save"  then 
			stopEditionMode( )
		end
	end
end

function getCameraRotation ()
	local px, py, pz, lx, ly, lz = getCameraMatrix()
	local rotz = 6.2831853071796 - math.atan2 ( ( lx - px ), ( ly - py ) ) % 6.2831853071796
 	local rotx = math.atan2 ( lz - pz, getDistanceBetweenPoints2D ( lx, ly, px, py ) )
	--Convert to degrees
	rotx = math.deg(rotx)
	rotz = -math.deg(rotz)
	
 	return rotx, 180, rotz
end

function roundRotation ( rot )
	if rot < 45 then
		return -rot
	else return (90 - rot) end
end

Se activa el evento onClientKey de la función drawing, pero me da errores como:

  • Attemp to perform arithmetic on 'z' (nil value)
  • Attemp to perform arithmetic on 'rx' (nil value)
  • Attemp to perform arithmetic on 'x' (nil value)
  • etc...

Quizá porque el elemento "c_element" no existe, pero, ¿por qué si ya está creado?, ese es mi duda... También intente quitando el current_cElement(nil), pero igual, sigue dando esos errores.

Edited by Hit+
Link to comment
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...