Zamanlayıcılar ve olaylar

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

Bir tur sırasında, senaryoların zamanı izlemesi ve farklı senaryolar arasında sinyaller göndermesi gerekecektir.Süre, bir zaman senaryosu kullanılarak yönetilecek ve olaylar, Roblox kodlamasındaki bir konsept, bir eşleşmesonu gibi değişiklikleri işaret edecek.

Etkinliklerle sinyaller gönderin

Artık arenada oyuncular var, olaylar maçın başlangıcını işaretlemek ve zamanlayıcının kodu başlamak için kullanılabilir.Daha sonra, bir etkinlik eşleşmesonunu işaretlemek ve oyuncuları lobiye geri dönme zamanı olduğunu bildirmek için de kullanılabilir.

Bu olaylar önceden oluşturulmadı, bu nedenle bağlanabilir olaylar olarak adlandırılan özel olay nesnelerinin oluşturulması gerekecek.Bağlanabilir olaylar genellikle oyuncu tarafından ateşlenen eylemler için kullanılır ve Touched veya Changed gibi olaylara benzer.

Birden fazla kript sayfası aynı bağlanabilir olayları dinleyebilir.Bu, kodunuzu düzenli tutar ve daha sonra maçın başına veya sonuna ekstra kod eklemek daha kolay hale getirir, eğer gerekirse.

Bağlanabilir etkinlikler oluşturma

eşleşmebaşlangıcı ve sonu için bağlanabilir olay nesneleri oluşturarak başlayın.Bağlanabilir olaylar istemciyle etkileşmediğinden, bunlar Sunucu Depolama'ya depolanabilir.

  1. ServerStorage'da, Etkinlikler adlı yeni bir klasör oluşturun. Bu klasörde, MaçBaşlangıcı ve MaçSonu adlı iki BağlanabilirEtkinlik oluşturun.

Etkinlikleri kullan

Şu anda, oyuncular arenaya girdiğinde, aralık süresi zamanlayıcıyı başlatmak yerine yeniden başlatılır.Ana oyun döngüsünün durdurulması ve kodSonraki Bölümüne geçmeden önce MaçBitme etkinliğinin ateşlenmesi gerekiyor.

Etkinliklerin iki yerleşik işlevi vardır: Connect() ve Wait().Daha önce olduğu gibi Connect() kullanmak yerine, MatchEnd'de Wait() duraklatmak için oyun yöneticisi kodunu durdurmak için MatchEnd'e çağrın.Bu durumda, bekleme işlevi oyun yöneticisinin maçın sona erdiğine dair bir sinyal alana kadar kodu duraklatır.

  1. In Oyun Yöneticisi , Events klasörü ve MatchEnd etkinlik için değişkenler oluşturun.


    -- Modül Kodları
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- Etkinlikler
    local events = ServerStorage:WaitForChild("Events")
    local matchEnd = events:WaitForChild("MatchEnd")
  2. Senaryo, devam etmeden önce maç bitiş etkinliğinin ateşlenmesini bekler. döngüsünde , sonunda , şunu yazın: matchEnd.Event:Wait()


    while true do
    repeat
    task.wait(gameSettings.intermissionDuration)
    print("Restarting intermission")
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    -- Yer tutucu, oyunun uzunluğunu bekler.
    matchEnd.Event:Wait()
    end
  3. Test oyunu.Oyuncular bir kez arenada olduğundan emin olun, aralık döngüsü devam etmiyor .Senaryo şimdi matchEnd sinyali ateşlemek için bekliyor.

Sorun giderme ipuçları

Bu noktada, kod beklenen şekilde çalışmıyor, aşağıdakilerden birini deneyin.

  • matchEnd.Event:Wait() 'de nokta veya virgül operatörlerinin kullanımını iki kez kontrol edin.
  • MatchEnd'in bir BindableEvent olduğundan ve başka bir yaz, örneğin RemoteEvent, olmadığından emin olun.

Bir zamanlayıcı kullan

Maçın sona ermesine neden olacak koşullardan biri, senaryo aracılığıyla ele alınacak bir zaman aşırısıdır. One of the conditions that will cause the end of the match is a timer running out, which will be handled through the script.

Zamanlayıcıyı kurun

oyunbir zamanlayıcı eklemek için, aşağıdaki adımlarda önceden yapılmış modül senaryosunu kullanın.Bir zamanlayıcıyı başlatmak ve bitirmek için fonksiyonları içerir ve ayrıca kalan süre miktarını geri verir.

  1. ServerStorage > ModuleScripts'ta, Timer adlı yeni bir modül senaryosu oluşturun.

    Kodu aşağıdaki kodla değiştirin.


    local Timer = {}
    Timer.__index = Timer
    function Timer.new()
    local self = setmetatable({}, Timer)
    self._finishedEvent = Instance.new("BindableEvent")
    self.finished = self._finishedEvent.Event
    self._running = false
    self._startTime = nil
    self._duration = nil
    return self
    end
    function Timer:start(duration)
    if not self._running then
    task.spawn(function()
    self._running = true
    self._duration = duration
    self._startTime = tick()
    while self._running and tick() - self._startTime < duration do
    task.wait()
    end
    local completed = self._running
    self._running = false
    self._startTime = nil
    self._duration = nil
    self._finishedEvent:Fire(completed)
    end)
    else
    warn("Warning: timer could not start again as it is already running.")
    end
    end
    function Timer:getTimeLeft()
    if self._running then
    local now = tick()
    local timeLeft = self._startTime + self._duration - now
    if timeLeft < 0 then
    timeLeft = 0
    end
    return timeLeft
    else
    warn("Warning: could not get remaining time, timer is not running.")
    end
    end
    function Timer:isRunning()
    return self._running
    end
    function Timer:stop()
    self._running = false
    end
    return Timer
  2. MatchManager'da, OyunAyarları ve Zamanlayıcı modüllerini gerektirin.


    local MatchManager = {}
    -- Hizmetler
    local ServerStorage = game:GetService("ServerStorage")
    -- Modül Kodları
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local timer = require(moduleScripts:WaitForChild("Timer"))
  3. Değişkenlerin altında, myTimer eşit olan bir değişken adlandırarak yeni bir zamanlayıcı nesnesi oluşturun timer.new() .Bu nesne, zamanlayıcıyı başlatan ve durduran işlevleri çağırmak için kullanılacaktır.


    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local timer = require(moduleScripts:WaitForChild("Timer"))
    -- Maç süresini izlemek için kullanılacak yeni bir zamanlayıcı nesnesi oluşturur.
    local myTimer = timer.new()

Başlat ve durdur

Artık bir zamanlayıcı oluşturuldu, bir eşleşmesırasında dahil edilen işlevler start() ve stop() kullanın.Aşağıda her bir işlevin açıklaması ve kabul ettiği parametre bulunmaktadır.

  • start(time) - Saati başlatır, parametre olarak saniyelerle süre.
  • finished:Connect(functionName) - Zamanlayıcı bitince, bir parametre olarak geçen işlev çalışır.
  1. In Maç Yöneticisi , zamanlayıcı bitince çalışacak yeni bir işlev oluşturun timeUp() . Bir test yazdırma ifadesi dahil edin.


    local myTimer = timer.new()
    -- Yerel Fonksiyonlar
    local function timeUp()
    print("Time is up!")
    end
    -- Modül İşlevleri
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    return MatchManager
  2. Aşağıda timeUp() , bir yazıcı ifadesi ile adlandırılan bir işlev ekleyin startTimer() . Daha sonra oyundaki zamanlayıcıyı gösterirsiniz.


    -- Yerel Fonksiyonlar
    local function timeUp()
    print("Time is up!")
    end
    local function startTimer()
    print("Timer started")
    end
  3. Zamanlayıcıyı başlatmak ve durdurmak için, startTimer() :

    • Çağrı myTimer.start() . Geçiş gameSettings.matchDuration .
    • Çağrı myTimer.finished:Connect() . Geçiş timeUp() .

    -- Yerel Fonksiyonlar
    local function startTimer()
    print("Timer started")
    myTimer:start(gameSettings.matchDuration)
    myTimer.finished:Connect(timeUp)
    end

Süreç başlatın

Zamanlayıcı, Maç Başlangıç etkinliğini kullanarak bir maçın başlangıcında tetiklenebilir.

  1. Maç Yöneticisinde, modül değişkenlerinin altında, Etkinlik klasörünü, Maç Başlangıcı ve Maç Sonu (gelecekte bir dersde kullanılan) saklamak için değişkenler oluşturun.


    -- Modül Kodları
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    local timer = require(moduleScripts:WaitForChild("Timer"))
    -- Etkinlikler
    local events = ServerStorage:WaitForChild("Events")
    local matchStart = events:WaitForChild("MatchStart")
    local matchEnd = events:WaitForChild("MatchEnd")
    --Zamanlayıcı oluşturur
    local myTimer = timer.new()
  2. Üstünde return MatchManager , maç başlangıç etkinliğini startTimer() 'ye bağla.


    -- Modül İşlevleri
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    matchStart.Event:Connect(startTimer)
    return MatchManager
  3. Maç başlangıç etkinliğini ateşlemek için, prepareGame() , matchStart:Fire() yazın.


    -- Modül İşlevleri
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    matchStart:Fire()
    end
  4. oyuntest edin. Çıktı penceresinde, zamanlayıcının başlangıç ve durdurma işlevleri için yazıcı ifadelerini görebileceğinizi onaylayın.

Tamamlanmış senaryolar

Aşağıda, çalışmanızı kontrol etmek için bitmiş senaryolar bulunmaktadır.

MaçYöneticisi skripti


local MatchManager = {}
-- Hizmetler
local ServerStorage = game:GetService("ServerStorage")
-- Modül Kodları
local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
local playerManager = require(moduleScripts:WaitForChild("PlayerManager"))
local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
local timer = require(moduleScripts:WaitForChild("Timer"))
-- Etkinlikler
local events = ServerStorage:WaitForChild("Events")
local matchStart = events:WaitForChild("MatchStart")
local matchEnd = events:WaitForChild("MatchEnd")
-- Maç süresini izlemek için kullanılacak yeni bir zamanlayıcı nesnesi oluşturur.
local myTimer = timer.new()
-- Yerel Fonksiyonlar
local function timeUp()
print("Time is up!")
end
local function startTimer()
print("Timer started")
myTimer:start(gameSettings.matchDuration)
myTimer.finished:Connect(timeUp)
end
-- Modül İşlevleri
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
matchStart.Event:Connect(startTimer)
return MatchManager

GameManager senaryosu


-- 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"))
-- Etkinlikler
local events = ServerStorage:WaitForChild("Events")
local matchEnd = events:WaitForChild("MatchEnd")
while true do
repeat
task.wait(gameSettings.intermissionDuration)
print("Restarting intermission")
until #Players:GetPlayers() >= gameSettings.minimumPlayers
print("Intermission over")
task.wait(gameSettings.transitionTime)
matchManager.prepareGame()
-- Yer tutucu, oyunun uzunluğunu bekler.
matchEnd.Event:Wait()
end