Endeavour | 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 :
- Frontlader = {}
- function Frontlader:new(configFile, positionX, offsetY, positionZ, rotationY, customMt)
- if Frontlader_mt == nil then
- Frontlader_mt = Class(Frontlader, Vehicle);
- end;
-
- local mt = customMt;
- if mt == nil then
- mt = Frontlader_mt;
- end;
-
- local instance = Vehicle:new(configFile, positionX, offsetY, positionZ, rotationY, mt);
- local xmlFile = loadXMLFile("TempConfig", configFile);
- local jointDesc = {};
- jointDesc.jointTransform = Utils.indexToObject(instance.rootNode, getXMLString(xmlFile, "vehicle.frontLoaderJoint#index" ));
- if jointDesc.jointTransform ~= nil then
- jointDesc.rotationNode = Utils.indexToObject(instance.rootNode, getXMLString(xmlFile, "vehicle.frontLoaderJoint#rotationNode" ));
- if jointDesc.rotationNode ~= nil then
- local x, y, z = Utils.getVectorFromString(getXMLString(xmlFile, "vehicle.frontLoaderJoint#maxRot" ));
- jointDesc.maxRot = {};
- jointDesc.maxRot[1] = Utils.degToRad(Utils.getNoNil(x, 0));
- jointDesc.maxRot[2] = Utils.degToRad(Utils.getNoNil(y, 0));
- jointDesc.maxRot[3] = Utils.degToRad(Utils.getNoNil(z, 0));
- x, y, z = getRotation(jointDesc.rotationNode);
- jointDesc.minRot = {x,y,z};
- end;
- jointDesc.rotationNode2 = Utils.indexToObject(instance.rootNode, getXMLString(xmlFile, "vehicle.frontLoaderJoint#rotationNode2" ));
- if jointDesc.rotationNode2 ~= nil then
- local x, y, z = Utils.getVectorFromString(getXMLString(xmlFile, "vehicle.frontLoaderJoint#maxRot2" ));
- jointDesc.maxRot2 = {};
- jointDesc.maxRot2[1] = Utils.degToRad(Utils.getNoNil(x, 0));
- jointDesc.maxRot2[2] = Utils.degToRad(Utils.getNoNil(y, 0));
- jointDesc.maxRot2[3] = Utils.degToRad(Utils.getNoNil(z, 0));
- x, y, z = getRotation(jointDesc.rotationNode2);
- jointDesc.minRot2 = {x,y,z};
- end;
-
- jointDesc.moveTime = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.frontLoaderJoint#moveTime" ), 0.5)*1000;
- jointDesc.moveTime2 = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.frontLoaderJoint#moveTime2" ), 0.5)*1000;
- jointDesc.moveDirection = 0; -- 1 = rotate up, -1 = rotate down
- jointDesc.moveDirection2 = 0;
- jointDesc.jointIndex = 0;
- end;
- instance.frontLoaderJointDesc = jointDesc;
- instance.frontLoaderAttachedObject = nil;
-
- delete(xmlFile);
- return instance;
- end;
- function Frontlader:keyEvent(unicode, sym, modifier, isDown)
- Frontlader:superClass().keyEvent(self, unicode, sym, modifier, isDown);
- if self.frontLoaderAttachedObject ~= nil then
- self.frontLoaderAttachedObject:keyEvent(unicode, sym, modifier, isDown)
- end;
- local jointDesc = self.frontLoaderJointDesc;
- if sym == Input.KEY_KP_8 or sym == Input.KEY_KP_5 then
- jointDesc.moveDirection2 = 0;
- if isDown then
- if sym == Input.KEY_KP_5 then
- jointDesc.moveDirection2 = 1;
- elseif sym == Input.KEY_KP_8 then
- jointDesc.moveDirection2 = -1;
- end;
- end;
- end;
- if sym == Input.KEY_KP_4 or sym == Input.KEY_KP_7 then
- jointDesc.moveDirection = 0;
- if isDown then
- if sym == Input.KEY_KP_7 then
- jointDesc.moveDirection = 1;
- elseif sym == Input.KEY_KP_4 then
- jointDesc.moveDirection = -1;
- end;
- end;
- end;
- if isDown and sym == Input.KEY_KP_0 then
- if self.frontLoaderAttachedObject ~= nil then
- -- detach attachable
- self.frontLoaderAttachedObject:onDeselect();
- self.frontLoaderAttachedObject:onDetach();
- removeJoint(jointDesc.jointIndex);
- jointDesc.jointIndex = 0;
- self.frontLoaderAttachedObject = nil;
- else
- local attachableInRange = self:frontLoaderAttachableInRange();
- if attachableInRange ~= nil then
- -- attach
- local implement = {};
- self.frontLoaderAttachedObject = attachableInRange;
- self.frontLoaderAttachedObject:onAttach(self);
- self.frontLoaderAttachedObject:onSelect();
- local constr = JointConstructor:new();
- constr:setActors(self.rootNode, attachableInRange.rootNode);
- constr:setJointTransforms(jointDesc.jointTransform, attachableInRange.attacherJoint);
- for i=1, 3 do
- constr:setRotationLimit(i-1, 0, 0);
- constr:setTranslationLimit(i-1, true, 0, 0);
- end;
- jointDesc.jointIndex = constr:finalize();
- jointDesc.moveDirection = 0;
- jointDesc.moveDirection2 = 0;
- end;
- end;
- end;
- end;
- function Frontlader:update(dt)
- Frontlader:superClass().update(self, dt);
- if self.frontLoaderAttachedObject ~= nil then
- self.frontLoaderAttachedObject:update(dt);
- end;
- local jointDesc = self.frontLoaderJointDesc;
- local jointFrameInvalid = false;
- if jointDesc.rotationNode ~= nil then
- if jointDesc.moveDirection ~= 0 then
- local x, y, z = getRotation(jointDesc.rotationNode);
- local rot = {x,y,z};
- local newRot = Utils.getMovedLimitedValues(rot, jointDesc.maxRot, jointDesc.minRot, 3, jointDesc.moveTime, dt, jointDesc.moveDirection == 1);
- setRotation(jointDesc.rotationNode, unpack(newRot));
- for i=1, 3 do
- if math.abs(newRot[i] - rot[i]) > 0.001 then
- jointFrameInvalid = true;
- end;
- end;
- end;
- end;
- if jointDesc.rotationNode2 ~= nil then
- if jointDesc.moveDirection2 ~= 0 then
- local x, y, z = getRotation(jointDesc.rotationNode2);
- local rot = {x,y,z};
- local newRot = Utils.getMovedLimitedValues(rot, jointDesc.maxRot2, jointDesc.minRot2, 3, jointDesc.moveTime2, dt, jointDesc.moveDirection2 == 1);
- setRotation(jointDesc.rotationNode2, unpack(newRot));
- for i=1, 3 do
- if math.abs(newRot[i] - rot[i]) > 0.001 then
- jointFrameInvalid = true;
- end;
- end;
- end;
- end;
- if jointFrameInvalid and jointDesc.jointIndex ~= 0 then
- setJointFrame(jointDesc.jointIndex, 0, jointDesc.jointTransform);
- end;
- end;
- function Frontlader:frontLoaderAttachableInRange()
- local nearestAttachable = nil;
- if self.isEntered ~= nil then
- local nearestDistance = 1.0;
- local jointDesc = self.frontLoaderJointDesc;
- local px, py, pz = getWorldTranslation(jointDesc.jointTransform);
- for i=1, table.getn(g_currentMission.attachables) do
- if not g_currentMission.attachables[i].isAttached then
- local vx, vy, vz = getWorldTranslation(g_currentMission.attachables[i].attacherJoint);
- local distance = Utils.vector3Length(px-vx, py-vy, pz-vz);
- if distance < nearestDistance then
- nearestAttachable = g_currentMission.attachables[i];
- nearestDistance = distance;
- end;
- end;
- end;
- end;
- return nearestAttachable;
- end;
|
Y.lua :
Code :
- Palettengabel = {};
- function Palettengabel:new(configFile, positionX, offsetY, positionZ, rotationY, customMt)
- if Palettengabel_mt == nil then
- Palettengabel_mt = Class(Palettengabel, Implement);
- end;
- local mt = customMt;
- if mt == nil then
- mt = Palettengabel_mt;
- end;
- local instance = Implement:new(configFile, positionX, offsetY, positionZ, rotationY, mt);
- local xmlFile = loadXMLFile("TempConfig", configFile);
- local translationPartNode = Utils.indexToObject(instance.rootNode, getXMLString(xmlFile, "vehicle.translationPart#index" ));
- if translationPartNode ~= nil then
- instance.translationPart = {};
- instance.translationPart.node = translationPartNode;
- local x, y, z = Utils.getVectorFromString(getXMLString(xmlFile, "vehicle.translationPart#minTrans" ));
- instance.translationPart.minTrans = {};
- instance.translationPart.minTrans[1] = Utils.getNoNil(x, 0);
- instance.translationPart.minTrans[2] = Utils.getNoNil(y, 0);
- instance.translationPart.minTrans[3] = Utils.getNoNil(z, 0);
- x, y, z = Utils.getVectorFromString(getXMLString(xmlFile, "vehicle.translationPart#maxTrans" ));
- instance.translationPart.maxTrans = {};
- instance.translationPart.maxTrans[1] = Utils.getNoNil(x, 0);
- instance.translationPart.maxTrans[2] = Utils.getNoNil(y, 0);
- instance.translationPart.maxTrans[3] = Utils.getNoNil(z, 0);
- instance.translationPart.transTime = Utils.getNoNil(getXMLString(xmlFile, "vehicle.translationPart#transTime" ), 2)*1000;
- instance.translationPart.touchTransLimit = Utils.getNoNil(getXMLString(xmlFile, "vehicle.translationPart#touchTransLimit" ), 10);
- end;
- local translationPartNode2 = Utils.indexToObject(instance.rootNode, getXMLString(xmlFile, "vehicle.translationPart2#index" ));
- if translationPartNode2 ~= nil then
- instance.translationPart2 = {};
- instance.translationPart2.node = translationPartNode2;
- local x, y, z = Utils.getVectorFromString(getXMLString(xmlFile, "vehicle.translationPart2#minTrans" ));
- instance.translationPart2.minTrans = {};
- instance.translationPart2.minTrans[1] = Utils.getNoNil(x, 0);
- instance.translationPart2.minTrans[2] = Utils.getNoNil(y, 0);
- instance.translationPart2.minTrans[3] = Utils.getNoNil(z, 0);
- x, y, z = Utils.getVectorFromString(getXMLString(xmlFile, "vehicle.translationPart2#maxTrans" ));
- instance.translationPart2.maxTrans = {};
- instance.translationPart2.maxTrans[1] = Utils.getNoNil(x, 0);
- instance.translationPart2.maxTrans[2] = Utils.getNoNil(y, 0);
- instance.translationPart2.maxTrans[3] = Utils.getNoNil(z, 0);
- instance.translationPart2.transTime = Utils.getNoNil(getXMLString(xmlFile, "vehicle.translationPart2#transTime" ), 2)*1000;
- instance.translationPart2.touchTransLimit = Utils.getNoNil(getXMLString(xmlFile, "vehicle.translationPart2#touchTransLimit" ), 10);
- end;
- delete(xmlFile);
- instance.hasGroundContact = false;
- instance.translationMin = false;
- instance.translationMin2 = false;
-
- return instance;
- end;
- function Palettengabel:delete()
- removeContactReport(self.rootNode);
- Implement.delete(self);
- end;
- function Palettengabel:mouseEvent(posX, posY, isDown, isUp, button)
- Implement.mouseEvent(self, posX, posY, isDown, isUp, button);
- end;
- function Palettengabel:keyEvent(unicode, sym, modifier, isDown)
- Implement.keyEvent(self, unicode, sym, modifier, isDown);
- if sym == Input.KEY_KP_1 then
- print("test1" )
- self.translationMax = isDown;
- self.translationMax2 = isDown;
- end;
- if sym == Input.KEY_KP_2 then
- print("test2" )
- self.translationMin = isDown;
- self.translationMin2 = isDown;
- end;
- end;
- function Palettengabel:update(dt)
- if self.isAttached then
- if InputBinding.hasEvent(InputBinding.IMPLEMENT_EXTRA) then
- print("test3" )
- self.translationMax = not self.translationMax;
- self.translationMax2 = not self.translationMax2;
- end;
- end;
- local doTranslate = self.translationMax or self.translationMin
- if self.translationPart ~= nil and doTranslate then
- local x, y, z = getTranslation(self.translationPart.node);
- local trans = {x,y,z};
- local newTrans = Utils.getMovedLimitedValues(trans, self.translationPart.maxTrans, self.translationPart.minTrans, 3, self.translationPart.transTime, dt, not self.translationMax);
- setTranslation(self.translationPart.node, unpack(newTrans));
- end;
- local doTranslate = self.translationMax2 or self.translationMin2
- if self.translationPart2 ~= nil and doTranslate then
- local x, y, z = getTranslation(self.translationPart2.node);
- local trans = {x,y,z};
- local newTrans = Utils.getMovedLimitedValues(trans, self.translationPart2.maxTrans, self.translationPart2.minTrans, 3, self.translationPart2.transTime, dt, not self.translationMax2);
- setTranslation(self.translationPart2.node, unpack(newTrans));
- end;
- Implement.update(self, dt);
- end;
- function Palettengabel:draw()
- Implement.draw(self);
-
- end;
- function Palettengabel:onAttach(attacherVehicle)
- Implement.onAttach(self, attacherVehicle);
- end;
- function Palettengabel:onDetach()
- Implement.onDetach(self);
- 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 |