Oyun döngüsünü kodla

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

Harita oluşturulduktan sonra, senaryoları oluşturmaya başlama zamanı geldi.Bu kursun geri kalanı, oyun döngüsünün tüm farklı elemanlarını senaryolaştırmaya ağırlık verecek.

Senaryoları kurun

Savaş kraliyeti, modül kriptleri ve normal kriptlerin bir kombinasyonunu kullanacaktır. Aşağıda kriptler ve işlevleri bulunmaktadır.

OyunYöneticisiScript. Oyun Ayarlarından değişkenler kullanarak Maç Yöneticisinden işlevleri çalıştırır
MaçYöneticisiModül Kodu. Oyuncuları bir arenaya göndermek veya bir eşleşmezamanı takip etmek gibi işlevleri yürütür.
OyunAyarlarıModül Kodu. Diğer kodlar tarafından kullanılan yaygın kullanılan değişkenleri saklar.

OyunAyarları scripti

Maç ve aralık süresi gibi diğer senaryolarda kullanılan değişkenleri depolamak için GameSettings adlı bir modül senaryosu oluşturun.Bu değişkenler daha sonra GameManager scripti tarafından kullanılacaktır.

  1. In Sunucu Depolama , ModülScripts adlı bir klasör oluşturun. Bu klasörde, GameSettings adlı yeni bir modül senaryosu oluşturun.

  2. Oyun Ayarları'nı aç ve modül tablosunun adına uymak için yeniden adlandır.


    local GameSettings = {}
    return GameSettings
  3. Modül tablosunda, aşağıdaki kullanımlar için değişkenler ekleyin. Her değer için en iyi tahmininizi yapın, daha sonra test ederken her zaman değiştirebilirsiniz.

    • Mola Süresi - Oyuncular bir eşleşmeönce beklerler.
    • Maç Süresi - Bir maçın saniye süresi.
    • En Az Oyuncu - başlatiçin en küçük oyuncu sayısı.
    • Geçiş Süresi - Bir maçın saniyeler öncesi ve sonrasındaki süre. Oyun döngüsünün parçaları arasında geçişi daha az ani hale getirir.

    local GameSettings = {}
    -- Oyun Değişkenleri
    GameSettings.intermissionDuration = 5
    GameSettings.matchDuration = 10
    GameSettings.minimumPlayers = 2
    GameSettings.transitionTime = 5
    return GameSettings

MaçYöneticisi skripti

Oyun Yöneticisine bağlanan ikinci senaryo, Maç Yöneticisidir.Bu senaryo, zamanlayıcıyı başlatmak veya maç bitince oyuncuları sıfırlamak gibi görevleri yönetir.

MatchManager içinde prepareGame() adlı bir işlev oyuncuları eşleşmegeçirerek oyunu başlatır.

  1. ServerStorage > ModülScriptları > MatchManager adlı bir modül senaryosu ekleyin. Modül tablosunu yeniden adlandırın.


    local MatchManager = {}
    return MatchManager
  2. MatchManager adlı yeni bir modül işlevi ekleyin prepareGame() . Daha sonra kodu test etmek için bir yazdırma ifadesi dahil edin.


    local MatchManager = {}
    function MatchManager.prepareGame()
    print("Game starting!")
    end
    return MatchManager

Oyun döngüsünü kodla

Ana oyun döngüsü, yeni oluşturulan değişkenleri kullanarak GameManager scriptinde kodlanacaktır.Unutma, oyun döngüsünde üç faz var: mola, rekabet ve temizleme ve sıfırlama.

GameManager senaryosu

Bu senaryo normal bir sunucu senaryosudur, bu nedenle modül senaryo klasörü yerine ServerScriptService'e yerleştirin.Gerçek oyun döngüsü bir while true döngüsünde olacaktır.

  1. ServerScriptService'te, GameManager adlı yeni bir senaryo oluşturun.

  2. Modül kodlarının bulunduğu yer olan hizmet "ServerStorage" için bir değişken ekleyin.Ardından, mola sırasında oyuncu sayısını kontrol etmek için gereken "Oyuncular" hizmeti için bir değişken ekleyin.


    -- Hizmetler
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
  3. Daha önce oluşturulan modülleri kullanmak için:

    • ModülScripts klasörünün konumuna moduleScripts adlı bir değişken ayarlayın.
    • matchManager ve gameSettings adlı değişkenler ekleyin. Her değişkenin kendi skriptine ihtiyaç duymasını sağlayın.

    -- 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"))
  4. Değişkenlerden sonra, bir while true do döngüsü ekleyin. Oyun döngüsünün tüm aşamaları süresiz tekrarlanmak üzere içeri gidecektir.


    -- Modül Kodları
    local moduleScripts = ServerStorage:WaitForChild("ModuleScripts")
    local matchManager = require(moduleScripts:WaitForChild("MatchManager"))
    local gameSettings = require(moduleScripts:WaitForChild("GameSettings"))
    -- Ana oyun döngüsü
    while true do
    end

M molası kodlayın

Oyun döngüsü süresiz olarak çalışırken, mola döngüyü durdurmalı ve sadece bir eşleşmeiçin yeterli oyuncu olduğunda devam etmelidir.Bu duraklamayı kodlamak için, mola için while döngüsünde iç içe geçmiş bir tekrar döngüsü ekleyin.Bu yerleşik döngü, yeterli sayıda oyuncu olana kadar tekrarlanacak ve ana döngüyü duraklatacaktır.Yeterli oyuncu olduğunda, oyuncuları bir eşleşmeçıkarıp geçiş yapacaktır.

Bir tekrar döngüsü ile, döngüdeki kod en az bir kez çalışacaktır.Bir while döngüsünden farklı olarak, döngü bitene kadar koşulunu kontrol etmez.Bu, oyuncuların her zaman bir eşleşmeönce lobiye gitmesini sağlar.

  1. while true do döngüsünde, anahtar kelime ile otomatik tamamlanmak için repeat yazın ve Enter basın ile anahtar kelime ile otomatik tamamlanmak için until .


    while true do
    repeat
    until
    end
  2. Mevcut oyuncu sayısı (#Players:GetPlayers()) daha büyük veya GameSettings modülünde daha önce oluşturulan minimumPlayers değişkenine eşit olup olmadığını kontrol edin.


    while true do
    repeat
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  3. Tekrarlayan döngüde, mola başladığını belirten bir yazım ifadesi ekleyin.OyunAyarlarından task.wait() kullanarak mola vermeyi duraklatmak için intermissionDuration kullanın.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    end
  4. Oynatma testi yapın ve yazım ifadesinin en az iki kez gösterildiğinden emin olun "Starting intermission" .Mesajı iki kez görmek, tekrar eden döngünün yeterli oyuncu bulmadığını ve tekrar çalıştığını kanıtlar.Mesajı ikinci kez görmeden önce mola süresini beklemek zorunda kalacaksınız.

Sorun giderme ipuçları

Bu noktada, niyet edildiği gibi yaratmıyorsanız, aşağıdakilerden birini deneyin.

  • task.wait() tekrar döngüsünün içinde olmalıdır.Bekleme olmadan, senaryo bir saniye içinde çok kez çalışacak ve Roblox Studio'yu aşırı yükleyecek ve bir hata verecek.
  • Oyun Ayarları modunda, değişken intermissionDuration 1'den büyük olmalıdır. Eğer daha düşükse, senaryo çok sık tekrarlanabilir ve yavaşlama sorunlarına neden olabilir.

M molasını bitir

Yeterli oyuncu olduğunda, kısa bir geçiş süresi beklemelerini sağlayın.Sonra, onları Maç Yöneticisindeki prepareGame() işlevini çağırarak maça gönderin.Unutma, bu işlev sadece bir satır basar, ancak daha sonra daha fazla kod ekleyeceksin.

  1. Tekrar döngüsünün sonunda, aradan çıkmanın kodunuzu test etmek için sona erdiğini belirten bir yazıcı ifadesi ekleyin.Sonra, bunu GameSetting'in değişkeni kullanarak takip edin.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    end
  2. Beklemeden sonra, MatchManager modülünden prepareGame() 'yi arayın.Kod çalıştığında, bu sadece Çıktı penceresine metin basacaktır.Bu kodu test etmek için bir sonraki bölüme kadar bekleyin.


    while true do
    repeat
    print("Starting intermission")
    task.wait(gameSettings.intermissionDuration)
    until #Players:GetPlayers() >= gameSettings.minimumPlayers
    print("Intermission over")
    task.wait(gameSettings.transitionTime)
    matchManager.prepareGame()
    end

Çok oyunculu oyunları test et

Şu anda, kodun çalışması için prepareGame() , tekrar döngüsünden çıkması gerekiyor.Ancak, bunu yapmak için birden fazla oyuncu olması gerekiyor.Yani oyun testi düğmesini kullanırsanız, işlev asla çalışmayacak çünkü oyundaki tek oyuncusunuz (minimum oyuncunuz bir olmadıkça).Bunu test etmek için, çok oyunculu bir oyunu simüle etmeniz gerekecek.

Yerel bir sunucu başlatın

Birden fazla oyuncu gerektiren kodu test etmek için, yerel bir sunucu oluşturun.Yayınlanmış oyunlar normalde Roblox sunucularında bulunurken, bir yerel sunucu simüle edilen oyuncularla bilgisayarınızda çok oyunculu bir oyunu simüle eder.

  1. Yerel bir sunucu başlatmak için, Test sekmesinde > Müşteriler ve Sunucular bölümünde > oyuncu düşürmeyi GameSetting'in değişken minimumPlayers sayısına ayarlayın.Bu ders 2 oyuncu kullanır.

  2. sunucubaşlatmak için Başlat'a tıklayın.

  3. Sunucunun kurulması için birkaç saniye bekleyin.Orijinal Studio penceresine ek olarak birden fazla pencere açılacaktır.Roblox Studio'ya erişime izin vermeniz gerekebilir firewall'lardan veya diğer online güvenlik yazılımlarından.

Sorun giderme ipuçları

Bu noktada, test sunucularını göremiyorsunuz, aşağıdan birini deneyin.

  • Sunucunun başlatılmasıyla ilgili herhangi bir sorununuz varsa, makale Ateş Duvarı ve Yönlendirici Sorunları 'ı iki kez kontrol edin.
  • Oyuncu sayısını 2 veya 3 gibi ufak bir miktara ayarlayın.
  • Sorun çözülmediyse, Studio'yu yeniden başlatmayı veya bilgisayarınızı yeniden başlatmayı deneyin.

Yerel sunucuda test et

Sunucu başladığında çok sayıda pencere göreceksiniz. Her biri, sunucu/istemci ilişkisinin farklı bir parçasını temsil eder.

  • Sunucu (yeşil sınır) oyunu çalıştırır.
  • Müşteri (mavi sınırlar) bir oyuncunun deneyimini simüle eder.

Yeşil çerçeveli sunucu
>

Mavi çerçeveli istemci
>

Sunucu açık olduğunda, kodun çalışıp çalışmadığını kontrol edebilirsiniz.

  1. Yeşil çerçeveli Sunucu penceresini bulun.MatchManager betiğinden çağrılan baskı ifadesini kontrol edin.Tekrarlayan bir döngü olduğundan, aynı yazım ifadelerinin tekrar edildiğini göreceksiniz.

  2. Testten sonra, herhangi bir pencerede, temizleme düğmesiyle sunucuyu kapatın.Bu, tüm Sunucu ve İstemci pencerelerini kapatır ve normal Studio penceresine geri döndürür.

Sorun giderme ipuçları

Bu noktada, hedeflenen yazım ifadeleri görünmediyse, aşağıdakilerden birini deneyin.

  • prepareGame() gibi işlevlerin while do döngüsünün sınırında olduğundan emin olun.
  • Eğer MatchManager'dan yazdırma çalışmıyorsa, MatchManager scriptinin GameManager'da gerekli olduğundan emin olmak veya bu modülün tablosuna prepareGame() eklenmesi gibi bazı yaygın sorun giderme yöntemlerini kontrol edin.

Tamamlanmış senaryolar

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

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"))
-- Ana oyun döngüsü
while true do
repeat
print("Starting intermission")
task.wait(gameSettings.intermissionDuration)
until #Players:GetPlayers() >= gameSettings.minimumPlayers
print("Intermission over")
task.wait(gameSettings.transitionTime)
matchManager.prepareGame()
end

MaçYöneticisi skripti


local MatchManager = {}
function MatchManager.prepareGame()
print("Game starting!")
end
return MatchManager

OyunAyarları scripti


local GameSettings = {}
-- Oyun Değişkenleri
GameSettings.intermissionDuration = 5
GameSettings.roundDuration = 10
GameSettings.minimumPlayers = 2
GameSettings.transitionTime = 5
return GameSettings