Etiketli Işıklar Bulmacası eğitiminin son adımında bulmacanın tam kodunu ve örneği daha fazla değiştirecek fikirleri bulacaksın.
Tam Kod
Aşağıdaki kod, oyuncunun butonlarla ışık durumlarını değiştirerek doğru ışık kombinasyonunu bulmasını gerektiren yeniden kullanılabilir bir bulmacanın tam kodudur.
using { /Fortnite.com/Devices }
using { /Verse.org/Native }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Verse.org/Simulation/Tags }
using { /Verse.org/Simulation }
# Yeni bir oynanış etiketi oluşturmak için Verse.org/Simulation/Tags modülünde `tag` sınıfından türet.
puzzle_light := class(tag){}
log_tagged_lights_puzzle := class(log_channel){}
<#
Bu sınıfın bir örneğini kullanarak
bir button_device cihazının InteractedWithEvent olayına bağlanabilir ve olay işleyicinde olaya özgü özelliklere (bu örnekte Indices ve PuzzleDevice) erişebilirsin.
Her bir buton kendi kişisel durumuna ve olay işleyicisine sahip olduğu için üzerinde düşünmen gerekir.
Sınıfın <concrete> belirleyicisi olmadığından alanlar için varsayılan değerleri belirtmek gerekmez.
#>
button_event_handler := class():
# Bu butonun kontrol ettiği ışıklara erişmek için kullanılan konumlar.
Indices : []int
# Üzerinde fonksiyonlar çağırabilmemiz için bu button_event_handler işleyicisini oluşturan tagged_lights_puzzle.
PuzzleDevice : tagged_lights_puzzle
OnButtonPressed(InPlayer : agent) : void =
# PuzzleDevice cihazına bu butonun kontrolündeki konumlarda bulunan ışıkları açıp kapatmasını söyler.
PuzzleDevice.ToggleLights(Indices)
tagged_lights_puzzle := class<concrete>(creative_device):
Logger : log = log{Channel := log_tagged_lights_puzzle}
# Oyuncunun bulmacayla etkileşime girmek için kullandığı butonlar.
@editable
Buttons : []button_device = array{}
<#
ButtonsToLights içindeki öğe sayısı, Buttons içindeki öğe sayısıyla eşleşmelidir.
Sıfır dizinli her bir dizin dizisi, Buttons[x] konumundaki butonun hangi ışıkları açıp kapattığını açıklar (burada 'x' buton dizinidir).
Örneğin Buttons[2], array{0,1} ile belirtildiği gibi birinci ve ikinci ışığı açıp kapatır.
#>
ButtonsToLights : [][]int = array{array{0, 3}, array{0, 1, 2}, array{0, 1}, array{1}}
<#
LightsState mantık dizisi tüm ışıkların açık-kapalı durumunu izler.
Aynı zamanda öğe sayısı `puzzle_light` etiketiyle işaretlenmiş ışık sayısıyla eşleşecek şekilde
ışıkların başlangıç durumunu ayarlamak için kullanılır.
#>
@editable
var LightsState : []logic = array{false, false, false, false}
<#
LightsState ile SolvedLightsState eşleştiğinde bulmaca çözülmüştür.
Diğer bir deyişle SolvedLightsState, LightsState durumundaki kadar öğe sayısına sahip olmalıdır.
#>
@editable
SolvedLightsState : []logic = array{true, true, true, true}
@editable
# Bu ItemSpawner, bulmaca çözüldüğünde etkinleştirilir.
ItemSpawner : item_spawner_device = item_spawner_device{}
# Oynanış etiketleri aracılığıyla bulunan ışıkları tutar.
var Lights : []customizable_light_device = array{}
# Bulmaca çözüldükten sonra olay bağından çıkmaya olanak tanıyan InteractedWithEvent işleyicilerini tutar.
var ButtonSubscriptions : []cancelable = array{}
OnBegin<override>()<suspends> : void =
SetupPuzzleLights()
<#
Her bir buton ve dizini için, geçerli LightsIndices değerlerine sahipse,
kullandığı Indices ile yeni bir button_event_handler ve bu tagged_lights_puzzle (Self) için bir referans oluştur.
Butonun InteractedWithEvent olayına bağlanmak için işleyicinin OnButtonPressed fonksiyonunu kullan.
Oyuncunun bulmaca çözüldükten sonra bulmacayla etkileşimde bulunamaması için daha sonra bağı iptal etmek üzere bu bağları ButtonSubscriptions dizisine kaydet.
#>
set ButtonSubscriptions = for:
ButtonIndex -> Button : Buttons
LightIndices := ButtonsToLights[ButtonIndex]
do:
Button.InteractedWithEvent.Subscribe(button_event_handler{Indices := LightIndices, PuzzleDevice := Self}.OnButtonPressed)
SetupPuzzleLights() : void =
# Cihazlar oynanış etiketleri aracılığıyla alındığında belirli bir sıranın garanti edilemeyeceğini aklında bulundur.
TaggedActors := GetCreativeObjectsWithTag(puzzle_light{})
<#
puzzle_light etiketine sahip her bir aktör için aktörü o türe dönüştürerek bir customizable_light_device olup olmadığını kontrol et.
Bir customizable_light_device ise LightDevice cihazına TurnOn() veya TurnOff() fonksiyonunu uygulamak için başlangıçtaki LightState değerini al.
Tüm etiketlenmiş customizable_light_device cihazlarını Lights dizisine kaydet.
#>
set Lights = for:
ActorIndex -> TaggedActor : TaggedActors
LightDevice := customizable_light_device[TaggedActor]
ShouldLightBeOn := LightsState[ActorIndex]
do:
Logger.Print("Adding Light at index {ActorIndex} with State:{if (ShouldLightBeOn?) then "On" else "Off"}")
if (ShouldLightBeOn?) then LightDevice.TurnOn() else LightDevice.TurnOff()
LightDevice # Bir ifadenin son deyimi, ifadenin sonuç değeridir. `for` ifadeleri bir dizideki tüm değerleri döndürür.
ToggleLights(LightIndices : []int) : void =
<#
Her bir Index için karşılık gelen LightState değerini ve Light cihazı referansını al.
Her ikisi de geçerliyse geçerli LightState (if on->off ; if off->on) durumundan IsLightOn değerini belirle ve
karşılık gelen LighsState[Index] değerini IsLightOn olarak ayarla.
#>
for:
LightIndex : LightIndices
IsLightOn := LightsState[LightIndex]
Light := Lights[LightIndex]
do:
<#
Verse’te bir boole değerini yadsımak için: if (MyLogic?) {false} else {true}
Burada yadsınan değeri döndürmeden önce ayrıca Light değerini TurnOff() veya TurnOn() yaparız.
#>
Logger.Print("{LightIndex} dizinindeki ışık {if (IsLightOn?) then "Kapanıyor" else "Açılıyor"}")
NewLightState :=
if (IsLightOn?):
Light.TurnOff()
yanlış
else:
Light.TurnOn()
true
if (set LightsState[Index] = NewLightState): # Dizi dizini oluşturma başarısız olabilir, bu yüzden bir hata bağlamında paketlenmelidir.
Logger.Print("Updated the state for light at {LightIndex}")
# LightsState değişmiş olabilir, bu yüzden bulmacanın çözülüp çözülmediğini kontrol et.
if (IsPuzzleSolved[]):
Logger.Print("Puzzle solved!")
ItemSpawner.Enable()
# Oyuncunun artık ışıkları açıp kapatamaması için tüm olay işleyicilerinin bağından çık ya da olay işleyicilerini iptal et.
for (ButtonSubscription : ButtonSubscriptions):
ButtonSubscription.Cancel()
<#
<decides> efektine sahip bir fonksiyon yalnızca `if (IsPuzzleSolved[])` gibi bir hata bağlamında kullanılabilir.
Başarısız olabilir fonksiyon çağrıları için () yerine [] ile fonksiyon çağrısı yapıldığına dikkat et.
#>
IsPuzzleSolved()<decides><transacts> : void =
<#
Her bir LightsState durumunu yinele ve SolvedLightsState durumuyla eşleşip eşleşmediğini kontrol et.
`for` iç blokunun başarısız olduğu ilk durumda fonksiyon başarısız olur ve
hata çağırana bildirilir (aktarılır).
Aksi takdirde fonksiyon başarılıdır.
#>
for:
LightIndex -> IsLightOn : LightsState
IsLightOnInSolution := SolvedLightsState[LightIndex]
do:
IsLightOn = IsLightOnInSolution
Kendi Kendine Yapabileceklerin
Bu eğitimi tamamlayarak oyuncunun butonlarla ışık durumlarını değiştirerek doğru ışık kombinasyonunu bulmasını gerektiren yeniden kullanılabilir bir bulmacayı Verse ile nasıl oluşturabileceğini öğrendin.
Öğrendiklerini kullanarak aşağıdakileri dene:
- Daha fazla etiket oluştur ve bunları kullanarak ışıkları daha belirleyici bir görsel sırayla kontrol et.
- Aynı ayarla daha fazla bulmaca oluşturmak için farklı başlangıç koşulları ve çözümler kullan, ayrıca daha fazla buton ve ışık ekle.
- Kullanıcı tarafından etkileşime girilebilir birden fazla cihazın olduğu birden fazla cihaz türünü kontrol et.