leonscottkfm' Alıntı:
Oyunumda can değerini kontrol edip buna göre işlem yapmaya çalışıyorum.
Şunu yapmak istiyorum. (can değişkenim) 50 -20 aralığındaysa yazı çıksın mesela.
"50 -20 aralığındaysa" bunu yapmak için hangi fonksiyonu kullanıyoruz. Hem değişkenimi bağlıycam hemde aralığını kontrol ettircem.
ClimbDown' Alıntı:
Int değeri float değere çevirip in range kullanabilirsin.
In range in çıkışını ise bir if(branch) e bağlarsın ve değerin o aralıkta olup olmadığını anlayabilirsin.
Bu kadar ayrıntıya gerek yok. Küçük ve büyük ifadelerini
Float üzerinde de kullanabilirsiniz. Yani:
> 20 && < 50
leonscottkfm' Alıntı:
Bak canım benimm onu ben yaptım

Acayip gıcık bir şey bu şimdi oyuncunun paneline gidip can diye değişken oluşturuyorsun 100 veriyorsun mesela daha sonra diyorsun ki bu can 0 a eşitse fiziği simule et ve tekrar bir boolean değişkeni oluşturup öldü ölmedi şeklinde ayarlıyorsun simule olmuşsa ölmüş demektir diyorsun yada 0 a eşitse ölmüş ayarla ölmüşmü öyleyse simule et diyorsun. Fakat sorun şu buradada bir kontrol işlemi gerek bunu custom event yapıp çağırmak falan lazım yada ne biliyim set timer by event var çağırıldığı anda kontrol işlemi yapabiliyor.... bir obje yaratıp objeye de oyuncuyu cast edip variablesini çekip -100 yaparsan öldü sayacaktır eventi çağırırsın büyük ihtimalle eventtede kontrol işlemi yapar. Bence event tick bu kadar yormaz sistemi sanmıyorum ben 0.0001 tick ile obje spawn ediyordum 1000 tane hiçbir şey olmuyordu
furkanxdgs4' Alıntı:
Tabii ki tek düşündüğüm şey performans değil, sadece küçük bir kontrol işleminin performansa etkisi olmaz bile denebilir. Ama farklı yöntemler öğrenmeye çalışıyorum, sonuçta her şeyi Event Tick'e bağlamamak gerek. Orada can sistemini örnek olsun diye söyledim yoksa daha karmaşık örnekleri de var, sadece anlaşılması basit olsun istedim. Asıl sorum kabaca özetlersek;
Bir değişkeni Branch'ler vs yardımıyla durmadan öğrenip o bilgiyi kontrol etmektense, değişken 0 olduğunda kendince uyarı vericek şekilde bir sistem kurabilir miyiz onu öğrenmek istiyorum. Blueprint'lerin detaylı seçenekleri arasında çok kısa ve etkili çözümler bulunabiliyor bazen, o yüzden belki bir kısayol vardır diye sordum.
Not: Bu soruyu sorma nedenim Event Tick'i Branch'e bağlayıp "Eşitse","Eşit değilse" sistemini kurmaya üşendiğimden değil, bir kısayol öğrenmek için soruyorum.
Not 2: Aklıma şöyle bir sistem geldi. Karakterin içinde Event Dispatcher kurup gerçekleştiğinde can seviyesini ve "Canı bitti mi?" Boolean'ını Array'lere kaydedip tüm zarar veren eylemlerin sonuna bu Event Dispatcher ekleyerek Array içinde bu bilgiyi edinmesini sağlayabilirim. Bundan sonra da tüm eylemlerin başlangıcına "Can bitti mi?" koşulunu Array'den çekerek canın bitip bitmediğini öğrenebilirim. Bu sayede de tekrar tekrar kontrol etmektense zaten zarar verildiğinde sağlık bilgisini kaydedecek ve bir bilgiyi tek seferde çekebileceğiz.
Bu tür durumlarda, nesne yönelimli programlamada, nesnenin erişim denetleyicilerinden(
public, protected, private) ve değişkenleri kontrol etmek için ilgili
GET ve
SET metotlarından faydalanılır.
PHP:
class MyActor
{
public:
float A;
MyActor() : A(1), B(2), C(3) {} // kurucu(constructor) metot.
protected:
float B;
private:
float C;
}
MyActor* myActor = new MyActor();
myActor örneği üzerindeki
C değişkenine sadece
MyActor sınıfı üzerinden,
B değişkenine ise
MyActor ve ondan kalıtım almış sınıflar üzerinden
A değişkenine ise heryerden erişilebilir.
PHP:
myActor->A = 10; // ok
myActor->B = 20; // hata, B değişkeni korumalı
myActor->C = 30; // hata, C değişkeni gizli
class MyDerivedActor : public MyActor
{
public:
void setB(float b) { B = b; } // ok
void setC(float c) { C = C; } // hata, c değişkeni gizli
}
Konuyu
C++ üzerinden özetlersek;
PHP:
class Character
{
public:
// Set
void SetHealth(float health)
{
float oldHealth = Health;
Health = health;
if (oldHealth != Health)
OnHealthChanged(oldHealth, Health);
}
void OnHealthChanged(float OldHealth, float NewHealth)
{
std::cout << "Health is changed from " << OldHealth << " to " << NewHealth;
}
// Get
float GetHealth() { return Health; }
protected: // yada private:
float Health;
}
Görüldüğü üzere
Health değişkeni yalnızca
SetHealth metodu ile kontrol edilirse, değişiklikler tespit edilir ve değişiklik olduğunda ilgili işlemler yapılabilir.
Blueprint üzerinde ise bu işlem şöyle gerçekleştirilebilir.
ClimbDown ve
Khubur'un bahsetmiş olduğu gibi bir
event(
Event Any Damage) zaten var. Eğer
Health değişkeni aynı
BP içinde sadece bu
eventte kontrol edilir, değiştirilirse ve
Health değişkeninin
Editable özelliği
False yapılırsa(dışarıdan değiştirilmezse); değişmesi durumunda yapılacaklar da bu
eventte yapılabilir. Böylece başka herhangi bir yerde asla değiştirilmeyeceği garanti altına alınır ve gerekenler yapılır.