Menu
CoddyTech

Đồ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").LocalPlayer

Trong 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ủ.

challenge icon

Thử thách

Trung bình

Hiển thị số xu của người chơi trên màn hình.

  1. Trong PetClient: local Players = game:GetService("Players"), local me = Players.LocalPlayer, local hud = script.Parent.
  2. local coins = me:WaitForChild("leaderstats"):WaitForChild("Coins")
  3. 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ới coins.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