Zamanlayıcılar ve Etkinlikler

*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 turun süresince, kodlar arasındaki zamanı takip etmek ve sinyalleri göndermek zorunda kalacaktır. Zaman, bir zaman kaydırıcısı kullanılarak yönetilecek, aksi takdirde bir etkinliği Roblox kodlama tarzındaki değişiklikleri gösterir.

Olayları Kullanarak Sinyal Göndermek

Artık arenada olan oyuncularla, etkinlikler kodu işaretlemek için kullanılabilir. Daha sonra, bir etkinliği de kod için zamanlayıcıyı başlatmak için kullanabilirsiniz. Ayrıca, oyuncuları lobiye geri geçmeye geçişle, bir etkinliği de işaretleyebilirsiniz.

Bu olaylar önceden yapılmamıştır, bu yüzden "bağlanabilir olaylar" olarak adlandırılan özel olay nesneleri yaratılması gerekir. "bağlanabilir olaylar" genellikle oyuncu tarafından başlatılan eylemler için kullanılır ve " Touched " veya " Changed" gibi olaylar gibidir.

Aynı bağlantılabilir olaylar için çok sayıda skript dinleyebilir. Bu, kodunuzu düzenler ve maç başlangıcı veya sonunda ek gönderilmiş kodu kolayca eklemek için gerekirse daha sonra mümkündür.

Bağlantılabilir Etkinlikler Oluşturulması

eşleşmebaşlangıcı ve sonuna kadar bağlanabilir etkinlik nesneleri oluşturarak başlayın. Bağlanabilir etkinlikler, client ile etkileşime geçmez, bu nedenle Server Storage'da saklanabilir.

  1. ServerStorage'da, Etkinlikler adında yeni bir klasör oluşturun. Bu klasörde, MatchStart ve MatchEnd adında iki Etkinlik oluşturun.

Etkinlikleri Kullanma

Şu anda, oyuncular arenaya girdiğinde, mola daha sonra başlatılır yerine başlatılır. Açılış oyunu döngüsü, MatchEnd etkinliği başladığından önce hareket etmeye devam etmeden durdurulmalıdır.

Etkinliklerin iki içe aktarılmış işlevi vardır: Connect() ve Wait(). Bunun yerine, Connect() gibi önce kullanıldığı gibi MatchEnd'e 2>Wait2> çağırılır. Bu durumda, bekleme işlevi, oyun yönetici scriptini MatchEnd'e başlatana kadar

  1. In GameManager , Events ve MatchEnd etkinliği için ortam değişkenleri 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. Devam etmeden önce maç bitiş etkinliği için senaryonun beklenmesini sağlayın. döngüde, sonnda, yaz1> matchEnd.Event:Wait()1>


    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 bekleyin.
    matchEnd.Event:Wait()
    end
  3. Test etmeyi oyunu. Onlar arenada olduğunda aradağı devam etmeyi onaylayın. Skript şimdi matchEnd sinyali için bekliyor.

Hata ayıklama ipuçları

Bu noktada, kod beklediğiniz gibi çalışmaz, aşağıdaki birinden deneyin.

  • matchEnd.Event:Wait() içindeki nokta veya boşluk operatörlerinin kullanımını iki kat kontrol edin.
  • MatchEnd'in bir BindableEvent olduğundan ve uzaktaki bir etkinliği değil, diğer yazbiri olduğundan emin olun.

Bir Zamanlayıcıyı Kullan

Maçın sona ermesine neden olacak bir koşul, ters sayım içeren bir zamanlayıcıdır, bu da kodlarda ele alınacaktır.

Zamanlayıcıyı Ayarlama

oyunbir zamanlayıcı eklemek için aşağıdaki adımlardaki önceden yapılmış modül kayıtlarını kullanın. Bu, bir zamanlayıcıyı başlatmak ve bitirmek için işlevleri, ayrıca kalan süreyi iade eder.

  1. ServerStorage > ModülScripts'ta, Timer adında yeni bir modül scripti oluşturun.

    Aşağıdaki kodu kullanın.


    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, GameSettings ve Timer modüllerini gerektirir.


    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, eşdeğer olarak myTimer adında yeni bir zamanlayıcı oluşturun, böylece timer.new() ile aynı. Bu nesne, zamanlayıcıyı başlatıp durduran işlevleri çağıracak.


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

Başlatma ve Durdurma

Bir zamanlayıcı oluşturulduktan sonra, bir eşleşmesırasında dahil işlevleri start() ve stop() kullanın. Aşağıda her işlevin açıklaması ve kabul edilen parçası bulunur.

  • start(time) - Eğer değer olarak saniye içinde zamanlanıyorsa, zamanlayıcıyı başlatır.
  • finished:Connect(functionName) - Timer'ın bitmesiyle, işlev bir parametre olarak çalıştırılır.
  1. In MatchManager , timer'ın bitiminde her zaman çalışacak şekilde yeni bir işlev oluşturun. bir test çıktı deklarasyonu içerin.


    local myTimer = timer.new()
    -- Yerel Fonksiyonlar
    local function timeUp()
    print("Time is up!")
    end
    -- Modülasyon Fonksiyonları
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    return MatchManager
  2. Below timeUp() , bir print statement ile adlandırılmış bir işlev ekleyin. Daha sonra oyun içinde timer'ı göstereceksiniz.


    -- 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şi gameSettings.matchDuration .
    • Çağır myTimer.finished:Connect() . Geçişi timeUp() .

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

Zamanlayıcıyı Başlatıyor

Sayaç, Maç Başlangıcı etkinliği kullanılarak bir maçın başlangıcında başlatılabilir.

  1. MatchManager'da, modül ortam değişkenleri altında, Etkinlikler'i, MatchStart'ı ve MatchEnd'i saklayan ortam değişkenleri oluşturun (bu gelecekteki bir dersinde kullanılır).


    -- 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ıyı oluşturur
    local myTimer = timer.new()
  2. matchManager üzerinde, eşleşme başlangıcı etkinliğini startTimer() ile bağlayın.


    -- Modülasyon Fonksiyonları
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    end
    matchStart.Event:Connect(startTimer)
    return MatchManager
  3. Maç başlangıcı etkinliğini etkinleştirmek için, prepareGame() içinde, matchStart:Fire() yazın.


    -- Modülasyon Fonksiyonları
    function MatchManager.prepareGame()
    playerManager.sendPlayersToMatch()
    matchStart:Fire()
    end
  4. oyuntest edin. Çıkış Penceresinde, timer'ın başlangıcı ve durdurma işlevleri için yazılımları görebileceğinizden emin olun.

Tamamlanan Scriptler

Aşağıda çalışmanızı iki kat kontrol etmek için tamamlanmış kodlar var.

MatchManager Yazılımı


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ç zamanını takip etmek 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ülasyon Fonksiyonları
function MatchManager.prepareGame()
playerManager.sendPlayersToMatch()
matchStart:Fire()
end
matchStart.Event:Connect(startTimer)
return MatchManager

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"))
-- 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 bekleyin.
matchEnd.Event:Wait()
end