Takımları Kurma
Bu bölümde, oyunun başında Avcı ve Nesne takımlarını kurmayı ve bunları başlangıç alanlarına ışınlamayı öğreneceksin.
Bu sayfa, bu oynanışta ihtiyaç duyulan oyun mekaniğinin nasıl yürütüleceğini gösteren Verse kod parçacıkları içerir. Aşağıdaki adımları izle ve bu eğitimin 6. adımındaki kodun tamamını kopyala.
Takımlarını doğru şekilde kurmak için şu adımları izle:
-
Yeni bir SetupTeams() fonksiyonu oluştur. Burada, daha sonra tanımlayacağın fonksiyonlara (ör. bir nesne avlandığında kullanılacak fonksiyonlar veya bir oyuncu oyuna katıldığında ne yapılacağı gibi) birden fazla bağlanma oluşturacaksın.
# Bir raunt başlatıldığında takım cihazlarına bağlan, rastgele bir şekilde avcı aracılarını seç, avcı süreölçerini etkinleştir, nesne aracılarını ayarla ve onları oyun alanına ışınla. SetUpTeams()<suspends>:void = Logger.Print("Takımlar kuruluyor.")
-
Öncelikle nesne takımının puan süreölçeri SuccessEvent’e, nesne takımı TeamManager’ının Avlanma Olayına bağlan ve puan yöneticisinin puanını verildi olarak ayarla.
# Bir raunt başlatıldığında takım cihazlarına bağlan, rastgele bir şekilde avcı aracılarını seç, avcı süreölçerini etkinleştir, nesne aracılarını ayarla ve onları oyun alanına ışınla. SetUpTeams()<suspends>:void = Logger.Print("Takımlar kuruluyor.") # Nesne takımı puan süreölçerine bağlan, puan ödülünü ayarla ve nesne takımının avlanma olayına bağlan. PropTeam.ScoreTimer.SuccessEvent.Subscribe(PropTeam.OnPropsScore) PropTeam.ScoreManager.SetScoreAward(PropTeam.ScorePerSecond) PropTeam.TeamManager.TeamMemberEliminatedEvent.Subscribe(OnPropEliminated) # Bir nesne aracısı avlandığında gerçekleşir.
-
Ardından aynısını avcı takımı için de yap. Sonrasında avcı takımının bekleme süreölçerini avcılar için istediğin doğma gecikmesine ayarla.
# Bir raunt başlatıldığında takım cihazlarına bağlan, rastgele bir şekilde avcı aracılarını seç, avcı süreölçerini etkinleştir, nesne aracılarını ayarla ve onları oyun alanına ışınla. SetUpTeams()<suspends>:void = Logger.Print("Takımlar kuruluyor.") # Nesne takımı puan süreölçerine bağlan, puan ödülünü ayarla ve nesne takımının avlanma olayına bağlan. PropTeam.ScoreTimer.SuccessEvent.Subscribe(PropTeam.OnPropsScore) PropTeam.ScoreManager.SetScoreAward(PropTeam.ScorePerSecond) PropTeam.TeamManager.TeamMemberEliminatedEvent.Subscribe(OnPropEliminated) # Bir nesne aracısı avlandığında gerçekleşir. # Avcı takımının bekleme süreölçerine bağlan ve süreyi ayarla. Ayrıca avcı takımının avlama olayına da bağlan. HunterTeam.WaitTimer.SuccessEvent.Subscribe(HuntersGo) HunterTeam.WaitTimer.SetMaxDuration(HunterTeam.SpawnDelay) HunterTeam.TeamManager.EnemyEliminatedEvent.Subscribe(OnHunterEliminated) # Bir avcı aracısı bir nesne aracısını avladığında gerçekleşir.
-
SetupTeams()
içinde de başlangıç avcısı ve nesne aracı dizilerini başlat, ardından bekleme Gösterge Panelini etkinleştirirken oyunu başlatmak için yeterli oyuncu olup olmadığını kontrol et. Yeterli oyuncu varsa, bekleme Gösterge Panelini devre dışı bırak.# Başlangıç avcısı ve nesne aracı dizilerini başlat. Oyuncuları al ve sunucudaki oyuncu sayısını bul var StartingHunterAgents:[]agent = array{} var StartingPropAgents:[]agent = array{} var Players:[]player = GetPlayspace().GetPlayers() # Oyuncuları beklemek için uygun olan Gösterge Panelini etkinleştir. HUDControllerWaiting.Enable() # Raundu başlatmak için, yeterli oyuncu olup olmadığını kontrol et. set Players = WaitingForMorePlayers.WaitForMinimumNumberOfPlayers(Players) Logger.Print("Raunt başlatıldı.") # Bir sonraki en yüksek öncelikli Gösterge Panelini kullanmak için, bekleme Gösterge Panelini devre dışı bırak. HUDControllerWaiting.Disable()
-
Artık raunt başladığına göre, bir oyuncu maça katıldığında veya maçtan çıkarıldığında ne olacağını yönetmen gerekir. Abonelikleri burada kuracak ve bu fonksiyonları daha sonra tanımlayacaksın.
# Artık raunt başladığına göre, oyuncuların maça eklenmesi veya maçtan çıkarılması durumunu yönetmemiz gerekir. Bu olaylara bağlan. GetPlayspace().PlayerAddedEvent().Subscribe(OnPlayerAdded) GetPlayspace().PlayerRemovedEvent().Subscribe(OnPlayerRemoved)
-
Başlangıç avcılarının sayısı, oyununda kaç oyuncu olduğuna bağlıdır. Bir avcının on oyuncuyla uğraşmak zorunda kalması uygun olmayacağından avcı sayısını bir formüle göre ayarlayan bir fonksiyon oluşturursun. Oyuncu sayısını, formülde kullanılacak bir kayan sayıya dönüştür.
# Oyuna ilişkin başlangıç avcı aracılarının sayısını, oyuncu sayısına ve oyuncu sayısı başına avcı aracısı sayısına göre hesapla. NumberOfPlayers:float = 1.0 * Players.Length # Players.Length’i, bir sonraki Tavana Yuvarlama (Ceil) fonksiyonunda kullanılabilmesi için kayan sayıya dönüştürür.
-
Şimdi başlangıç avcılarının sayısını aşağıdaki formülün tavanına yuvarlayarak ayarla. Ardından ilk avcıların oyuncu listesinden rastgele bir şekilde seçilmesi doğru olacağı için tüm oyuncular dizisini karıştır.
# Oyuna ilişkin başlangıç avcı aracılarının sayısını, oyuncu sayısına ve oyuncu sayısı başına avcı aracısı sayısına göre hesapla. NumberOfPlayers:float = 1.0 * Players.Length # Players.Length’i, bir sonraki Tavana Yuvarlama (Ceil) fonksiyonunda kullanılabilmesi için kayan sayıya dönüştürür. if (NumberOfStartingHunters:int = Ceil[NumberOfPlayers / Max(1.1, HunterTeam.HunterAgentPerNumberOfPlayers)]): # Oyuncuları karıştır ve ardından başlangıç avcı aracılarını almak için diziyi dilimle. Kalan oyuncular başlangıç nesne aracılarıdır. var RandomizedPlayers:[]agent = Shuffle(Players)
-
Rastgele hale getirilmiş diziyi 0 ile başlangıç avcı sayın arasında bir boyuta dilimle. Bu ilk avcının takımı olacak, dolayısıyla onu StartHunterAgents olarak ayarla. Oyuncuların geri kalanı ilk nesne takımı olacak, bu nedenle onları StartPropAgents olarak ayarla.
# Oyuna ilişkin başlangıç avcı aracılarının sayısını, oyuncu sayısına ve oyuncu sayısı başına avcı aracısı sayısına göre hesapla. NumberOfPlayers:float = 1.0 * Players.Length # Players.Length’i, bir sonraki Tavana Yuvarlama (Ceil) fonksiyonunda kullanılabilmesi için kayan sayıya dönüştürür. if (NumberOfStartingHunters:int = Ceil[NumberOfPlayers / Max(1.1, HunterTeam.HunterAgentPerNumberOfPlayers)]): # Oyuncuları karıştır ve ardından başlangıç avcı aracılarını almak için diziyi dilimle. Kalan oyuncular başlangıç nesne aracılarıdır. var RandomizedPlayers:[]agent = Shuffle(Players) if (set StartingHunterAgents = RandomizedPlayers.Slice[0,NumberOfStartingHunters]) {} if (set StartingPropAgents = RandomizedPlayers.Slice[NumberOfStartingHunters,RandomizedPlayers.Length]) {} # Başlangıç avcı aracılarının üzerinden geç ve onları avcı takımına ata. Ardından avcı bekleme süreölçerini başlat. Logger.Print("{StartingHunterAgents.Length} avcı aracıları ayarlanıyor") for (StartingHunterAgent : StartingHunterAgents): HunterTeam.InitializeAgent(StartingHunterAgent) HunterTeam.WaitTimer.Start() # Başlangıç nesne aracılarının üzerinden geç ve onları nesne takımına ata. Onları oyun alanına ışınla. Logger.Print("{StartingPropAgents.Length} nesne aracıları ayarlanıyor.")
-
Artık takımlar ayarlandığına göre, nesneleri başlangıç odasından ışınlamak için lobi ışınlayıcısını ve nesnelerin HeartBeat’ini etkinleştir. Ardından, bundan sonra ihtiyacın olmayacağı için lobi ışınlayıcısını devre dışı bırak. Son olarak PropsRemainingTracker’da kalan nesne sayısını, nesneler takımının boyutuna ayarla.
LobbyTeleporter.Enable() for (StartingPropAgent : StartingPropAgents): PropTeam.InitializeAgent(StartingPropAgent) PropTeam.HeartBeat.SetUpUI(StartingPropAgent) LobbyTeleporter.Activate(StartingPropAgent) LobbyTeleporter.Disable() # Nesnelerin kalan takip cihazının Hedefini ve Değerini geçerli nesne sayısına ayarla. # Önümüzdeki dönemde, Değeri yalnızca nesneler avlandığında güncelleyeceğiz. PropTeam.PropsRemainingTracker.SetTarget(PropTeam.Count()) PropTeam.UpdatePropsRemainingTracker()
Oyuncu Avlamalarını Yönetme
Avcılar tüm nesneleri avlayıp onları avcılara dönüştürerek kazanır. Bir nesne avlandığında avcılara bir puan vermek ve avlanan nesneleri avcıların takımına aktarmak için bu adımları izle.
-
OnHunterEliminated() adında bir fonksiyon oluştur. Avcı takım yöneticisi cihazı EnemyEliminatedEvent’i buna daha önce bağlamıştın, dolayısıyla bir avcı bir nesneyi avladığında bu etkinleşecektir.
# Bir avcı aracısı, bir nesne aracısını avladığında puan ver. Puan, kalan nesne aracılarının sayısına bölünür. OnHunterEliminated(HunterAgent:agent):void = Logger.Print("Avcı aracısı, bir nesne aracısını avladı.")
-
Öncelikle avcılara kalan nesne aracılarının sayısıyla orantılı bir puan vermen gerekir.
MaxEliminationScore
değerininPropTeamSize
değerine bölünmesiyle elde edilen değere eşit olan,EliminationAward
adlı bir değişken oluştur. Avcı takımı puan yöneticisini bu puana ayarla, ardından avlamayı yapan avcıya puanı ver.# Bir avcı aracısı, bir nesne aracısını avladığında puan ver. Puan, kalan nesne aracılarının sayısına bölünür. OnHunterEliminated(HunterAgent:agent):void = Logger.Print("Avcı aracısı, bir nesne aracısını avladı.") PropTeamSize := PropTeam.Count() if (EliminationAward := Floor(HunterTeam.MaxEliminationScore / PropTeamSize)): Logger.Print(“{EliminationAward} puan veriliyor.”) HunterTeam.ScoreManager.SetScoreAward(EliminationAward HunterTeam.ScoreManager.Activate(HunterAgent)
-
Bir nesne avlandığında nesne takımına ne olacağını da netleştirmen gerekir. OnPropEliminated() adında bir fonksiyon oluştur. OnHunterEliminated() gibi, bu fonksiyona daha önce bağlanmıştın. Bir nesne avlandığında, onu PropTeam’in EliminateAgent() fonksiyonunu kullanarak nesne takımından çıkarman, ardından HunterTeam’in InitializeAgent() fonksiyonu ile bir avcı olarak başlatman gerekir.
# Bir nesne avlandığında, onu nesne takımından çıkar, raunt sonu olup olmadığını kontrol et ve nesneyi avcı olarak ayarla. OnPropEliminated(PropAgent:agent):void = Logger.Print("Nesne aracısı avlandı.") spawn{ PropTeam.EliminateAgent(PropAgent) } HunterTeam.InitializeAgent(PropAgent)
Oyuncuların Oyuna Katılmasını ve Oyundan Ayrılmasını Yönetme
Bir oyuncu, oyuna raundun ortasında katıldığında, onun bir avcı olarak doğması doğru olacaktır.
-
Bu durumu yönetmek için OnPlayerAdded() adında bir fonksiyon oluştur. Bu fonksiyon yalnızca avcı olarak katılan oyuncuyu başlatır.
# Bir oyuncu, maça raundun ortasında katıldığında, onu bir avcı yap. OnPlayerAdded(Player:player):void = Logger.Print("Bir oyuncu oyuna katıldı.") HunterTeam.InitializeAgent(Player)
-
Oyuncuların maçtan ayrılması ise biraz daha karmaşıktır. Bir oyuncu maçtan ayrılırsa, onu bulunduğu takımdan çıkarmamız ve maçtan ayrılmasının oyunun bitmesine neden olup olmadığını da kontrol etmemiz gerekir. Bunun nedeni, ayrılan oyuncunun son nesne veya tek avcı olması olabilir. Bu mantık, her takımdaki EliminateAgent() fonksiyonları tarafından yönetilir, dolayısıyla çıkarılan oyuncunun hangi takımdan olduğuna bağlı olarak bunların bir örneğini üretirsin.
# Bir oyuncu maçtan ayrıldığında, o oyuncunun hangi takımda olduğunu, ardından raunt sonu olup olmadığını kontrol et. OnPlayerRemoved(Player:player):void= Logger.Print("Bir oyuncu oyundan ayrıldı.") if (PropTeam.FindOnTeam[Player]): Logger.Print("Oyuncu bir Nesneydi.") spawn{ PropTeam.EliminateAgent(Player) } if (HunterTeam.FindOnTeam[Player]): Logger.Print("Oyuncu bir Avcıydı.") spawn{ HunterTeam.EliminateAgent(Player) }
Raunt Sonu
Tüm takımlar kurulduktan sonra, raunt sonu olup olmadığını kontrol etmek için her takımın büyüklüğünü izlemen gerekir. Oyun, takımlardan herhangi biri boş hale geldiğinde veya raunt süresi dolduğunda sona erer; dolayısıyla hangisinin daha önce gerçekleştiğini görmek için bir yarış ifadesi kullanırsın.
-
OnBegin() fonksiyonunun sonunda, bir yarış ifadesinde, Await() hem avcı ve nesne takımının TeamEmptyEvent’ine hem de RoundTimer’ın AwaitEnd() fonksiyonuna Await()’i uygula. Yarış bittiğinde, bir sonraki adımda tanımlayacağın EndRound() fonksiyonunu çağır.
# Artık başka nesne veya avcı aracısı kalmadığında (hangisi önce olursa) veya raunt süreölçeri bittiğinde veya raunt sona erdiğinde race: PropTeam.TeamEmptyEvent.Await() HunterTeam.TeamEmptyEvent.Await() RoundTimer.AwaitEnd() Logger.Print("Raunt bitiyor.") EndRound()
-
EndRound() fonksiyonunda, nesne takımındaki her oyuncu için kalp atışı sensörünü devre dışı bırakman ve RoundSettings cihazında EndRound()’u çağırman gerekir. RoundSettings cihazındaki EndRound() fonksiyonuna bir oyuncu aktarılması gerektiğinden Oyuncular dizisindeki ilk oyuncuyu al ve onu başlatıcı olarak aktar.
# Kalp atışı Görsel Efektini temizler ve ardından raundu bitirir. EndRound():void= PropTeam.HeartBeat.DisableAll() # EndRound’a aktarılacak tüm oyuncuları al Players:[]player = GetPlayspace().GetPlayers() if (RoundEndInstigator := Players[0]): Logger.Print("Raunt bitti.") RoundSettings.EndRound(RoundEndInstigator)