Menu
CoddyTech

Ấp trứng

Bài học 9 trên 20 trong khóa học Trò chơi Roblox: mô phỏng thú cưng của Coddy.

Quả trứng màu trắng gần điểm xuất hiện có ProximityPrompt: đi đến gần nó, Roblox sẽ hiện nút "Ấp" cùng phím cần giữ (E hoặc chạm vào màn hình điện thoại). Khi người chơi giữ phím đủ lâu, lời nhắc kích hoạt sự kiện Triggered trên máy chủ, kèm theo người chơi:

workspace.Egg.ProximityPrompt.Triggered:Connect(function(player)
end)

Máy chủ kiểm tra giá, lấy tiền xu và trao thú cưng. Thú cưng là một StringValue chứa tên của nó, nằm trong thư mục Pets bên trong người chơi. Mọi thứ máy chủ đặt bên trong người chơi sẽ được đồng bộ đến máy khách của người chơi đó. Nhờ vậy, danh sách thú cưng trong bài học sau biết cần hiển thị những gì.

challenge icon

Thử thách

Trung bình

Ấp nở một chú mèo ở quả trứng với giá 25 xu.

  1. Trong PlayerAdded, thêm một Folder tên là Pets vào người chơi.
  2. Viết givePet(player, name): một StringValue Pet có Value là name trong Pets; trả về nó.
  3. Khi workspace.Egg.ProximityPrompt.Triggered kích hoạt: nếu Coins lớn hơn hoặc bằng Settings.EggPrice, trừ số xu đó, gọi givePet(player, "Cat"), in ra player.Name .. " hatched a Cat".

Nhấn Chơi, kiếm 25 xu, nhấn giữ E ở quả trứng: Coins giảm 25. 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 remotes = game.ReplicatedStorage.Remotes
local piles = workspace.Piles
local pileSpot = {} -- mỗi đống tiền -> vị trí của nó
local lastHit = {} -- mỗi người chơi -> thời điểm họ đánh lần cuối

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)

-- Một đống tiền tại một vị trí: bản sao của ServerStorage.CoinPile với lượng máu
-- và giá trị (value) 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)
	pile.HealthGui.Label.Text = pile:GetAttribute("Health") .. "/" .. pile:GetAttribute("MaxHealth")
	pileSpot[pile] = spot
	pile.Parent = piles
	return pile
end

-- Mỗi lần đánh làm đống tiền mất 1 máu;
-- khi máu về 0, đống tiền vỡ và người chơi nhận giá trị của nó
local function hitPile(player, pile)
	local health = pile:GetAttribute("Health") - 1
	if health > 0 then
		pile:SetAttribute("Health", health)
		pile.HealthGui.Label.Text = health .. "/" .. pile:GetAttribute("MaxHealth")
		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 tiền mới xuất hiện tại cùng vị trí
	task.delay(Settings.RespawnTime, spawnPile, spot)
end

-- Mỗi vị trí trong Meadow có một đống tiền
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
	spawnPile(spot)
end

-- Máy khách yêu cầu đánh một đống tiền. Đừng tin máy khách: bất kỳ ai cũng có thể kích hoạt
-- remote này với dữ liệu bất kỳ, từ bất cứ đâu, nhanh tùy ý.
remotes.Hit.OnServerEvent:Connect(function(player, pile)
	-- một đống tiền thật
	if typeof(pile) ~= "Instance" or pile.Parent ~= piles then
		return
	end
	-- Trong tầm với
	local character = player.Character
	local root = character and character:FindFirstChild("HumanoidRootPart")
	if not root or (root.Position - pile.Position).Magnitude > Settings.Reach then
		return
	end
	-- Không quá nhanh
	local now = time()
	if lastHit[player] and now - lastHit[player] < Settings.HitCooldown then
		return
	end
	lastHit[player] = now
	hitPile(player, pile)
end)

-- Bài học 9: Ấp trứng sẽ nằm ở đây

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