Menu
CoddyTech

Zum Zerbrechen klicken

Lektion 6 von 18 im Kurs Roblox-Spiel: Haustiersimulator von Coddy.

Ein ClickDetector ist für einen Button in Ordnung, aber die meisten Simulatoren erfassen Klicks auf dem Client, damit das Spiel reagieren kann, sobald du klickst (mit einem Sound, einem Wackeln), noch bevor der Server antwortet. Die Maus des Clients weiß, worauf sie geklickt hat:

local mouse = me:GetMouse()
mouse.Button1Down:Connect(function()
	print(mouse.Target) -- das Part unter dem Mauszeiger beim Klicken oder nil
end)

Der Client kann einen Stapel nicht selbst zerstören: Der Server besitzt die Stapel und die Münzen. Er fragt über ein RemoteEvent an, ein Objekt, das für Nachrichten zwischen Client und Server entwickelt wurde:

-- Client
remotes.Hit:FireServer(pile)
-- Server: Roblox fügt den Spieler, der das Ereignis gesendet hat, als erstes Argument hinzu
remotes.Hit.OnServerEvent:Connect(function(player, pile)
end)

Ein Remote trifft einen Moment später ein, da es über ein Netzwerk übertragen wird. Auf einem Smartphone ist ein Tippen dasselbe wie ein Klick.

challenge icon

Aufgabe

Mittel
  1. In PetClient: local remotes = game.ReplicatedStorage:WaitForChild("Remotes"). Beim Button1Down der Maus: Wenn mouse.Target ein Part mit dem Namen CoinPile ist, löse remotes.Hit damit aus.
  2. In PetServer: local remotes = game.ReplicatedStorage.Remotes, verbinde remotes.Hit.OnServerEvent, sodass hitPile(player, pile) aufgerufen wird, und entferne den ClickDetector aus spawnPile (und die Zeile local hitPile: Schreibe stattdessen local function hitPile unter spawnPile).

Drücke Spielen und klicke auf einen Stapel. Klicke dann auf Überprüfen.

Probier es selbst

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)

local piles = workspace.Piles
local pileSpot = {} -- jeder Haufen -> der Platz, auf dem er steht

print("A Meadow pile gives " .. Settings.PileValue .. " coins")

-- Jeder Spieler erhält Coins auf der Bestenliste
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)

-- Ein Klick auf einen Haufen benötigt hitPile, das unterhalb von spawnPile definiert wird: daher den Namen
-- hier vor beiden deklarieren
local hitPile

-- Ein Münzhaufen auf einem Platz: eine Kopie von ServerStorage.CoinPile mit Gesundheit
-- und Wert als Attributen
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)
	-- Klicke darauf, um ihn zu treffen
	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

-- Ein Treffer verringert die Gesundheit eines Haufens um 1;
-- bei 0 zerfällt der Haufen und zahlt seinen Wert aus
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()
	-- ein neuer Haufen am selben Platz, einige Sekunden später
	task.delay(Settings.RespawnTime, spawnPile, spot)
end

-- Ein Haufen auf jedem Platz in Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
	spawnPile(spot)
end
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Roblox-Spiel: Haustiersimulator