Oyunun son fazlasını kodlamak: temizliği ve sıfırlamayı. Bu fazda kod, oyunun gecikmeye uğrayan ve gelecekteki maçların her oyuncu için aynı şekilde başladığından emin olur.
GUI'yi Güncelleme
Temizliği ve sıfırlamayı yapmadan önce, oyunun DisplayManager'ını kullanarak uygun durumu göstermesini oyunculara bildirin.
Kazananın Adını Almak
Kazanan oyuncunun ismini alarak başlayın, varsa. Daha önce, kod aktif oyuncu masasının boyutunu 1'e düşürdüğünü kontrol etti. Kalan oyuncu ismini almak için, bu masanın ilk indeksinde ismi geri döndür.
PlayerManager'da, getWinnerName() adında yeni bir modül işlevini başlatın.
function PlayerManager.getWinnerName()end-- EtkinliklerPlayers.PlayerAdded:Connect(onPlayerJoin)Eğer bir şey varsa activePlayers[1] içinde ifade ekleyin. Anka sayısı kontrol edilmeden önce, oyunu terk etmiş veya bağlantıyı kesmiş olabilir.
function PlayerManager.getWinnerName()local winningPlayer = activePlayers[1]if winningPlayer thenendendif ifadesinde:
- oyuncuismini geri al.
- Diğerleri için bir hata diziyapın.
function PlayerManager.getWinnerName()local winningPlayer = activePlayers[1]if winningPlayer thenreturn winningPlayer.Nameelsereturn "Error: No winning player found"endend
Son Durumu Almak
Eğer timer'ın bitmesine izin verirse veya bir oyuncu ayrılırsa doğru son durumdan alınan bilgiyi almak için bir modül işlevini kullanın. Sonra, bu durum değişkenini DisplayManager'a gönderin ve GUI'yu doğru mesajla güncellemeyi sağlayın.
In MatchManager , kodu getEndStatus() ile bir yeni modül işlevi kullanarak kodladınız, bir endState ile. Mesaj göndermek için, boş bir şemsiye adı verin, 1> statusToReturn1> .
function MatchManager.prepareGame()playerManager.sendPlayersToMatch()matchStart:Fire()endfunction MatchManager.getEndStatus(endState)local statusToReturnendmatchStart.Event:Connect(startTimer)matchEnd.Event:Connect(stopTimer)return MatchManagerstatusToReturn ile ifade ifadelerini kullanarak değerini ayarlayın. Hata durumu değişkenleri için son durumu gösteren FoundWinner ve TimerUp . Hata kontrol için diğerini sona ekleyin.
function MatchManager.getEndStatus(endState)local statusToReturnif endState == gameSettings.endStates.FoundWinner thenelseif endState == gameSettings.endStates.TimerUp thenelseendendHer durum için şu eklersiniz:
FoundWinner
- Kazanan için bir değişken kullanıyor playerManager.getWinnerName() .
- Kazananı duyuran bir yayınlayıcıyla statusToReturn güncelle.
TimerUp
- Süre sonunda statusToReturn ile güncellenir.
Else
- statusToReturn ile bir hata mesajı güncellenir, eğer son oyun mesajı alınamadığında.
function MatchManager.getEndStatus(endState)local statusToReturnif endState == gameSettings.endStates.FoundWinner thenlocal winnerName = playerManager.getWinnerName()statusToReturn = "Winner is : " .. winnerNameelseif endState == gameSettings.endStates.TimerUp thenstatusToReturn = "Time ran out!"elsestatusToReturn = "Error found"endendreturn statusToReturn yazıp mesajı geri gönderin.
function MatchManager.getEndStatus(endState)local statusToReturnif endState == gameSettings.endStates.FoundWinner thenlocal winnerName = playerManager.getWinnerName()statusToReturn = "Winner is : " .. winnerNameelseif endState == gameSettings.endStates.TimerUp thenstatusToReturn = "Time ran out!"elsestatusToReturn = "Error found"endreturn statusToReturnend
Görüntülenmesi ve Testlenmesi
GameManager'da güncellemeyi al ve DisplayManager'ı kullanarak oyunculara göster.
Open GameManager . In while true do loop, delete last print statement. Then, create a variable named endStatus. Set it equal to calling matchManager.getEndStatus(endState) .
while true dodisplayManager.updateStatus("Waiting for Players")repeattask.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersdisplayManager.updateStatus("Get ready!")task.wait(gameSettings.transitionTime)matchManager.prepareGame()local endState = matchEnd.Event:Wait()local endStatus = matchManager.getEndStatus(endState)endGeri bildirilen mesajı GUI etiketinde görmek için, displayManager.updateStatus() çağır ve endStatus geç.
local endStatus = matchManager.getEndStatus(endState)displayManager.updateStatus(endStatus)Oyun duraklatılır, oyuncuların mesajı görmesine izin vermek için transitionTime kullanarak bir bekleme ekleyin.
local endStatus = matchManager.getEndStatus(endState)displayManager.updateStatus(endStatus)task.wait(gameSettings.transitionTime)Bir test sunucusu başlat ve oyuncuların zamanlanmış ve kazanan oyuncu koşulları için aşağıdaki mesajları gördüğünden emin ol.
Hata ayıklama ipuçları
Bu noktada, mesajları göremiyorsunuz, aşağıdaki birinden deneyin.
- Eğer son durum mesajınız "Hata Bulundu" ise, hiçbir koşul başarılı değildi. Kodu MatchManager.getEndStatus() kod örnekleriyle karşılaştırın.
- Etkinleştirme durumu gösterilmezse, task.wait(gameSettings.transitionTime) iletisini göstericiye gönderdiğinizden emin olun.
Yeni Maçları Başlatma
Yeni bir eşleşmebaşlatmadan önce, bir geçiştir. Bu, oyuncuların son durumunu görmesine izin verir ve teleport edilmesi daha da ani hissettirmeyi azaltır.
Geçişin sonunda, kalan oyuncular arenadan kaldırılacak ve tüm kod sıfırlanacaktır. Bu, oyuncuların temiz bir versiyonu ile bir sonraki maçı başlatmasını sağlar.
Geçişleri Ele Alma
Oyuncular geçiş haline geldiğinde silahlarını çıkar.
PlayerManager'da, yerel işlevleri bulun. Aşağıdaki removePlayerWeapon() için çekirdek kopyalayıp yapıştır. Kod bir aktif olarak eğitilmiş veya oyuncunun sırt çantasında bulunan bir silahı kaldırır.
local function removePlayerWeapon(whichPlayer)-- Bir oyuncu bağlantıyı kesmiş veya ayrılmış olup olmadığını görmek için kontrol edin.if whichPlayer thenlocal character = whichPlayer.Character-- Oyuncu bunu şu anda karakterindeyselocal weapon = character:FindFirstChild("Weapon")if weapon thenweapon:Destroy()end-- Oyuncu silahını sırt çantasında taşıyorsalocal backpackWeapon = whichPlayer.Backpack:FindFirstChild("Weapon")if backpackWeapon thenbackpackWeapon:Destroy()endelseprint("No player to remove weapon")endendRemoveAllWeapons() adında yeni bir modül işlevi başlat.
function PlayerManager.removeAllWeapons()end-- EtkinliklerPlayers.PlayerAdded:Connect(onPlayerJoin)return PlayerManagerBu işlevde, aktif oyuncu masasında gezinmek için bir for döngüsü kullanın. Döngüde, removePlayerWeapon() çağır ve bulunan oyuncuya geç.
function PlayerManager.removeAllWeapons()for playerKey, whichPlayer in activePlayers doremovePlayerWeapon(whichPlayer)endend
Maçlar Arasında Temizleniyor
Temizliket, MatchManager'da kendi işlevidir. Şimdi, temizliket sadece önce oluşturulan bu işlevi kullanarak oyuncuların silahlarını kaldırır. Oyunu genişletirken, daha fazlası eklenebilir, bir haritanın bir eşleşmesırasında değiştirildiği gibi yeniden ayarlanması için gereken işlevleri kullanarak.
Open MatchManager. Add a new module function named cleanupMatch() . In that function, call playerManager.removeAllWeapons() .
function MatchManager.cleanupMatch()playerManager.removeAllWeapons()endmatchStart.Event:Connect(startTimer)matchEnd.Event:Connect(stopTimer)return MatchManagerArdından temizleme işlevini çağırın. GameManager'yı açın ve gerçekleştirmenin sonrasında silinen silahları bulun. Oyuncuların sona erişim sırasında silinen silahları bulmak için matchManager.cleanupMatch() önce sona erişim sırasında task.wait() çağırın.
while true dodisplayManager.updateStatus("Waiting for Players")repeattask.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersdisplayManager.updateStatus("Get ready!")task.wait(gameSettings.transitionTime)matchManager.prepareGame()local endState = matchEnd.Event:Wait()local endStatus = matchManager.getEndStatus(endState)displayManager.updateStatus(endStatus)matchManager.cleanupMatch()task.wait(gameSettings.transitionTime)endBir test sunucusu başlatın ve bir eşleşmeyapın. Timer'ın bitmesini bekle ve oyun sonunda silahınızın kaldırıldığından emin ol.
Maçları Sıfırlama
Oyunda birkaç başka şey fark etmiş olabilirsiniz, como oyuncular bir maçın ardından hala arenada kalıyor. Maçı temizledikten sonra, oyunu yeniden başlatın. Bu, oyuncuları arenaya geri gönderip aktif oyuncu masasını temizlemeyi içerir. Bir reset dünya, bir oyun kaydı süresiz olarak yeniden başlatılabilir.
Önce, oyuncuları lobide yollayan bir işlevi başlatın.
PlayerManager'da:
- resetPlayers() adında bir modül işlevi oluşturun.
- Aktif Oyuncular aracılığıyla itilen bir for dizi ekle.
- respawnPlayerInLobby() ile oyuncuyu geri oluşturucuya çağır ve geri oluşturucuya parametre olarak geç.
function PlayerManager.resetPlayers()for playerKey, whichPlayer in activePlayers dorespawnPlayerInLobby(whichPlayer)endend-- EtkinliklerPlayers.PlayerAdded:Connect(onPlayerJoin)return PlayerManagerBir sonraki maç için activePlayers tablosunu boş bırakın, bu da hızlı bir şekilde boş bir tabloya sıfırlanmasını sağlar.
function PlayerManager.resetPlayers()for playerKey, whichPlayer in activePlayers dorespawnPlayerInLobby(whichPlayer)endactivePlayers = {}endOpen MatchManager. Kod aşağıdaki yeni modül fonksiyonu resetMatch() ve playerManager.resetPlayers() ile çağrılır.
function MatchManager.resetMatch()playerManager.resetPlayers()endmatchStart.Event:Connect(startTimer)matchEnd.Event:Connect(stopTimer)return MatchManagerGameManager'e geri dönün. Süre sonunda doğru yapılan döngü, matchManager.resetMatch() çağırın.
while true dodisplayManager.updateStatus("Waiting for Players")repeattask.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersdisplayManager.updateStatus("Get ready!")task.wait(gameSettings.transitionTime)matchManager.prepareGame()local endState = matchEnd.Event:Wait()local endStatus = matchManager.getEndStatus(endState)displayManager.updateStatus(endStatus)matchManager.cleanupMatch()task.wait(gameSettings.transitionTime)matchManager.resetMatch()endBir test sunucusu başlatın ve bir eşleşmeyürütün. En az iki oyun halkasından geçebileceğinizden emin olun.
Tamamlanan Scriptler
Aşağıda çalışmanızı iki kat kontrol etmek için tamamlanmış kodlar var.
GameManager Komutu
-- Hizmetlerlocal ServerStorage = game:GetService("ServerStorage")local Players = game:GetService("Players")-- Modül Kodlarılocal moduleScripts = ServerStorage:WaitForChild("ModuleScripts")local matchManager = require(moduleScripts:WaitForChild("MatchManager"))local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))local displayManager = require(moduleScripts:WaitForChild("DisplayManager"))-- Etkinliklerlocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")while true dodisplayManager.updateStatus("Waiting for Players")repeattask.wait(gameSettings.intermissionDuration)until #Players:GetPlayers() >= gameSettings.minimumPlayersdisplayManager.updateStatus("Get ready!")task.wait(gameSettings.transitionTime)matchManager.prepareGame()local endState = matchEnd.Event:Wait()local endStatus = matchManager.getEndStatus(endState)displayManager.updateStatus(endStatus)matchManager.cleanupMatch()task.wait(gameSettings.transitionTime)matchManager.resetMatch()end
MatchManager Yazılımı
local MatchManager = {}
-- Hizmetler
local ServerStorage = game:GetService("ServerStorage")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Modül Kodları
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local displayManager = require(moduleScripts:WaitForChild("DisplayManager"))
local timer = require(moduleScripts:WaitForChild("Timer"))
-- Etkinlikler
local events = ServerStorage:WaitForChild("Events")
local matchStart = events:WaitForChild("MatchStart")
local matchEnd = events:WaitForChild("MatchEnd")
-- Değerler
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
local timeLeft = displayValues:WaitForChild("TimeLeft")
-- Maç zamanını takip etmek için kullanılacak yeni bir zamanlayıcı nesnesi oluşturur.
local myTimer = timer.new()
-- Yerel Fonksiyonlar
local function stopTimer()
myTimer:stop()
end
local function timeUp()
matchEnd:Fire(gameSettings.endStates.TimerUp)
end
local function startTimer()
myTimer:start(gameSettings.matchDuration)
myTimer.finished:Connect(timeUp)
while myTimer:isRunning() do
-- +1 ekleyerek, zamanlayıcının 0 değil 1'de gösterildiğinden emin olursunuz.
timeLeft.Value = (math.floor(myTimer:getTimeLeft() + 1))
-- Bekleme süresini ayarlamayarak, daha doğru bir döngü sunar
task.wait()
end
end
-- Modülasyon Fonksiyonları
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
function MatchManager.getEndStatus(endState)
local messageToReturn
if endState == gameSettings.endStates.FoundWinner then
local winnerName = playerManager.getWinnerName()
messageToReturn = "Winner is : " .. winnerName
elseif endState == gameSettings.endStates.TimerUp then
messageToReturn = "Time ran out!"
else
messageToReturn = "Error found"
end
return messageToReturn
end
function MatchManager.cleanupMatch()
playerManager.removeAllWeapons()
end
function MatchManager.resetMatch()
playerManager.resetPlayers()
end
matchStart.Event:Connect(startTimer)
matchEnd.Event:Connect(stopTimer)
return MatchManager
PlayerManager Komutu
local PlayerManager = {}
-- Hizmetler
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
-- Modüller
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
-- Etkinlikler
local events = ServerStorage:WaitForChild("Events")
local matchEnd = events:WaitForChild("MatchEnd")
-- Harita Değişkenleri
local lobbySpawn = workspace.Lobby.StartSpawn
local arenaMap = workspace.Arena
local spawnLocations = arenaMap.SpawnLocations
-- Değerler
local displayValues = ReplicatedStorage:WaitForChild("DisplayValues")
local playersLeft = displayValues:WaitForChild("PlayersLeft")
-- Oyuncu Değişkenleri
local activePlayers = {}
local playerWeapon = ServerStorage.Weapon
local function checkPlayerCount()
if #activePlayers == 1 then
matchEnd:Fire(gameSettings.endStates.FoundWinner)
print("Found winner")
end
end
local function removeActivePlayer(player)
print("removing player")
for playerKey, whichPlayer in activePlayers do
if whichPlayer == player then
table.remove(activePlayers, playerKey)
playersLeft.Value = #activePlayers
checkPlayerCount()
end
end
end
local function respawnPlayerInLobby(player)
player.RespawnLocation = lobbySpawn
player:LoadCharacter()
end
local function preparePlayer(player, whichSpawn)
player.RespawnLocation = whichSpawn
player:LoadCharacter()
local character = player.Character or player.CharacterAdded:Wait()
-- Oyuncuya bir araç ver
local sword = playerWeapon:Clone()
sword.Parent = character
local humanoid = character:WaitForChild("Humanoid")
humanoid.Died:Connect(function()
respawnPlayerInLobby(player)
removeActivePlayer(player)
end)
end
local function onPlayerJoin(player)
player.RespawnLocation = lobbySpawn
end
local function removePlayerWeapon(whichPlayer)
-- Bir oyuncu bağlantıyı kesmiş veya ayrılmış olup olmadığını görmek için kontrol edin.
if whichPlayer then
local character = whichPlayer.Character
-- Oyuncu bunu şu anda karakterindeyse
local weapon = character:FindFirstChild("Weapon")
if weapon then
weapon:Destroy()
end
-- Oyuncu silahını sırt çantasında taşıyorsa
local backpackWeapon = whichPlayer.Backpack:FindFirstChild("Weapon")
if backpackWeapon then
backpackWeapon:Destroy()
end
else
print("No player to remove weapon")
end
end
function PlayerManager.sendPlayersToMatch()
local availableSpawnPoints = spawnLocations:GetChildren()
for playerKey, whichPlayer in Players:GetPlayers() do
table.insert(activePlayers,whichPlayer)
-- Bir oluşturma yerini alır ve ardından tabloya kaldırılır, böylece bir sonraki oyuncu bir sonraki oluşturma alır
local spawnLocation = table.remove(availableSpawnPoints, 1)
preparePlayer(whichPlayer, spawnLocation)
end
playersLeft.Value = #activePlayers
end
function PlayerManager.getWinnerName()
local winningPlayer = activePlayers[1]
if winningPlayer then
return winningPlayer.Name
else
return "Error: No player found"
end
end
function PlayerManager.removeAllWeapons()
for playerKey, whichPlayer in activePlayers do
removePlayerWeapon(whichPlayer)
end
end
function PlayerManager.resetPlayers()
for playerKey, whichPlayer in activePlayers do
respawnPlayerInLobby(whichPlayer)
end
activePlayers = {}
end
-- Etkinlikler
Players.PlayerAdded:Connect(onPlayerJoin)
return PlayerManager