Gửi yêu cầu đến máy chủ
Bài học 6 trên 25 trong khóa học Trò chơi Roblox: Đấu trường của Coddy.
Kỹ năng bắt đầu trên thiết bị của người chơi. BattleClient là một LocalScript trong HUD. ContextActionService gắn một hành động với các phím, và khi dùng true làm đối số thứ ba, nó cũng thêm một nút cho hành động đó trên màn hình điện thoại:
ContextActionService:BindAction("Wave", use, true, Enum.KeyCode.T)Hàm nhận tên hành động và trạng thái đầu vào, Begin khi bạn nhấn phím. Máy chủ quản lý các quy tắc, nên client chỉ gửi yêu cầu qua RemoteEvent Remotes.Ability. Ở phía máy chủ, OnServerEvent nhận sự kiện này, và Roblox truyền người chơi kích hoạt sự kiện làm đối số đầu tiên:
remotes.Ability.OnServerEvent:Connect(function(player, name)
print(name .. " from " .. player.Name)
end)Thử thách
Trung bìnhNhấn Q để yêu cầu máy chủ thực hiện cú lướt.
- Trong
BattleClient, viếtuse(name, state): khiEnum.UserInputState.Begin, gọiremotes.Ability:FireServer(name). - Gán phím cho hàm:
ContextActionService:BindAction("Dash", use, true, Enum.KeyCode.Q). - Trong
BattleServer, kết nốiremotes.Ability.OnServerEventvớiprint(player.Name .. " asked for " .. name).
Nhấn Chơi rồi nhấn Q: đầu ra hiển thị Player1 asked for Dash. Sau đó nhấn Kiểm tra.
Tự làm thử
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local lastSwing = {} -- player -> thời điểm vung kiếm gần nhất
-- Hoạt ảnh vung kiếm có sẵn của Roblox
local slash = Instance.new("Animation")
slash.AnimationId = "rbxassetid://522635514"
print("Swords deal " .. Settings.SwordDamage .. " damage")
-- Một lần vung kiếm: phát hoạt ảnh, rồi đánh trúng mọi đối tượng trong vùng hộp phía trước bạn
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()
-- Vùng hộp phía trước bạn, không bao gồm cơ thể bạn
local params = OverlapParams.new()
params.FilterDescendantsInstances = { character }
local box = root.CFrame * CFrame.new(0, 0, -3)
local hit = {} -- Mỗi humanoid chỉ bị đánh trúng một lần trong mỗi lần vung kiếm
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)
print(humanoid.Parent.Name .. " is at " .. humanoid.Health)
end
end
end
-- Mỗi người chơi nhận một thanh kiếm ở mỗi lượt sống
Players.PlayerAdded:Connect(function(player)
player.CharacterAdded:Connect(function()
local sword = ServerStorage.Sword:Clone()
sword.Parent = player.Backpack
sword.Activated:Connect(function()
swing(player)
end)
end)
end)
-- Hình nộm tập luyện: thanh máu thay đổi theo lượng máu; khi bị đánh bại,
-- hình nộm xuất hiện lại sau chốc lát dưới dạng bản sao mới ở cùng vị trí
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)
Tất cả bài học trong Trò chơi Roblox: Đấu trường
2Máy khách và máy chủ
Gửi yêu cầu đến máy chủTự luyện tập: Playground Roblox