Temizlik ve Sıfırlama

*Bu içerik, yapay zekâ (beta) kullanılarak çevrildi ve hatalar içerebilir. Sayfayı İngilizce görüntülemek için buraya tıkla.

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.

  1. PlayerManager'da, getWinnerName() adında yeni bir modül işlevini başlatın.


    function PlayerManager.getWinnerName()
    end
    -- Etkinlikler
    Players.PlayerAdded:Connect(onPlayerJoin)
  2. 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 then
    end
    end
  3. if ifadesinde:

    • oyuncuismini geri al.
    • Diğerleri için bir hata diziyapın.

    function PlayerManager.getWinnerName()
    local winningPlayer = activePlayers[1]
    if winningPlayer then
    return winningPlayer.Name
    else
    return "Error: No winning player found"
    end
    end

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.

  1. 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()
    end
    function MatchManager.getEndStatus(endState)
    local statusToReturn
    end
    matchStart.Event:Connect(startTimer)
    matchEnd.Event:Connect(stopTimer)
    return MatchManager
  2. statusToReturn 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 statusToReturn
    if endState == gameSettings.endStates.FoundWinner then
    elseif endState == gameSettings.endStates.TimerUp then
    else
    end
    end
  3. Her 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 statusToReturn
    if endState == gameSettings.endStates.FoundWinner then
    local winnerName = playerManager.getWinnerName()
    statusToReturn = "Winner is : " .. winnerName
    elseif endState == gameSettings.endStates.TimerUp then
    statusToReturn = "Time ran out!"
    else
    statusToReturn = "Error found"
    end
    end
  4. return statusToReturn yazıp mesajı geri gönderin.


    function MatchManager.getEndStatus(endState)
    local statusToReturn
    if endState == gameSettings.endStates.FoundWinner then
    local winnerName = playerManager.getWinnerName()
    statusToReturn = "Winner is : " .. winnerName
    elseif endState == gameSettings.endStates.TimerUp then
    statusToReturn = "Time ran out!"
    else
    statusToReturn = "Error found"
    end
    return statusToReturn
    end

Görüntülenmesi ve Testlenmesi

GameManager'da güncellemeyi al ve DisplayManager'ı kullanarak oyunculara göster.

  1. 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 do
    displayManager.updateStatus("Waiting for Players")
    repeat
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    displayManager.updateStatus("Get ready!")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    local endState = matchEnd.Event:Wait()
    local endStatus = matchManager.getEndStatus(endState)
    end
  2. Geri bildirilen mesajı GUI etiketinde görmek için, displayManager.updateStatus() çağır ve endStatus geç.


    local endStatus = matchManager.getEndStatus(endState)
    displayManager.updateStatus(endStatus)
  3. 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)
  4. 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.

    Zaman aşımı koşulu
    Kazanan oyuncu durumu

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.

  1. 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 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
  2. RemoveAllWeapons() adında yeni bir modül işlevi başlat.


    function PlayerManager.removeAllWeapons()
    end
    -- Etkinlikler
    Players.PlayerAdded:Connect(onPlayerJoin)
    return PlayerManager
  3. Bu 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 do
    removePlayerWeapon(whichPlayer)
    end
    end

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.

  1. Open MatchManager. Add a new module function named cleanupMatch() . In that function, call playerManager.removeAllWeapons() .


    function MatchManager.cleanupMatch()
    playerManager.removeAllWeapons()
    end
    matchStart.Event:Connect(startTimer)
    matchEnd.Event:Connect(stopTimer)
    return MatchManager
  2. Ardı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 do
    displayManager.updateStatus("Waiting for Players")
    repeat
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    displayManager.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)
    end
  3. Bir 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.

    Bir maç sırasında.
    Maçtan sonra

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.

  1. 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 do
    respawnPlayerInLobby(whichPlayer)
    end
    end
    -- Etkinlikler
    Players.PlayerAdded:Connect(onPlayerJoin)
    return PlayerManager
  2. Bir 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 do
    respawnPlayerInLobby(whichPlayer)
    end
    activePlayers = {}
    end
  3. Open MatchManager. Kod aşağıdaki yeni modül fonksiyonu resetMatch() ve playerManager.resetPlayers() ile çağrılır.


    function MatchManager.resetMatch()
    playerManager.resetPlayers()
    end
    matchStart.Event:Connect(startTimer)
    matchEnd.Event:Connect(stopTimer)
    return MatchManager
  4. GameManager'e geri dönün. Süre sonunda doğru yapılan döngü, matchManager.resetMatch() çağırın.


    while true do
    displayManager.updateStatus("Waiting for Players")
    repeat
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    displayManager.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
  5. Bir 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


-- Hizmetler
local 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"))
-- Etkinlikler
local events = ServerStorage:WaitForChild("Events")
local matchEnd = events:WaitForChild("MatchEnd")
while true do
displayManager.updateStatus("Waiting for Players")
repeat
task.wait(gameSettings.intermissionDuration)
until #Players:GetPlayers() >= gameSettings.minimumPlayers
displayManager.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