Kaptan Yosun'un Geliştirme Günlüğü

Yağmur efekti için oyundaki mevcut kar yağışı sisteminde kar/yağmur makrolarına göre değişiklikler yapabilirsin veya yeni bir sınıf da yazmayı düşünebilirsin.
CSnowParticle::Init -> basitçe şu 4 değişkenin başlangıç değerlerini değiştirdiğinde yağmur efektine biraz daha benziyor:
SnowParticle.cpp:
Genişlet Daralt Kopyala
    m_v3Velocity.y = 2000.f;
    m_v3Velocity.z = -2000.f;
    m_fHalfWidth = 30.f;
    m_fHalfHeight = 5.f;
ama tam anlamıyla öyle gözükmesi için vertex'lere rotasyon mantığı eklemen (CSnowParticle::GetVerticies) ve kameraya göre (CSnowParticle::SetCameraVertex) rotate etmen gerekiyor.
Grafik programlama bilgim olsaydı denerdim, belki yapay zekadan yardım alabilirsin.
Jetty nasıl çektiyse artık ona göre üzerine geliştireceğim, henüz shader mantığını çekmedim, ama inceleyeceğim dediğini teşekkür ederim
 
Yağmur seslerini, görüntüsünü ve yağış dinamiğini ayarladım.
Ayrıca kar yağışını da revize ettim.
Sistemin kodlarını ciddi ölçüde optimize ettim ve okunurluluğunu iyileştirdim.
Oyuna ilk girişte aynı doğru msenv seçimi gibi doğru yağmur sesinin seçilmesini de ayarladım.



@raskolnikov bak bakalım beğenecek misin :D
 
Güncelleme:
Mount like horse sistemi ve pek çok varlığın boyut & görüntüleme mesafesi ayarlarını ekledim.
Zenaris'ten aldığım bu ayarların içindeki hard-coded kısımları tamamen dinamik yaptım.
Görüntüleme mesafesi ayarlarının çalışma mantığını data-oriented şekilde değişip lüzumsuz tekrarlanan ve okuması zor kodlardan temizledim.


Bineklerin büyüklük küçüklüğünü bende ekledim ama beceremedim syserr da vermiyor büyültüp küçültmüyor da :D
 
Bineklerin büyüklük küçüklüğünü bende ekledim ama beceremedim syserr da vermiyor büyültüp küçültmüyor da :D
Binek kostüm sistemi ve yanında gezen binek veya mount like horse lazım. Zenaris binekleri proto'dan TYPE_HORSE olarak çekiyor ama mainline'da binekler TYPE_NPC. Bu yüzden ben TYPE değiştirmek yerine binek itemlerini değil de binek moblarını (Mesela 20114 White Lion gibi) yeni bir rank ekleyerek o ranka geçirdim.

C++:
Genişlet Daralt Kopyala
enum EMobRank
{
    MOB_RANK_PAWN,
    MOB_RANK_S_PAWN,
    MOB_RANK_KNIGHT,
    MOB_RANK_S_KNIGHT,
    MOB_RANK_BOSS,
    MOB_RANK_KING,
    /* ---- MOB_RANK_MOUNT ---- */
    MOB_RANK_MOUNT,
    /* ---- END OF MOB_RANK_MOUNT ---- */
    MOB_RANK_MAX_NUM
};
Gibi.

Sonra proto'da bineklerin moblarını bu rank yaptım.
1751201999343.webp


Ve binek kontrolünü rank'tan sağladım
C++:
Genişlet Daralt Kopyala
    else if (mobTable->bRank == CPythonNonPlayer::EMobRank::MOB_RANK_MOUNT)
    {
        return CPythonSystem::instance().GetMountScale();
    }
 
Şimşek sistemi ekledim.
Sadece sağanak yağış ve fırtına varken çalışır.
Çeşitli şimşek sesleri arasından rastgele birini seçer.

(ekranın parlama efektleri vs henüz yok, çünkü onlar shader üzerinden, bu sadece ses sistemi)

Jetty'nin yöntemi CSnowParticle içinde olduğundan, şimsek çakmalı mı kontrolünü her bir particle başına her frame için yapıyordu.
Yani ekranda 650 yağmur tanesi varsa, 60 fps için saniyede kırk bin kere şimşek çakmalı mı kontrolü yapıyordu.

Ben WeatherController diye yeni bir class oluşturup kontrolleri oradan saniyede kırk bin kere değil, sadece bir kere olacak şekilde yaptım. CPU yükü muazzam azaldı ve rahatladı.

Ayrıca kod kalitesini çok ciddi oranda iyileştirdim.

1751205464688.webp

Sesler 3 boyutlu uzayda göğün rastgele bir noktasında oynatılır (farkındayım x ve y ekseni varyasyonu artmalı, ayarlayacağım)

 
Binek kostüm sistemi ve yanında gezen binek veya mount like horse lazım. Zenaris binekleri proto'dan TYPE_HORSE olarak çekiyor ama mainline'da binekler TYPE_NPC. Bu yüzden ben TYPE değiştirmek yerine binek itemlerini değil de binek moblarını (Mesela 20114 White Lion gibi) yeni bir rank ekleyerek o ranka geçirdim.

C++:
Genişlet Daralt Kopyala
enum EMobRank
{
    MOB_RANK_PAWN,
    MOB_RANK_S_PAWN,
    MOB_RANK_KNIGHT,
    MOB_RANK_S_KNIGHT,
    MOB_RANK_BOSS,
    MOB_RANK_KING,
    /* ---- MOB_RANK_MOUNT ---- */
    MOB_RANK_MOUNT,
    /* ---- END OF MOB_RANK_MOUNT ---- */
    MOB_RANK_MAX_NUM
};
Gibi.

Sonra proto'da bineklerin moblarını bu rank yaptım.
24303 eklentisini görüntüle

Ve binek kontrolünü rank'tan sağladım
C++:
Genişlet Daralt Kopyala
    else if (mobTable->bRank == CPythonNonPlayer::EMobRank::MOB_RANK_MOUNT)
    {
        return CPythonSystem::instance().GetMountScale();
    }
Bende mount like horse kullanıyorum. Örneğin Martyde mob protoda KNIGHT olarak geçiyor. Sizin atmış olduğunuz kontrol kısmı bende böyle.
C++:
Genişlet Daralt Kopyala
float CInstanceBase::ScaleSizeFunc(DWORD race)
{
    if (race <= 8)
        return 0.0f;

    if (NO_SCALE_BOSS(race))
        return 0.0f;

    const CPythonNonPlayer::TMobTable* mobTable = CPythonNonPlayer::instance().GetTable(race);
    if (!mobTable)
        return 0.0f;

    if (mobTable->bRank == CPythonNonPlayer::MOB_RANK_KING && IsStone())
        // aici introduci codul pentru metine: valori de la cât la cat sa scaleze: 100-150%
        return CPythonSystem::instance().GetStoneScale();
    else if (mobTable->bRank == CPythonNonPlayer::MOB_RANK_BOSS)
        // aici introduci codul pentru sefi: valori de la cat la cat sa scaleze: 100-130%
        return CPythonSystem::instance().GetBossScale();
    else if (IsHorse())
        // aici introduci codul pentru sefi: valori de la cat la cat sa scaleze: 50-100%
        return CPythonSystem::instance().GetMountScale();
    return 0.0f;
}
 
Bende mount like horse kullanıyorum. Örneğin Martyde mob protoda KNIGHT olarak geçiyor. Sizin atmış olduğunuz kontrol kısmı bende böyle.
C++:
Genişlet Daralt Kopyala
float CInstanceBase::ScaleSizeFunc(DWORD race)
{
    if (race <= 8)
        return 0.0f;

    if (NO_SCALE_BOSS(race))
        return 0.0f;

    const CPythonNonPlayer::TMobTable* mobTable = CPythonNonPlayer::instance().GetTable(race);
    if (!mobTable)
        return 0.0f;

    if (mobTable->bRank == CPythonNonPlayer::MOB_RANK_KING && IsStone())
        // aici introduci codul pentru metine: valori de la cât la cat sa scaleze: 100-150%
        return CPythonSystem::instance().GetStoneScale();
    else if (mobTable->bRank == CPythonNonPlayer::MOB_RANK_BOSS)
        // aici introduci codul pentru sefi: valori de la cat la cat sa scaleze: 100-130%
        return CPythonSystem::instance().GetBossScale();
    else if (IsHorse())
        // aici introduci codul pentru sefi: valori de la cat la cat sa scaleze: 50-100%
        return CPythonSystem::instance().GetMountScale();
    return 0.0f;
}
Tamam işte o is_horse kontrolü Mob_Proto'da TYPE sütunu TYPE_HORSE mu diye kontrol ediyor. Binek moblarını TYPE_NPC'den TYPE_HORSE'a geçirmek için src'de pek çok değişiklik yapmak lazım. Benim yöntemim daha kolay. Bineklerde mob_rank'ın bir önemi olmadığı için rank üzerinden kontrol etmeyi daha mantıklı buldum.
 
Burayı şu şekilde değiştirdim.
C++:
Genişlet Daralt Kopyala
        else if (mobTable->bRank == CPythonNonPlayer::MOB_RANK_MOUNT)
        // aici introduci codul pentru sefi: valori de la cat la cat sa scaleze: 50-100%
        return CPythonSystem::instance().GetMountScale();
Burayı böyle yaptım ardından mob protodan Manuyu KNIGHT yazan yere mount yazdım derledim sunucuya ve packe attım ama değişmedi :P Sanırım bu işleri bırakacağım. Game src tarafına da sanırım MOUNT diye tanımlatmam gerekiyor.
C++:
Genişlet Daralt Kopyala
        enum EMobRank
        {
            MOB_RANK_PAWN = 0,
            MOB_RANK_S_PAWN = 1,
            MOB_RANK_KNIGHT = 2,
            MOB_RANK_S_KNIGHT = 3,
            MOB_RANK_BOSS = 4,
            MOB_RANK_KING = 5,
            MOB_RANK_MOUNT = 6,
        };
 
Burayı şu şekilde değiştirdim.
C++:
Genişlet Daralt Kopyala
        else if (mobTable->bRank == CPythonNonPlayer::MOB_RANK_MOUNT)
        // aici introduci codul pentru sefi: valori de la cat la cat sa scaleze: 50-100%
        return CPythonSystem::instance().GetMountScale();
Burayı böyle yaptım ardından mob protodan Manuyu KNIGHT yazan yere mount yazdım derledim sunucuya ve packe attım ama değişmedi :P Sanırım bu işleri bırakacağım.
C++:
Genişlet Daralt Kopyala
        enum EMobRank
        {
            MOB_RANK_PAWN = 0,
            MOB_RANK_S_PAWN = 1,
            MOB_RANK_KNIGHT = 2,
            MOB_RANK_S_KNIGHT = 3,
            MOB_RANK_BOSS = 4,
            MOB_RANK_KING = 5,
            MOB_RANK_MOUNT = 6,
        };
sadece bu enumla olmaz, dump proto'da ve protoreader'da değişiklikler yapmak lazım. Örnek olarak attım o enumu.
 
Şimşeklerin rastgele konumlarda çakmasını ayarladım

1751214048007.webp
 
Geri
Üst