Assembler deux scripts .lua

Assembler deux scripts .lua - Divers - Programmation

Marsh Posté le 21-08-2008 à 11:16:45    

Bonjour à tous! :)
 
 
Avant de commencer, je précise deux petites choses! :)
- J'ignore quel est le type de code dont je vais vous parler, voici la raison pour laquelle je poste en " Divers".
- Après avoir lu les règles du forum prog, je sais que la demande de type " faites moi ça " est très mal vue, je n'ai malheureusement pas le choix vu le peu de connaissance que je possède.
Merci de prendre tout cela en considération... :)
 
Je fais partie d'une petite communauté développant des mods pour un jeu assez peu connu...
Ceux ci se composent de trois parties : la modélisation, le script .xml et un script .lua.
Mon problème est que je m'y connais très très peu dans ce dernier, et que pour la réalisation d'un mod je souhaite assembler deux scripts ensemble.
 
Je m'explique:
 
Un script X.lua comprend une fonction de rotation. Un deuxième script Y.lua comprend un mouvement de translation. Mon souhait est de réunir ces mouvements de rotation et translation dans un seul même script nommé Z.lua.
 
Voici les scripts :

X.lua

 

Code :
  1. Frontlader = {}
  2. function Frontlader:new(configFile, positionX, offsetY, positionZ, rotationY, customMt)
  3. if Frontlader_mt == nil then
  4.  Frontlader_mt = Class(Frontlader, Vehicle);
  5. end;
  6.    
  7.     local mt = customMt;
  8.     if mt == nil then
  9.         mt = Frontlader_mt;
  10.     end;
  11.    
  12.     local instance = Vehicle:new(configFile, positionX, offsetY, positionZ, rotationY, mt);
  13.     local xmlFile = loadXMLFile("TempConfig", configFile);
  14.     local jointDesc = {};
  15.     jointDesc.jointTransform = Utils.indexToObject(instance.rootNode, getXMLString(xmlFile, "vehicle.frontLoaderJoint#index" ));
  16.     if jointDesc.jointTransform ~= nil then
  17.         jointDesc.rotationNode = Utils.indexToObject(instance.rootNode, getXMLString(xmlFile, "vehicle.frontLoaderJoint#rotationNode" ));
  18.         if jointDesc.rotationNode ~= nil then
  19.             local x, y, z = Utils.getVectorFromString(getXMLString(xmlFile, "vehicle.frontLoaderJoint#maxRot" ));
  20.             jointDesc.maxRot = {};
  21.             jointDesc.maxRot[1] = Utils.degToRad(Utils.getNoNil(x, 0));
  22.             jointDesc.maxRot[2] = Utils.degToRad(Utils.getNoNil(y, 0));
  23.             jointDesc.maxRot[3] = Utils.degToRad(Utils.getNoNil(z, 0));
  24.             x, y, z = getRotation(jointDesc.rotationNode);
  25.             jointDesc.minRot = {x,y,z};
  26.         end;
  27.         jointDesc.rotationNode2 = Utils.indexToObject(instance.rootNode, getXMLString(xmlFile, "vehicle.frontLoaderJoint#rotationNode2" ));
  28.         if jointDesc.rotationNode2 ~= nil then
  29.             local x, y, z = Utils.getVectorFromString(getXMLString(xmlFile, "vehicle.frontLoaderJoint#maxRot2" ));
  30.             jointDesc.maxRot2 = {};
  31.             jointDesc.maxRot2[1] = Utils.degToRad(Utils.getNoNil(x, 0));
  32.             jointDesc.maxRot2[2] = Utils.degToRad(Utils.getNoNil(y, 0));
  33.             jointDesc.maxRot2[3] = Utils.degToRad(Utils.getNoNil(z, 0));
  34.             x, y, z = getRotation(jointDesc.rotationNode2);
  35.             jointDesc.minRot2 = {x,y,z};
  36.         end;
  37.        
  38.         jointDesc.moveTime = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.frontLoaderJoint#moveTime" ), 0.5)*1000;
  39.         jointDesc.moveTime2 = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.frontLoaderJoint#moveTime2" ), 0.5)*1000;
  40.         jointDesc.moveDirection = 0; -- 1 = rotate up, -1 = rotate down
  41.         jointDesc.moveDirection2 = 0;
  42.         jointDesc.jointIndex = 0;
  43.     end;
  44.     instance.frontLoaderJointDesc = jointDesc;
  45.     instance.frontLoaderAttachedObject = nil;
  46.    
  47.     delete(xmlFile);
  48. return instance;
  49. end;
  50. function Frontlader:keyEvent(unicode, sym, modifier, isDown)
  51.     Frontlader:superClass().keyEvent(self, unicode, sym, modifier, isDown);
  52. if self.frontLoaderAttachedObject ~= nil then
  53.         self.frontLoaderAttachedObject:keyEvent(unicode, sym, modifier, isDown)
  54.     end;
  55.     local jointDesc = self.frontLoaderJointDesc;
  56.     if sym == Input.KEY_KP_8 or sym == Input.KEY_KP_5 then
  57.         jointDesc.moveDirection2 = 0;
  58.         if isDown then
  59.          if sym == Input.KEY_KP_5 then
  60.                 jointDesc.moveDirection2 = 1;
  61.          elseif sym == Input.KEY_KP_8 then
  62.                 jointDesc.moveDirection2 = -1;
  63.          end;
  64.         end;
  65.     end;
  66.     if sym == Input.KEY_KP_4 or sym == Input.KEY_KP_7 then
  67.         jointDesc.moveDirection = 0;
  68.         if isDown then
  69.          if sym == Input.KEY_KP_7 then
  70.                 jointDesc.moveDirection = 1;
  71.          elseif sym == Input.KEY_KP_4 then
  72.                 jointDesc.moveDirection = -1;
  73.          end;
  74.         end;
  75.     end;
  76.     if isDown and sym == Input.KEY_KP_0 then
  77.         if self.frontLoaderAttachedObject ~= nil then
  78.             -- detach attachable
  79.   self.frontLoaderAttachedObject:onDeselect();
  80.             self.frontLoaderAttachedObject:onDetach();
  81.   removeJoint(jointDesc.jointIndex);
  82.             jointDesc.jointIndex = 0;
  83.             self.frontLoaderAttachedObject = nil;
  84.         else
  85.             local attachableInRange = self:frontLoaderAttachableInRange();
  86.             if attachableInRange ~= nil then
  87.                 -- attach
  88.                 local implement = {};
  89.                 self.frontLoaderAttachedObject = attachableInRange;
  90.    self.frontLoaderAttachedObject:onAttach(self);
  91.                 self.frontLoaderAttachedObject:onSelect();
  92.                 local constr = JointConstructor:new();
  93.                 constr:setActors(self.rootNode, attachableInRange.rootNode);
  94.                 constr:setJointTransforms(jointDesc.jointTransform, attachableInRange.attacherJoint);
  95.                 for i=1, 3 do
  96.                     constr:setRotationLimit(i-1, 0, 0);
  97.                     constr:setTranslationLimit(i-1, true, 0, 0);
  98.                 end;
  99.                 jointDesc.jointIndex = constr:finalize();
  100.                 jointDesc.moveDirection = 0;
  101.                 jointDesc.moveDirection2 = 0;
  102.             end;
  103.         end;
  104.     end;
  105. end;
  106. function Frontlader:update(dt)
  107.     Frontlader:superClass().update(self, dt);
  108. if self.frontLoaderAttachedObject ~= nil then
  109.         self.frontLoaderAttachedObject:update(dt);
  110.     end;
  111.     local jointDesc = self.frontLoaderJointDesc;
  112.     local jointFrameInvalid = false;
  113.     if jointDesc.rotationNode ~= nil then
  114.         if jointDesc.moveDirection ~= 0 then
  115.             local x, y, z = getRotation(jointDesc.rotationNode);
  116.             local rot = {x,y,z};
  117.             local newRot = Utils.getMovedLimitedValues(rot, jointDesc.maxRot, jointDesc.minRot, 3, jointDesc.moveTime, dt, jointDesc.moveDirection == 1);
  118.             setRotation(jointDesc.rotationNode, unpack(newRot));
  119.             for i=1, 3 do
  120.                 if math.abs(newRot[i] - rot[i]) > 0.001 then
  121.                     jointFrameInvalid = true;
  122.                 end;
  123.             end;
  124.         end;
  125.     end;
  126.     if jointDesc.rotationNode2 ~= nil then
  127.         if jointDesc.moveDirection2 ~= 0 then
  128.             local x, y, z = getRotation(jointDesc.rotationNode2);
  129.             local rot = {x,y,z};
  130.             local newRot = Utils.getMovedLimitedValues(rot, jointDesc.maxRot2, jointDesc.minRot2, 3, jointDesc.moveTime2, dt, jointDesc.moveDirection2 == 1);
  131.             setRotation(jointDesc.rotationNode2, unpack(newRot));
  132.             for i=1, 3 do
  133.                 if math.abs(newRot[i] - rot[i]) > 0.001 then
  134.                     jointFrameInvalid = true;
  135.                 end;
  136.             end;
  137.         end;
  138.     end;
  139.     if jointFrameInvalid and jointDesc.jointIndex ~= 0 then
  140.         setJointFrame(jointDesc.jointIndex, 0, jointDesc.jointTransform);
  141.     end;
  142. end;
  143. function Frontlader:frontLoaderAttachableInRange()
  144.     local nearestAttachable = nil;
  145.     if self.isEntered ~= nil then
  146.         local nearestDistance = 1.0;
  147.         local jointDesc = self.frontLoaderJointDesc;
  148.         local px, py, pz = getWorldTranslation(jointDesc.jointTransform);
  149.         for i=1, table.getn(g_currentMission.attachables) do
  150.             if not g_currentMission.attachables[i].isAttached then
  151.                 local vx, vy, vz = getWorldTranslation(g_currentMission.attachables[i].attacherJoint);
  152.                 local distance = Utils.vector3Length(px-vx, py-vy, pz-vz);
  153.                 if distance < nearestDistance then
  154.                     nearestAttachable = g_currentMission.attachables[i];
  155.                     nearestDistance = distance;
  156.                 end;
  157.             end;
  158.         end;
  159.     end;
  160.     return nearestAttachable;
  161. end;


 
Y.lua :
 
 
 

Code :
  1. Palettengabel = {};
  2. function Palettengabel:new(configFile, positionX, offsetY, positionZ, rotationY, customMt)
  3.     if Palettengabel_mt == nil then
  4.         Palettengabel_mt = Class(Palettengabel, Implement);
  5.     end;
  6.     local mt = customMt;
  7.     if mt == nil then
  8.         mt = Palettengabel_mt;
  9.     end;
  10.     local instance = Implement:new(configFile, positionX, offsetY, positionZ, rotationY, mt);
  11.     local xmlFile = loadXMLFile("TempConfig", configFile);
  12.     local translationPartNode = Utils.indexToObject(instance.rootNode, getXMLString(xmlFile, "vehicle.translationPart#index" ));
  13.     if translationPartNode ~= nil then
  14.         instance.translationPart = {};
  15.         instance.translationPart.node = translationPartNode;
  16.         local x, y, z = Utils.getVectorFromString(getXMLString(xmlFile, "vehicle.translationPart#minTrans" ));
  17.         instance.translationPart.minTrans = {};
  18.         instance.translationPart.minTrans[1] = Utils.getNoNil(x, 0);
  19.         instance.translationPart.minTrans[2] = Utils.getNoNil(y, 0);
  20.         instance.translationPart.minTrans[3] = Utils.getNoNil(z, 0);
  21.         x, y, z = Utils.getVectorFromString(getXMLString(xmlFile, "vehicle.translationPart#maxTrans" ));
  22.         instance.translationPart.maxTrans = {};
  23.         instance.translationPart.maxTrans[1] = Utils.getNoNil(x, 0);
  24.         instance.translationPart.maxTrans[2] = Utils.getNoNil(y, 0);
  25.         instance.translationPart.maxTrans[3] = Utils.getNoNil(z, 0);
  26.         instance.translationPart.transTime = Utils.getNoNil(getXMLString(xmlFile, "vehicle.translationPart#transTime" ), 2)*1000;
  27.         instance.translationPart.touchTransLimit = Utils.getNoNil(getXMLString(xmlFile, "vehicle.translationPart#touchTransLimit" ), 10);
  28.     end;
  29.     local translationPartNode2 = Utils.indexToObject(instance.rootNode, getXMLString(xmlFile, "vehicle.translationPart2#index" ));
  30.     if translationPartNode2 ~= nil then
  31.         instance.translationPart2 = {};
  32.         instance.translationPart2.node = translationPartNode2;
  33.         local x, y, z = Utils.getVectorFromString(getXMLString(xmlFile, "vehicle.translationPart2#minTrans" ));
  34.         instance.translationPart2.minTrans = {};
  35.         instance.translationPart2.minTrans[1] = Utils.getNoNil(x, 0);
  36.         instance.translationPart2.minTrans[2] = Utils.getNoNil(y, 0);
  37.         instance.translationPart2.minTrans[3] = Utils.getNoNil(z, 0);
  38.         x, y, z = Utils.getVectorFromString(getXMLString(xmlFile, "vehicle.translationPart2#maxTrans" ));
  39.         instance.translationPart2.maxTrans = {};
  40.         instance.translationPart2.maxTrans[1] = Utils.getNoNil(x, 0);
  41.         instance.translationPart2.maxTrans[2] = Utils.getNoNil(y, 0);
  42.         instance.translationPart2.maxTrans[3] = Utils.getNoNil(z, 0);
  43.         instance.translationPart2.transTime = Utils.getNoNil(getXMLString(xmlFile, "vehicle.translationPart2#transTime" ), 2)*1000;
  44.         instance.translationPart2.touchTransLimit = Utils.getNoNil(getXMLString(xmlFile, "vehicle.translationPart2#touchTransLimit" ), 10);
  45.     end;
  46.     delete(xmlFile);
  47.     instance.hasGroundContact = false;
  48.     instance.translationMin = false;
  49.     instance.translationMin2 = false;
  50.    
  51.     return instance;
  52. end;
  53. function Palettengabel:delete()
  54.     removeContactReport(self.rootNode);
  55.     Implement.delete(self);
  56. end;
  57. function Palettengabel:mouseEvent(posX, posY, isDown, isUp, button)
  58.     Implement.mouseEvent(self, posX, posY, isDown, isUp, button);
  59. end;
  60. function Palettengabel:keyEvent(unicode, sym, modifier, isDown)
  61.     Implement.keyEvent(self, unicode, sym, modifier, isDown);
  62. if sym == Input.KEY_KP_1 then
  63.  print("test1" )
  64.  self.translationMax = isDown;
  65.  self.translationMax2 = isDown;
  66. end;
  67. if sym == Input.KEY_KP_2 then
  68.  print("test2" )
  69.  self.translationMin = isDown;
  70.  self.translationMin2 = isDown;
  71. end;
  72. end;
  73. function Palettengabel:update(dt)
  74.     if self.isAttached then
  75.         if InputBinding.hasEvent(InputBinding.IMPLEMENT_EXTRA) then
  76.   print("test3" )
  77.             self.translationMax = not self.translationMax;
  78.   self.translationMax2 = not self.translationMax2;
  79.         end;
  80.     end;
  81. local doTranslate = self.translationMax or self.translationMin
  82.     if self.translationPart ~= nil and doTranslate then
  83.         local x, y, z = getTranslation(self.translationPart.node);
  84.         local trans = {x,y,z};
  85.         local newTrans = Utils.getMovedLimitedValues(trans, self.translationPart.maxTrans, self.translationPart.minTrans, 3, self.translationPart.transTime, dt, not self.translationMax);
  86.         setTranslation(self.translationPart.node, unpack(newTrans));
  87.     end;
  88.     local doTranslate = self.translationMax2 or self.translationMin2
  89.     if self.translationPart2 ~= nil and doTranslate then
  90.         local x, y, z = getTranslation(self.translationPart2.node);
  91.         local trans = {x,y,z};
  92.         local newTrans = Utils.getMovedLimitedValues(trans, self.translationPart2.maxTrans, self.translationPart2.minTrans, 3, self.translationPart2.transTime, dt, not self.translationMax2);
  93.         setTranslation(self.translationPart2.node, unpack(newTrans));
  94.     end;
  95.     Implement.update(self, dt);
  96. end;
  97. function Palettengabel:draw()
  98. Implement.draw(self);
  99.  
  100. end;
  101. function Palettengabel:onAttach(attacherVehicle)
  102.     Implement.onAttach(self, attacherVehicle);
  103. end;
  104. function Palettengabel:onDetach()
  105.     Implement.onDetach(self);
  106. end;


 
 
Je suis tout à fait conscient que se plonger dans le code d'un autre n'est pas évident... J'ai tenté plusieurs manipulations mais vu mes connaissances très limitées dans le domaine, je ne suis pas parvenu à grand chose... :/
 
J'espère donc obtenir un peu d'aide de votre part. N'hésitez pas à poser la moindre question...
 
Un tout grand merci pour votre aide, et toutes mes excuses à celui qui se verra énervé par ce post (;)).
 
Endeavour

Reply

Marsh Posté le 21-08-2008 à 11:16:45   

Reply

Marsh Posté le 21-08-2008 à 12:58:18    

Peut-être dois je montrer un peu de volonté de mon coté... ? :)
 
Après avoir analysé et tenté de comprendre le code, j'ai "isolé" un bloc de code du deuxième script qui semble reprendre toute l'action de " translation"
 
Le voici :
 

Code :
  1. # local translationPartNode = Utils.indexToObject(instance.rootNode, getXMLString(xmlFile, "vehicle.translationPart#index" ));
  2. #     if translationPartNode ~= nil then
  3. #         instance.translationPart = {};
  4. #         instance.translationPart.node = translationPartNode;
  5. #         local x, y, z = Utils.getVectorFromString(getXMLString(xmlFile, "vehicle.translationPart#minTrans" ));
  6. #         instance.translationPart.minTrans = {};
  7. #         instance.translationPart.minTrans[1] = Utils.getNoNil(x, 0);
  8. #         instance.translationPart.minTrans[2] = Utils.getNoNil(y, 0);
  9. #         instance.translationPart.minTrans[3] = Utils.getNoNil(z, 0);
  10. #
  11. #         x, y, z = Utils.getVectorFromString(getXMLString(xmlFile, "vehicle.translationPart#maxTrans" ));
  12. #         instance.translationPart.maxTrans = {};
  13. #         instance.translationPart.maxTrans[1] = Utils.getNoNil(x, 0);
  14. #         instance.translationPart.maxTrans[2] = Utils.getNoNil(y, 0);
  15. #         instance.translationPart.maxTrans[3] = Utils.getNoNil(z, 0);
  16. #
  17. #         instance.translationPart.transTime = Utils.getNoNil(getXMLString(xmlFile, "vehicle.translationPart#transTime" ), 2)*1000;
  18. #         instance.translationPart.touchTransLimit = Utils.getNoNil(getXMLString(xmlFile, "vehicle.translationPart#touchTransLimit" ), 10);
  19. #     end;
  20. #     local translationPartNode2 = Utils.indexToObject(instance.rootNode, getXMLString(xmlFile, "vehicle.translationPart2#index" ));
  21. #     if translationPartNode2 ~= nil then
  22. #         instance.translationPart2 = {};
  23. #         instance.translationPart2.node = translationPartNode2;
  24. #         local x, y, z = Utils.getVectorFromString(getXMLString(xmlFile, "vehicle.translationPart2#minTrans" ));
  25. #         instance.translationPart2.minTrans = {};
  26. #         instance.translationPart2.minTrans[1] = Utils.getNoNil(x, 0);
  27. #         instance.translationPart2.minTrans[2] = Utils.getNoNil(y, 0);
  28. #         instance.translationPart2.minTrans[3] = Utils.getNoNil(z, 0);
  29. #
  30. #         x, y, z = Utils.getVectorFromString(getXMLString(xmlFile, "vehicle.translationPart2#maxTrans" ));
  31. #         instance.translationPart2.maxTrans = {};
  32. #         instance.translationPart2.maxTrans[1] = Utils.getNoNil(x, 0);
  33. #         instance.translationPart2.maxTrans[2] = Utils.getNoNil(y, 0);
  34. #         instance.translationPart2.maxTrans[3] = Utils.getNoNil(z, 0);
  35. #
  36. #         instance.translationPart2.transTime = Utils.getNoNil(getXMLString(xmlFile, "vehicle.translationPart2#transTime" ), 2)*1000;
  37. #         instance.translationPart2.touchTransLimit = Utils.getNoNil(getXMLString(xmlFile, "vehicle.translationPart2#touchTransLimit" ), 10);
  38. #     end;
  39. #     delete(xmlFile);
  40. #
  41. #     instance.hasGroundContact = false;
  42. #     instance.translationMin = false;
  43. #     instance.translationMin2 = false;
  44. #   
  45. #     return instance;
  46. # end;
  47. #
  48. # function Palettengabel:delete()
  49. #     removeContactReport(self.rootNode);
  50. #     Implement.delete(self);
  51. # end;
  52. #
  53. # function Palettengabel:mouseEvent(posX, posY, isDown, isUp, button)
  54. #     Implement.mouseEvent(self, posX, posY, isDown, isUp, button);
  55. # end;
  56. #
  57. #
  58. # function Palettengabel:keyEvent(unicode, sym, modifier, isDown)
  59. #     Implement.keyEvent(self, unicode, sym, modifier, isDown);
  60. # if sym == Input.KEY_KP_1 then
  61. #  print("test1" )
  62. #  self.translationMax = isDown;
  63. #  self.translationMax2 = isDown;
  64. # end;
  65. # if sym == Input.KEY_KP_2 then
  66. #  print("test2" )
  67. #  self.translationMin = isDown;
  68. #  self.translationMin2 = isDown;
  69. # end;
  70. #
  71. # end;
  72. #
  73. # function Palettengabel:update(dt)
  74. #
  75. #     if self.isAttached then
  76. #         if InputBinding.hasEvent(InputBinding.IMPLEMENT_EXTRA) then
  77. #   print("test3" )
  78. #             self.translationMax = not self.translationMax;
  79. #   self.translationMax2 = not self.translationMax2;
  80. #         end;
  81. #     end;
  82. #
  83. # local doTranslate = self.translationMax or self.translationMin
  84. #     if self.translationPart ~= nil and doTranslate then
  85. #
  86. #         local x, y, z = getTranslation(self.translationPart.node);
  87. #         local trans = {x,y,z};
  88. #         local newTrans = Utils.getMovedLimitedValues(trans, self.translationPart.maxTrans, self.translationPart.minTrans, 3, self.translationPart.transTime, dt, not self.translationMax);
  89. #         setTranslation(self.translationPart.node, unpack(newTrans));
  90. #     end;
  91. #     local doTranslate = self.translationMax2 or self.translationMin2
  92. #     if self.translationPart2 ~= nil and doTranslate then
  93. #
  94. #         local x, y, z = getTranslation(self.translationPart2.node);
  95. #         local trans = {x,y,z};
  96. #         local newTrans = Utils.getMovedLimitedValues(trans, self.translationPart2.maxTrans, self.translationPart2.minTrans, 3, self.translationPart2.transTime, dt, not self.translationMax2);
  97. #         setTranslation(self.translationPart2.node, unpack(newTrans));
  98. #     end;


 
C'est donc, si j'ai bien compris, ce que je dois tenter de glisser quelque part dans le premier gros script. Seul hic, j'ignore si les lignes qui suivent  
 

Code :
  1. #     Implement.update(self, dt);
  2. # end;
  3. #
  4. # function Palettengabel:draw()
  5. # Implement.draw(self);
  6. # end;
  7. #
  8. # function Palettengabel:onAttach(attacherVehicle)
  9. #     Implement.onAttach(self, attacherVehicle);
  10. # end;
  11. #
  12. # function Palettengabel:onDetach()
  13. #     Implement.onDetach(self);
  14. # end;


 
sont importantes dans ce cas ?
 
Et surtout, j'ignore coller ce bout de code parlant de translation... :/
 
Puis je espérer de l'aide pour cette partie ?
 
Merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed