Menu
CoddyTech

Dash avec Q

Leçon 6 sur 20 du cours Jeu Roblox : Arènes de combat de Coddy.

Les capacités commencent sur l’appareil du joueur. BattleClient est un LocalScript dans le HUD, et ContextActionService associe une action à des touches ; avec un troisième argument true, il ajoute aussi un bouton pour cette action sur l’écran d’un téléphone :

ContextActionService:BindAction("Dash", use, true, Enum.KeyCode.Q)

La fonction reçoit le nom de l’action et l’état de l’entrée, Begin lorsque la touche est enfoncée. Le serveur est responsable des règles du jeu, donc le client ne déclenche pas lui-même le dash : il en fait la demande au serveur via le RemoteEvent Remotes.Ability, en indiquant son nom. Le serveur conserve une table des capacités indexée par nom, et un dash est une impulsion : définir la vélocité de la racine projette le personnage vers l’avant.

function abilities.Dash(player, character, root)
	root.AssemblyLinearVelocity = root.CFrame.LookVector * Settings.DashSpeed + Vector3.new(0, 15, 0)
end
challenge icon

Défi

Moyen

Dans BattleClient : récupère ContextActionService et le dossier Remotes, écris use(name, state) pour déclencher remotes.Ability avec le nom lorsque l’état est Begin, et associe "Dash" à Q avec un bouton tactile.

Dans BattleServer : ajoute local remotes = game.ReplicatedStorage.Remotes, une table abilities avec Dash, et connecte remotes.Ability.OnServerEvent(player, name) pour exécuter la capacité nommée avec le joueur, son personnage et sa racine.

Appuie sur Jouer puis sur Q. Ensuite, clique sur Vérifier.

Essayez vous-même

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)

local lastSwing = {} -- player -> moment de son dernier coup d'épée

-- Les animations d'épée propres à Roblox
local slash = Instance.new("Animation")
slash.AnimationId = "rbxassetid://522635514"

print("Swords deal " .. Settings.SwordDamage .. " damage")

-- Un coup d'épée : l'animation, puis tous ceux qui se trouvent dans la zone devant vous sont touchés
local function swing(player)
	local character = player.Character
	local root = character and character:FindFirstChild("HumanoidRootPart")
	if not root or character.Humanoid.Health <= 0 then
		return
	end
	local now = time()
	if lastSwing[player] and now - lastSwing[player] < Settings.SwingCooldown then
		return
	end
	lastSwing[player] = now
	character.Humanoid.Animator:LoadAnimation(slash):Play()
	-- la zone devant vous, jamais votre propre corps
	local params = OverlapParams.new()
	params.FilterDescendantsInstances = { character }
	local box = root.CFrame * CFrame.new(0, 0, -3)
	local hit = {} -- chaque humanoïde une seule fois par coup d'épée
	for _, part in workspace:GetPartBoundsInBox(box, Settings.HitboxSize, params) do
		local humanoid = part.Parent:FindFirstChildOfClass("Humanoid")
		if humanoid and not hit[humanoid] then
			hit[humanoid] = true
			humanoid:TakeDamage(Settings.SwordDamage)
		end
	end
end

-- Chaque joueur reçoit Kills dans le classement et une épée à chaque vie
Players.PlayerAdded:Connect(function(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local kills = Instance.new("IntValue")
	kills.Name = "Kills"
	kills.Parent = leaderstats

	player.CharacterAdded:Connect(function()
		local sword = ServerStorage.Sword:Clone()
		sword.Parent = player.Backpack
		sword.Activated:Connect(function()
			swing(player)
		end)
	end)
end)

-- Le mannequin d'entraînement : sa barre de vie reflète sa santé, et une fois vaincu, le
-- mannequin revient après un moment, sous forme d'une nouvelle copie au même endroit
local function setupDummy(dummy)
	local humanoid = dummy.Humanoid
	humanoid.HealthChanged:Connect(function(health)
		dummy.HealthBar.Back.Fill.Size = UDim2.fromScale(health / humanoid.MaxHealth, 1)
	end)
	humanoid.Died:Connect(function()
		local spot = dummy:GetPivot()
		task.wait(0.5)
		dummy:Destroy()
		task.wait(Settings.DummyRespawn)
		local fresh = ServerStorage.Dummy:Clone()
		fresh:PivotTo(spot)
		fresh.Parent = workspace
		setupDummy(fresh)
	end)
end
setupDummy(workspace.Dummy)
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Jeu Roblox : Arènes de combat