Der Shop
Lektion 7 von 22 im Kurs Roblox-Spiel: Tower Defense von Coddy.
Jetzt die Seite des Spielers. DefenseClient ist ein LocalScript im HUD, einem ScreenGui, das Roblox auf den Bildschirm jedes Spielers kopiert, daher ist script.Parent das HUD. Der Frame Shop enthält pro Turm einen TextButton, der nach dem Turm benannt ist.
Ein LocalScript kann starten, bevor die Objekte des Spiels das Gerät des Spielers erreichen. Deshalb sucht es sie mit WaitForChild. Das Activated-Ereignis einer Schaltfläche wird ausgelöst, wenn sie angeklickt oder angetippt wird:
local Settings = require(game.ReplicatedStorage:WaitForChild("Settings"))
local button = script.Parent.Shop.Frost
button.Text = "Frost tower"
button.Activated:Connect(function()
print("Frost picked")
end)Aufgabe
MittelZeige die Preise auf den Schaltflächen des Shops in DefenseClient an.
- Füge
local Settings = require(game.ReplicatedStorage:WaitForChild("Settings"))undlocal hud = script.Parenthinzu. - Lege für jede TextButton in
hud.Shopihren Text aufbutton.Name .. " $" .. Settings.Towers[button.Name].Pricefest. - Speichere bei ihrem
Activated-Ereignis ihren Namen inlocal selected.
Klicke auf „Spielen“: Im Shop werden Archer $60, Cannon $120 und Frost $90 angezeigt. Klicke dann auf „Prüfen“.
Probier es selbst
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local enemies = workspace.Enemies
print("The base can take " .. Settings.BaseHealth .. " hits")
-- Die Wegpunkte in der richtigen Reihenfolge (sie heißen 1, 2, 3...)
local waypoints = workspace.Path.Waypoints:GetChildren()
table.sort(waypoints, function(a, b)
return tonumber(a.Name) < tonumber(b.Name)
end)
-- Die Gesundheit der Basis als Attribut von workspace: Jeder Client kann sie auslesen
workspace:SetAttribute("BaseHealth", Settings.BaseHealth)
-- Jeder Spieler erhält Money auf der Bestenliste
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local money = Instance.new("IntValue")
money.Name = "Money"
money.Value = Settings.StartMoney
money.Parent = leaderstats
end)
-- Ein Gegner hat die Basis erreicht
local function damageBase(amount)
local health = math.max(0, workspace:GetAttribute("BaseHealth") - amount)
workspace:SetAttribute("BaseHealth", health)
print("Base: " .. health)
end
-- Einen Gegner den Pfad entlanglaufen lassen. MoveTo gibt nach 8 Sekunden auf und meldet dies
-- (MoveToFinished mit false), daher wird ein langsamer Gegner erneut losgeschickt, bis er ankommt.
local function walkPath(enemy)
local humanoid = enemy.Humanoid
for i = 2, #waypoints do
repeat
humanoid:MoveTo(waypoints[i].Position)
until humanoid.MoveToFinished:Wait() or not enemy.Parent
if not enemy.Parent then
return
end
end
-- Er hat die Basis erreicht
damageBase(Settings.Enemies[enemy.Name].Damage)
enemy:Destroy()
end
-- Ein neuer Gegner am Tor, der den Pfad entlangläuft
local function spawnEnemy(kind)
local enemy = ServerStorage.Enemies[kind]:Clone()
-- Direkt über dem ersten Wegpunkt platziert
enemy:PivotTo(waypoints[1].CFrame + Vector3.new(0, 5, 0))
local info = Settings.Enemies[kind]
enemy.Humanoid.MaxHealth = info.Health
enemy.Humanoid.Health = info.Health
enemy.Humanoid.WalkSpeed = info.Speed
enemy.Parent = enemies
task.spawn(walkPath, enemy)
return enemy
end
-- Eine Welle: ihre Gegner nacheinander erzeugen und dann warten, bis alle verschwunden sind
local function runWave(list)
for _, kind in list do
spawnEnemy(kind)
task.wait(Settings.SpawnGap)
end
while #enemies:GetChildren() > 0 do
task.wait(0.2)
end
end
-- Die Wellen, jeweils nach einer Pause
for i, list in Settings.Waves do
task.wait(Settings.WaveBreak)
runWave(list)
end
Alle Lektionen in Roblox-Spiel: Tower Defense
Übe selbstständig: Roblox-Playground