Ấ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ì.
Thử thách
Trung bìnhẤp nở một chú mèo ở quả trứng với giá 25 xu.
- Trong
PlayerAdded, thêm một Folder tên làPetsvào người chơi. - Viết
givePet(player, name): một StringValuePetcó Value lànametrong Pets; trả về nó. - Khi
workspace.Egg.ProximityPrompt.Triggeredkích hoạt: nếu Coins lớn hơn hoặc bằngSettings.EggPrice, trừ số xu đó, gọigivePet(player, "Cat"), in raplayer.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