Les Royaumes de Feu D'après l'œuvre de Tui T. Sutherland |
| | Programmation IA en LUA | |
| | Auteur | Message |
---|
Yurising membre
Médailles : Émeraudes : 76 Messages : 50 Date d'inscription : 24/09/2016 Age : 24 Localisation : Sous l'océaannnnn
Description du dragon Race: Aile du Ciel Avertissement: (0/0) Bannissement: (0/0)
| Sujet: Programmation IA en LUA Mar 1 Nov - 19:45 | |
| Salut tout le monde! Comme mes projets de programmation sont en avance, j'ai réussi a libéré un peu de temps de codage. Et vu que la section programmation et vide, je me lance! Je vais donc vous présenté une Intelligence artificielle, l'une des plus simple.
Je suis pas trés fort en explications alors je vais faire le mieux possible. Et si vous comprenez rien c'est normal.
Bon pour commencer il vous faut: -Un éditeur LUA. -Un compilateur LUA.
Bon allons-y pour le code, le voici attention les yeux:
local CurrentPart = nil local MaxInc = 18
function onTouched(hit) if hit.Parent == nil then return end
local humanoid = hit.Parent:findFirstChild("Humanoid")
if humanoid == nil then CurrentPart = hit end end
function waitForChild(parent, childName) local child = parent:findFirstChild(childName)
if child then return child end
while true do print(childName)
child = parent.ChildAdded:wait()
if child.Name==childName then return child end end end
local Figure = script.Parent local Humanoid = waitForChild(Figure, "Humanoid") local Torso = waitForChild(Figure, "Torso") local Left = waitForChild(Figure, "Left Leg") local Right = waitForChild(Figure, "Right Leg")
Humanoid.Jump = true
Left.Touched:connect(onTouched) Right.Touched:connect(onTouched)
while true do wait(math.random(2, 6))
if CurrentPart ~= nil then if math.random(1, 2) == 1 then Humanoid.Jump = true end
Humanoid:MoveTo(Torso.Position + Vector3.new(math.random(-MaxInc, MaxInc), 0, math.random(-MaxInc, MaxInc)), CurrentPart) end end
Alors, allons-y point par point. Les premieres lignes servent a définir l'entité en valeur nul (nil en LUA lorsque aucune valeur n'est appliqué). Ensuite a partir de WaitForChild c'est le chargement de l'entité et des scripts suplémentaires (type animations, ect.). La partie local ... c'est le chargement du "corps de l'entité" (Left = bras gauche, ect.) Humanoid.Jump = true, sa, c'est pour autorisé l'IA a éffectué des sauts. wait défini l'attente entre chaque mouvement, ici entre 2 et 6 secondes Le reste permet a votre personnage de se mouvoir selon une distance aléatoire.
VOila c'etait juste histoire de vous présenté sa. | |
| | | DraVanos (braise) Ancien
Médailles :
Émeraudes : 514 Messages : 1292 Date d'inscription : 16/09/2016 Age : 22 Localisation : Somewhere
Description du dragon Race: Aile des morts Avertissement: (0/0) Bannissement: (0/0)
| Sujet: Re: Programmation IA en LUA Mer 2 Nov - 10:29 | |
| très bien j'ai tout compris (pas dutout j'ai compris end et wait seulement) breffffff toi on va t'engagé dans le fofo il nous faut des programateur et codeur bien sur récif y travaille mais entre le system de combat équilibré a faire et le fofo a géré on galère alors un codeur ne serai pas de refut^^ | |
| | | Yurising membre
Médailles : Émeraudes : 76 Messages : 50 Date d'inscription : 24/09/2016 Age : 24 Localisation : Sous l'océaannnnn
Description du dragon Race: Aile du Ciel Avertissement: (0/0) Bannissement: (0/0)
| Sujet: Re: Programmation IA en LUA Mer 2 Nov - 11:00 | |
| Le probléme c'est que comme je l'ai dit, je suis pas mal occupé niveau programmation.
Je bosse sur des jeux (2 en ce moment meme) et je m'occupe d'un site, sans oublié les mods Prison architect, Arma 3 et les gestions de multiples serveurs, je suis serré.
Pour les plus courageux voici comment on programme un dragon:
function waitForChild(parent, childName) local child = parent:findFirstChild(childName) if child then return child end while true do child = parent.ChildAdded:wait() if child.Name==childName then return child end end end
local Figure = script.Parent local Torso = waitForChild(Figure, "Torso") local RightShoulder = waitForChild(Torso, "Right Shoulder") local LeftShoulder = waitForChild(Torso, "Left Shoulder") local RightHip = waitForChild(Torso, "Right Hip") local LeftHip = waitForChild(Torso, "Left Hip") local Neck = waitForChild(Torso, "Neck") local Humanoid = waitForChild(Figure, "Humanoid") local pose = "Standing"
local currentAnim = "" local currentAnimTrack = nil local currentAnimKeyframeHandler = nil local currentAnimSpeed = 1.0 local animTable = {} local animNames = { idle = { { id = "[EXPURGED]", weight = 9 }, { id = "[EXPURGED]", weight = 1 } }, walk = { { id = "[EXPURGED]", weight = 10 } }, run = { { id = "run.xml", weight = 10 } }, jump = { { id = "[EXPURGED]", weight = 10 } }, fall = { { id = "[EXPURGED]", weight = 10 } }, climb = { { id = "[EXPURGED]", weight = 10 } }, toolnone = { { id = "[EXPURGED]", weight = 10 } }, toolslash = { { id = "[EXPURGED]", weight = 10 } -- { id = "slash.xml", weight = 10 } }, toollunge = { { id = "[EXPURGED]", weight = 10 } }, wave = { { id = "[EXPURGED]", weight = 10 } }, point = { { id = "[EXPURGED]", weight = 10 } }, dance = { { id = "[EXPURGED]", weight = 10 }, { id = "[EXPURGED]", weight = 10 }, { id = "[EXPURGED]", weight = 10 } }, dance2 = { { id = "[EXPURGED]", weight = 10 }, { id = "[EXPURGED]", weight = 10 }, { id = "[EXPURGED]", weight = 10 } }, dance3 = { { id = "[EXPURGED]", weight = 10 }, { id = "[EXPURGED]", weight = 10 }, { id = "[EXPURGED]", weight = 10 } }, laugh = { { id = "[EXPURGED]", weight = 10 } }, cheer = { { id = "[EXPURGED]", weight = 10 } }, }
-- Existance in this list signifies that it is an emote, the value indicates if it is a looping emote local emoteNames = { wave = false, point = false, dance = true, dance2 = true, dance3 = true, laugh = false, cheer = false}
math.randomseed(tick())
function configureAnimationSet(name, fileList) if (animTable[name] ~= nil) then for _, connection in pairs(animTable[name].connections) do connection:disconnect() end end animTable[name] = {} animTable[name].count = 0 animTable[name].totalWeight = 0 animTable[name].connections = {}
-- check for config values local config = script:FindFirstChild(name) if (config ~= nil) then -- print("Loading anims " .. name) table.insert(animTable[name].connections, config.ChildAdded:connect(function(child) configureAnimationSet(name, fileList) end)) table.insert(animTable[name].connections, config.ChildRemoved:connect(function(child) configureAnimationSet(name, fileList) end)) local idx = 1 for _, childPart in pairs(config:GetChildren()) do if (childPart:IsA("Animation")) then table.insert(animTable[name].connections, childPart.Changed:connect(function(property) configureAnimationSet(name, fileList) end)) animTable[name][idx] = {} animTable[name][idx].anim = childPart local weightObject = childPart:FindFirstChild("Weight") if (weightObject == nil) then animTable[name][idx].weight = 1 else animTable[name][idx].weight = weightObject.Value end animTable[name].count = animTable[name].count + 1 animTable[name].totalWeight = animTable[name].totalWeight + animTable[name][idx].weight -- print(name .. " [" .. idx .. "] " .. animTable[name][idx].anim.AnimationId .. " (" .. animTable[name][idx].weight .. ")") idx = idx + 1 end end end
-- fallback to defaults if (animTable[name].count <= 0) then for idx, anim in pairs(fileList) do animTable[name][idx] = {} animTable[name][idx].anim = Instance.new("Animation") animTable[name][idx].anim.Name = name animTable[name][idx].anim.AnimationId = anim.id animTable[name][idx].weight = anim.weight animTable[name].count = animTable[name].count + 1 animTable[name].totalWeight = animTable[name].totalWeight + anim.weight -- print(name .. " [" .. idx .. "] " .. anim.id .. " (" .. anim.weight .. ")") end end end
-- Setup animation objects function scriptChildModified(child) local fileList = animNames[child.Name] if (fileList ~= nil) then configureAnimationSet(child.Name, fileList) end end
script.ChildAdded:connect(scriptChildModified) script.ChildRemoved:connect(scriptChildModified)
for name, fileList in pairs(animNames) do configureAnimationSet(name, fileList) end
-- ANIMATION
-- declarations local toolAnim = "None" local toolAnimTime = 0
local jumpAnimTime = 0 local jumpAnimDuration = 0.3
local toolTransitionTime = 0.1 local fallTransitionTime = 0.3 local jumpMaxLimbVelocity = 0.75
-- functions
function stopAllAnimations() local oldAnim = currentAnim
-- return to idle if finishing an emote if (emoteNames[oldAnim] ~= nil and emoteNames[oldAnim] == false) then oldAnim = "idle" end
currentAnim = "" if (currentAnimKeyframeHandler ~= nil) then currentAnimKeyframeHandler:disconnect() end
if (currentAnimTrack ~= nil) then currentAnimTrack:Stop() currentAnimTrack:Destroy() currentAnimTrack = nil end return oldAnim end
function setAnimationSpeed(speed) if speed ~= currentAnimSpeed then currentAnimSpeed = speed currentAnimTrack:AdjustSpeed(currentAnimSpeed) end end
function keyFrameReachedFunc(frameName) if (frameName == "End") then -- print("Keyframe : ".. frameName) local repeatAnim = stopAllAnimations() local animSpeed = currentAnimSpeed playAnimation(repeatAnim, 0.0, Humanoid) setAnimationSpeed(animSpeed) end end
-- Preload animations function playAnimation(animName, transitionTime, humanoid) local idleFromEmote = (animName == "idle" and emoteNames[currentAnim] ~= nil) if (animName ~= currentAnim and not idleFromEmote) then if (currentAnimTrack ~= nil) then currentAnimTrack:Stop(transitionTime) currentAnimTrack:Destroy() end
currentAnimSpeed = 1.0 local roll = math.random(1, animTable[animName].totalWeight) local origRoll = roll local idx = 1 while (roll > animTable[animName][idx].weight) do roll = roll - animTable[animName][idx].weight idx = idx + 1 end -- print(animName .. " " .. idx .. " [" .. origRoll .. "]") local anim = animTable[animName][idx].anim
-- load it to the humanoid; get AnimationTrack currentAnimTrack = humanoid:LoadAnimation(anim) -- play the animation currentAnimTrack:Play(transitionTime) currentAnim = animName
-- set up keyframe name triggers if (currentAnimKeyframeHandler ~= nil) then currentAnimKeyframeHandler:disconnect() end currentAnimKeyframeHandler = currentAnimTrack.KeyframeReached:connect(keyFrameReachedFunc) end end
------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------
local toolAnimName = "" local toolAnimTrack = nil local currentToolAnimKeyframeHandler = nil
function toolKeyFrameReachedFunc(frameName) if (frameName == "End") then -- print("Keyframe : ".. frameName) local repeatAnim = stopToolAnimations() playToolAnimation(repeatAnim, 0.0, Humanoid) end end
function playToolAnimation(animName, transitionTime, humanoid) if (animName ~= toolAnimName) then if (toolAnimTrack ~= nil) then toolAnimTrack:Stop() toolAnimTrack:Destroy() transitionTime = 0 end
local roll = math.random(1, animTable[animName].totalWeight) local origRoll = roll local idx = 1 while (roll > animTable[animName][idx].weight) do roll = roll - animTable[animName][idx].weight idx = idx + 1 end -- print(animName .. " * " .. idx .. " [" .. origRoll .. "]") local anim = animTable[animName][idx].anim
-- load it to the humanoid; get AnimationTrack toolAnimTrack = humanoid:LoadAnimation(anim) -- play the animation toolAnimTrack:Play(transitionTime) toolAnimName = animName
currentToolAnimKeyframeHandler = toolAnimTrack.KeyframeReached:connect(toolKeyFrameReachedFunc) end end
function stopToolAnimations() local oldAnim = toolAnimName
if (currentToolAnimKeyframeHandler ~= nil) then currentToolAnimKeyframeHandler:disconnect() end
toolAnimName = "" if (toolAnimTrack ~= nil) then toolAnimTrack:Stop() toolAnimTrack:Destroy() toolAnimTrack = nil end
return oldAnim end
------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------
function onRunning(speed) if speed>0.01 then playAnimation("walk", 0.1, Humanoid) pose = "Running" else playAnimation("idle", 0.1, Humanoid) pose = "Standing" end end
function onDied() pose = "Dead" end
function onJumping() playAnimation("jump", 0.1, Humanoid) jumpAnimTime = jumpAnimDuration pose = "Jumping" end
function onClimbing(speed) playAnimation("climb", 0.1, Humanoid) setAnimationSpeed(speed / 12.0) pose = "Climbing" end
function onGettingUp() pose = "GettingUp" end
function onFreeFall() if (jumpAnimTime <= 0) then playAnimation("fall", fallTransitionTime, Humanoid) end pose = "FreeFall" end
function onFallingDown() pose = "FallingDown" end
function onSeated() pose = "Seated" end
function onPlatformStanding() pose = "PlatformStanding" end
function onSwimming(speed) if speed>0 then pose = "Running" else pose = "Standing" end end
function getTool() for _, kid in ipairs(Figure:GetChildren()) do if kid.className == "Tool" then return kid end end return nil end
function getToolAnim(tool) for _, c in ipairs(tool:GetChildren()) do if c.Name == "toolanim" and c.className == "StringValue" then return c end end return nil end
function animateTool() if (toolAnim == "None") then playToolAnimation("toolnone", toolTransitionTime, Humanoid) return end
if (toolAnim == "Slash") then playToolAnimation("toolslash", 0, Humanoid) return end
if (toolAnim == "Lunge") then playToolAnimation("toollunge", 0, Humanoid) return end end
function moveSit() RightShoulder.MaxVelocity = 0.15 LeftShoulder.MaxVelocity = 0.15 RightShoulder:SetDesiredAngle(3.14 /2) LeftShoulder:SetDesiredAngle(-3.14 /2) RightHip:SetDesiredAngle(3.14 /2) LeftHip:SetDesiredAngle(-3.14 /2) end
local lastTick = 0
function move(time) local amplitude = 1 local frequency = 1 local deltaTime = time - lastTick lastTick = time
local climbFudge = 0 local setAngles = false
if (jumpAnimTime > 0) then jumpAnimTime = jumpAnimTime - deltaTime end
if (pose == "FreeFall" and jumpAnimTime <= 0) then playAnimation("fall", fallTransitionTime, Humanoid) elseif (pose == "Seated") then stopAllAnimations() moveSit() return elseif (pose == "Running") then playAnimation("walk", 0.1, Humanoid) elseif (pose == "Dead" or pose == "GettingUp" or pose == "FallingDown" or pose == "Seated" or pose == "PlatformStanding") then -- print("Wha " .. pose) amplitude = 0.1 frequency = 1 setAngles = true end
if (setAngles) then desiredAngle = amplitude * math.sin(time * frequency)
RightShoulder:SetDesiredAngle(desiredAngle + climbFudge) LeftShoulder:SetDesiredAngle(desiredAngle - climbFudge) RightHip:SetDesiredAngle(-desiredAngle) LeftHip:SetDesiredAngle(-desiredAngle) end
-- Tool Animation handling local tool = getTool() if tool then animStringValueObject = getToolAnim(tool)
if animStringValueObject then toolAnim = animStringValueObject.Value -- message recieved, delete StringValue animStringValueObject.Parent = nil toolAnimTime = time + .3 end
if time > toolAnimTime then toolAnimTime = 0 toolAnim = "None" end
animateTool() else stopToolAnimations() toolAnim = "None" toolAnimTime = 0 end end
-- connect events Humanoid.Died:connect(onDied) Humanoid.Running:connect(onRunning) Humanoid.Jumping:connect(onJumping) Humanoid.Climbing:connect(onClimbing) Humanoid.GettingUp:connect(onGettingUp) Humanoid.FreeFalling:connect(onFreeFall) Humanoid.FallingDown:connect(onFallingDown) Humanoid.Seated:connect(onSeated) Humanoid.PlatformStanding:connect(onPlatformStanding) Humanoid.Swimming:connect(onSwimming)
-- main program
local runService = game:service("RunService");
-- initialize to idle playAnimation("idle", 0.1, Humanoid) pose = "Standing"
while Figure.Parent~=nil do local _, time = wait(0.1) move(time) end | |
| | | DraVanos (braise) Ancien
Médailles :
Émeraudes : 514 Messages : 1292 Date d'inscription : 16/09/2016 Age : 22 Localisation : Somewhere
Description du dragon Race: Aile des morts Avertissement: (0/0) Bannissement: (0/0)
| Sujet: Re: Programmation IA en LUA Mer 2 Nov - 11:27 | |
| ok fait nous signe bien que je pense que les codage a faire sont cour.
*N'a meme pas le courage de lire tout sa* OMG CES QUOI CE MONSTRE | |
| | | Recif Grand membre
Médailles : Émeraudes : 513 Messages : 685 Date d'inscription : 26/04/2016 Age : 28 Localisation : île isolée
Description du dragon Race: Aile de Mer Avertissement: (0/0) Bannissement: (0/0)
| Sujet: Re: Programmation IA en LUA Mer 2 Nov - 11:43 | |
| ( si je veux faire un simulateur de combat sur le fofo ? [ un peu à la pokemon ] nope braise c'est hard, je pense faire en javascript, mais il va me falloir passer du c++ au javascript (ils semblent se ressembler, ça devrais le faire) et j’espère juste que la poo y est possible >< ) | |
| | | Recif Grand membre
Médailles : Émeraudes : 513 Messages : 685 Date d'inscription : 26/04/2016 Age : 28 Localisation : île isolée
Description du dragon Race: Aile de Mer Avertissement: (0/0) Bannissement: (0/0)
| Sujet: Re: Programmation IA en LUA Mer 2 Nov - 11:45 | |
| ( mais les Ia sont sympas, je connais le Lua de nom seulement ) | |
| | | Recif Grand membre
Médailles : Émeraudes : 513 Messages : 685 Date d'inscription : 26/04/2016 Age : 28 Localisation : île isolée
Description du dragon Race: Aile de Mer Avertissement: (0/0) Bannissement: (0/0)
| Sujet: Re: Programmation IA en LUA Mer 2 Nov - 11:51 | |
| ( par contre, si je ne me trompe, tu fais appel à des variables et des fonctions présentes ailleurs dans ton programme non ? du coup je sais pas ce que ça fait >< [pardonne moi s'il s’agit de fonction et methodes présente de base dans le lua ou l'une de ses bibliothèque ><] ) | |
| | | Yurising membre
Médailles : Émeraudes : 76 Messages : 50 Date d'inscription : 24/09/2016 Age : 24 Localisation : Sous l'océaannnnn
Description du dragon Race: Aile du Ciel Avertissement: (0/0) Bannissement: (0/0)
| Sujet: Re: Programmation IA en LUA Jeu 3 Nov - 13:10 | |
| Exact. J'utilise des variables hors des bases du LUA. La raison principale a cela c'est pour faire appels a des animations pour le dragon.
A l'origine ce sont des scripts que j'avait utilisé pour mes premiers jeux. Je pourrait montré d'autres scripts que j'utilise dans mes jeux actuels, mais aprés plus personne comprendrait rien et en plus ce serait légérement hors contexte. | |
| | | Recif Grand membre
Médailles : Émeraudes : 513 Messages : 685 Date d'inscription : 26/04/2016 Age : 28 Localisation : île isolée
Description du dragon Race: Aile de Mer Avertissement: (0/0) Bannissement: (0/0)
| Sujet: Re: Programmation IA en LUA Jeu 3 Nov - 23:53 | |
| ( c'est pas mal pour quelqu'un de ton age, je veux dire, la programmation, très souvent ça semble en rebuter plus d'un, tu te dis " c'est pas à ma porté" et tu essaie jamais ^^ )
cool,( je me demande à quoi ressemble tes animations ^^ ), Le temps que ça doit représenter ......... | |
| | | Yurising membre
Médailles : Émeraudes : 76 Messages : 50 Date d'inscription : 24/09/2016 Age : 24 Localisation : Sous l'océaannnnn
Description du dragon Race: Aile du Ciel Avertissement: (0/0) Bannissement: (0/0)
| Sujet: Re: Programmation IA en LUA Dim 27 Nov - 14:04 | |
| Je suis entrain d'uploadé une vidéo showcase actuellement. J'hésite a mettre un lien parceque, sa ne parle pas des royaumes de feu (pas du tout) et en plus les SCP risque de heurté la sensibilité des plus jeunes. | |
| | | Contenu sponsorisé
| Sujet: Re: Programmation IA en LUA | |
| |
| | | | Programmation IA en LUA | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |
|