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.
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
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"))-- Etkinliklerlocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")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 dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()-- Yer tutucu oyunun uzunluğunu bekleyin.matchEnd.Event:Wait()endTest 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.
ServerStorage > ModülScripts'ta, Timer adında yeni bir modül scripti oluşturun.
Aşağıdaki kodu kullanın.
local Timer = {}Timer.__index = Timerfunction Timer.new()local self = setmetatable({}, Timer)self._finishedEvent = Instance.new("BindableEvent")self.finished = self._finishedEvent.Eventself._running = falseself._startTime = nilself._duration = nilreturn selfendfunction Timer:start(duration)if not self._running thentask.spawn(function()self._running = trueself._duration = durationself._startTime = tick()while self._running and tick() - self._startTime < duration dotask.wait()endlocal completed = self._runningself._running = falseself._startTime = nilself._duration = nilself._finishedEvent:Fire(completed)end)elsewarn("Warning: timer could not start again as it is already running.")endendfunction Timer:getTimeLeft()if self._running thenlocal now = tick()local timeLeft = self._startTime + self._duration - nowif timeLeft < 0 thentimeLeft = 0endreturn timeLeftelsewarn("Warning: could not get remaining time, timer is not running.")endendfunction Timer:isRunning()return self._runningendfunction Timer:stop()self._running = falseendreturn TimerMatchManager'da, GameSettings ve Timer modüllerini gerektirir.
local MatchManager = {}-- Hizmetlerlocal 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"))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.
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 Fonksiyonlarlocal function timeUp()print("Time is up!")end-- Modülasyon Fonksiyonlarıfunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endreturn MatchManagerBelow timeUp() , bir print statement ile adlandırılmış bir işlev ekleyin. Daha sonra oyun içinde timer'ı göstereceksiniz.
-- Yerel Fonksiyonlarlocal function timeUp()print("Time is up!")endlocal function startTimer()print("Timer started")endZamanlayı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 Fonksiyonlarlocal 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.
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"))-- Etkinliklerlocal events = ServerStorage:WaitForChild("Events")local matchStart = events:WaitForChild("MatchStart")local matchEnd = events:WaitForChild("MatchEnd")--Zamanlayıcıyı oluştururlocal myTimer = timer.new()matchManager üzerinde, eşleşme başlangıcı etkinliğini startTimer() ile bağlayın.
-- Modülasyon Fonksiyonlarıfunction MatchManager.prepareGame()playerManager.sendPlayersToMatch()endmatchStart.Event:Connect(startTimer)return MatchManagerMaç 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()endoyuntest 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
-- 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"))-- Etkinliklerlocal events = ServerStorage:WaitForChild("Events")local matchEnd = events:WaitForChild("MatchEnd")while true dorepeattask.wait(gameSettings.intermissionDuration)print("Restarting intermission")until #Players:GetPlayers() >= gameSettings.minimumPlayersprint("Intermission over")task.wait(gameSettings.transitionTime)matchManager.prepareGame()-- Yer tutucu oyunun uzunluğunu bekleyin.matchEnd.Event:Wait()end