Đồng xu trên màn hình
Bài học 5 trên 20 trong khóa học Trò chơi Roblox: mô phỏng thú cưng của Coddy.
Bây giờ đến phần client. PetClient là một LocalScript bên trong HUD, một ScreenGui mà Roblox sao chép từ StarterGui vào màn hình của mỗi người chơi khi họ xuất hiện. LocalScript chạy trên thiết bị của chính người chơi đó và có thể xác định người chơi mà nó chạy cho:
local me = game:GetService("Players").LocalPlayerTrong một Script phía máy chủ, LocalPlayer có giá trị nil: máy chủ phục vụ tất cả người chơi cùng lúc.
Máy chủ thêm leaderstats vào người chơi một lúc sau khi họ tham gia, nên client chờ bằng WaitForChild. Sau đó, nó hiển thị số xu trong nhãn Coins của HUD và cập nhật mỗi khi số xu thay đổi: sự kiện Changed của một IntValue chạy kèm giá trị mới.
Nhãn chỉ hiển thị những gì máy chủ quyết định. Thay đổi Coins.Value trong một LocalScript chỉ làm thay đổi những gì người chơi này nhìn thấy, chứ không thay đổi gì trên máy chủ.
Thử thách
Trung bìnhHiển thị số xu của người chơi trên màn hình.
- Trong
PetClient:local Players = game:GetService("Players"),local me = Players.LocalPlayer,local hud = script.Parent. local coins = me:WaitForChild("leaderstats"):WaitForChild("Coins")- Viết
showCoins():hud.Coins.Text = "Coins: " .. coins.Value. Gọi hàm này một lần và kết nối nó vớicoins.Changed.
Nhấn Chơi và phá một đống xu: góc trên bên trái hiển thị Coins: 5. 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 piles = workspace.Piles
local pileSpot = {} -- mỗi đống xu -> vị trí của nó
print("A Meadow pile gives " .. Settings.PileValue .. " coins")
-- Mỗi người chơi có Coins trên bảng xếp hạng
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local coins = Instance.new("IntValue")
coins.Name = "Coins"
coins.Parent = leaderstats
end)
-- Khi nhấp vào đống xu, cần gọi hitPile, nhưng hàm (function) này nằm sau spawnPile: khai báo tên hàm
-- ở đây, trước cả hai hàm
local hitPile
-- Đống xu tại một vị trí: bản sao của ServerStorage.CoinPile với máu
-- và giá trị được lưu dưới dạng thuộc tính (attribute)
local function spawnPile(spot)
local pile = ServerStorage.CoinPile:Clone()
pile.Position = spot.Position
pile:SetAttribute("MaxHealth", Settings.PileHealth)
pile:SetAttribute("Health", Settings.PileHealth)
pile:SetAttribute("Value", Settings.PileValue)
-- nhấp vào đống xu để đánh nó
local detector = Instance.new("ClickDetector")
detector.Parent = pile
pileSpot[pile] = spot
pile.Parent = piles
detector.MouseClick:Connect(function(player)
hitPile(player, pile)
end)
return pile
end
-- Mỗi lần đánh làm đống xu mất 1 máu;
-- khi máu về 0, đống xu vỡ và trao số xu bằng giá trị của nó
function hitPile(player, pile)
local health = pile:GetAttribute("Health") - 1
if health > 0 then
pile:SetAttribute("Health", health)
return
end
player.leaderstats.Coins.Value += pile:GetAttribute("Value")
local spot = pileSpot[pile]
pileSpot[pile] = nil
pile:Destroy()
-- vài giây sau, một đống xu mới xuất hiện ở cùng vị trí
task.delay(Settings.RespawnTime, spawnPile, spot)
end
-- Mỗi vị trí trong Meadow có một đống xu
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
spawnPile(spot)
end
Tất cả bài học trong Trò chơi Roblox: mô phỏng thú cưng
Tự luyện tập: Playground Roblox