Rose Posted January 11, 2017 Share Posted January 11, 2017 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
Arsilex Posted January 11, 2017 Share Posted January 11, 2017 (edited) 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 January 11, 2017 by Arsilex Link to comment
Tomas Posted January 11, 2017 Share Posted January 11, 2017 Aquí tienes un ejemplo del movimiento, lo hice hace un año y es, en su mayoría, sacado del map editor: https://github.com/ChicoRDL/-GTi-RPG-V3-/blob/master/[GTi-RPG-V3]/[AAA-GTi-Resources/[GTI]/GTIapartments/editor/editor.lua Link to comment
Rose Posted January 11, 2017 Author Share Posted January 11, 2017 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
Rose Posted January 12, 2017 Author Share Posted January 12, 2017 (edited) 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 January 12, 2017 by Hit+ Link to comment
Tomas Posted January 12, 2017 Share Posted January 12, 2017 local relativePosition = Vector3(0, 1, 0) local matrix = player.matrix objeto.position = matrix:transformPosition(relativePosition) Debes activar OOP en el meta.xml Link to comment
Rose Posted January 13, 2017 Author Share Posted January 13, 2017 (edited) 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 January 13, 2017 by Hit+ Link to comment
Recommended Posts