Les Royaumes de Feu

Thème LRDF © Tome 6
 
AccueilCalendrierFAQRechercherMembresGroupesS'enregistrerConnexion

Partagez | 
 

 Programmation IA en LUA

Voir le sujet précédent Voir le sujet suivant Aller en bas 
AuteurMessage
Yurising
membre
avatar

Médailles :
Émeraudes : 74
Messages : 50
Date d'inscription : 24/09/2016
Age : 18
Localisation : Sous l'océaannnnn

Desciption du dragon
Race: Aile du Ciel
Avertissement:
0/0  (0/0)
Bannissement:
0/0  (0/0)

MessageSujet: 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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Braise
Ancien
avatar

Médailles :
Émeraudes : 467
Messages : 1235
Date d'inscription : 16/09/2016
Age : 15
Localisation : Dans la forêt de pluie, élabore son projet!

Desciption du dragon
Race: Aile du ciel
Avertissement:
0/0  (0/0)
Bannissement:
0/0  (0/0)

MessageSujet: 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^^


Braise, un aile du ciel touchant plein de gentillesse et de tendresse, un roi avec bon coeur !

--------------------------------

Rejoigner moi sur Discord ! : Braisewolf#8754

Et sur skype aussi ! : Braise Braise (pour me trouver ou encore) Braise.forum@gmail.com
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yurising
membre
avatar

Médailles :
Émeraudes : 74
Messages : 50
Date d'inscription : 24/09/2016
Age : 18
Localisation : Sous l'océaannnnn

Desciption du dragon
Race: Aile du Ciel
Avertissement:
0/0  (0/0)
Bannissement:
0/0  (0/0)

MessageSujet: 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
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Braise
Ancien
avatar

Médailles :
Émeraudes : 467
Messages : 1235
Date d'inscription : 16/09/2016
Age : 15
Localisation : Dans la forêt de pluie, élabore son projet!

Desciption du dragon
Race: Aile du ciel
Avertissement:
0/0  (0/0)
Bannissement:
0/0  (0/0)

MessageSujet: 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


Braise, un aile du ciel touchant plein de gentillesse et de tendresse, un roi avec bon coeur !

--------------------------------

Rejoigner moi sur Discord ! : Braisewolf#8754

Et sur skype aussi ! : Braise Braise (pour me trouver ou encore) Braise.forum@gmail.com
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Recif
Grand membre
avatar

Médailles :
Émeraudes : 507
Messages : 649
Date d'inscription : 26/04/2016
Age : 22
Localisation : île isolée

Desciption du dragon
Race: Aile de Mer
Avertissement:
0/0  (0/0)
Bannissement:
0/0  (0/0)

MessageSujet: 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 >< )


Smile  –– prenons le temps d'y réfléchir –– Razz
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Recif
Grand membre
avatar

Médailles :
Émeraudes : 507
Messages : 649
Date d'inscription : 26/04/2016
Age : 22
Localisation : île isolée

Desciption du dragon
Race: Aile de Mer
Avertissement:
0/0  (0/0)
Bannissement:
0/0  (0/0)

MessageSujet: Re: Programmation IA en LUA   Mer 2 Nov - 11:45

( mais les Ia sont sympas, je connais le Lua de nom seulement )


Smile  –– prenons le temps d'y réfléchir –– Razz
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Recif
Grand membre
avatar

Médailles :
Émeraudes : 507
Messages : 649
Date d'inscription : 26/04/2016
Age : 22
Localisation : île isolée

Desciption du dragon
Race: Aile de Mer
Avertissement:
0/0  (0/0)
Bannissement:
0/0  (0/0)

MessageSujet: 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 ><] )


Smile  –– prenons le temps d'y réfléchir –– Razz
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yurising
membre
avatar

Médailles :
Émeraudes : 74
Messages : 50
Date d'inscription : 24/09/2016
Age : 18
Localisation : Sous l'océaannnnn

Desciption du dragon
Race: Aile du Ciel
Avertissement:
0/0  (0/0)
Bannissement:
0/0  (0/0)

MessageSujet: 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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Recif
Grand membre
avatar

Médailles :
Émeraudes : 507
Messages : 649
Date d'inscription : 26/04/2016
Age : 22
Localisation : île isolée

Desciption du dragon
Race: Aile de Mer
Avertissement:
0/0  (0/0)
Bannissement:
0/0  (0/0)

MessageSujet: 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 .........


Smile  –– prenons le temps d'y réfléchir –– Razz
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Yurising
membre
avatar

Médailles :
Émeraudes : 74
Messages : 50
Date d'inscription : 24/09/2016
Age : 18
Localisation : Sous l'océaannnnn

Desciption du dragon
Race: Aile du Ciel
Avertissement:
0/0  (0/0)
Bannissement:
0/0  (0/0)

MessageSujet: 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.
Revenir en haut Aller en bas
Voir le profil de l'utilisateur
Contenu sponsorisé




MessageSujet: Re: Programmation IA en LUA   

Revenir en haut Aller en bas
 
Programmation IA en LUA
Voir le sujet précédent Voir le sujet suivant Revenir en haut 
Page 1 sur 1
 Sujets similaires
-
» Nouvelle programmation à la radio et télé Nationale d'Haiti
» Début de la programmation de l'IA
» Radio Minustah disponible sur Internet sur "minustah.or
» [PROGRAMMATION]Language de programmation
» La Programmation Pokemon sur Gulli

Permission de ce forum:Vous ne pouvez pas répondre aux sujets dans ce forum
Les Royaumes de Feu :: En dehors du jeu RPG :: Art et codage :: Atelier graphisme ou/et codage-
Sauter vers: