Merhaba tekrar,
Paylaştığın kod parçası için teşekkürler. Evet, sorunun kalbi tam olarak orası. İlk cevabımda bahsettiğim "Görünmez Askı" çakışması, tam olarak bu kod bloğunda gerçekleşiyor.
Sorun Neden Bu Kodda?
Kodunu dikkatlice incelersek, mantıksal bir hata olduğunu göreceğiz. Hata şu:
[CODE title="C++"]#ifdef ENABLE_WINGS_NEW
if (pItem->GetSubType() == CItemData::COSTUME_WING)
{
// KANATLAR için kodlar...
}
#endif
else if (pItem#endifubType() == CItemData::COSTUME_ACCE)
{
// SİLAH EFEKTİ (ACCE) için kodlar...
}[/CODE]
Buradaki anahtar kelime else if.
Bu yapı, bilgisayara şunu söyler:"Eğer kuşanılan eşya bir KANAT ise, birinci bloğu çalıştır ve dur. Değilse, O ZAMAN kontrol et, eğer bir ACCE ise ikinci bloğu çalıştır."
Bu mantık yüzünden, sistem aynı anda hem kanadı hem de silah efektini işleyemiyor. Birini kuşanırken diğerinin görseli kayboluyor çünkü kod akışı birini seçmek zorunda kalıyor. Silah efektini (ACCE) taktığında, program if (COSTUME_WING) kontrolünü geçer, else if (COSTUME_ACCE) bloğuna girer ve sadece onu çalıştırır. Kanatlarla ilgili görsel yenileme kodu tamamen atlanmış olur.
Çözüm 1: Hızlı ve Etkili Düzeltme
Bu sorunu çözmenin en basit yolu, else if ifadesini basit bir if'e dönüştürmektir. Böylece iki kontrol birbirinden bağımsız hale gelir.
Hatalı Kod:
[CODE title="C++"]// ...
#ifdef ENABLE_WINGS_NEW
if (pItem->GetSubType() == CItemData::COSTUME_WING)
{
#ifdef/ ... Kanat kodları
}
#endif
else if (pItem->GetSubType() == CItemData::COSTUME#ifdef
{
// ... A#endifdları
}
#endif
// ...[/CODE]
Doğru kod:
[CODE title="C++"]// ...
#ifdef ENABLE_WINGS_NEW
if (#endif>GetSu#endif) == CItemData::COSTUME_WING)
{
##ifdefearWingShiningEffect();
for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
##ifdefearWingShiningEffect(tIndex() == 16064)
{
__AttachAcceShining#ifdeflearWingShiningEffect(tIndex(], "Bip01");
}
else
{
__AttachWingShiningEffect(i, shiningTable.szShinings, "Bip01 Spine2");
}
}
#endif
#ifdef ENABLE_ACCE_SYSTEM
if (pItem->GetSubType() == CItemData::COSTUME_ACCE) // "else i##endif##ifdefce "if" kullanıldı
{
for (int i = 0; i < CItemData::ITEM_SHINING_MAX_COUNT; i++)
{
if (pItem->GetIndex() >= 86066 && pItem->GetIndex() <= 86080)
{
__AttachAcceShiningEffect(i, shiningTable.szShinings, "Bip01 Spine2");
}
else
{
__AttachAcceShiningEffect(i, shiningTable.szShinings, "Bip01");
}
}
}
#endif
// ...[/CODE]
Bu değişikliği yaptığında, sist##e#endifya kuş#endifğında ö#endifu bir kanat mı?" di#endiftrol edecek ve gereğini yapacak, sonra "Bu bir ACCE mi?" diye ayrıca kontrol edecek ve onun da gereğini yapacak. Böylece ikisi birbirinin görselini ezmeyecektir.
Çözüm 2: Daha Temiz ve Profesyonel Yaklaşım
Yukarıdaki çözüm işini görecektir. Ancak kodun daha temiz ve gelecekteki eklemelere daha uygun olmasını istiyorsan, ekipman takma/çıkarma fonksiyonlarını ayırmalısın.
Şu anki mantık, bir eşya takıldığında diğerlerini temizleyip yeniden yüklüyor gibi görünüyor. İdeali, her kostüm tipi için ayrı Attach (Tak) ve Detach (Çıkar) fonksiyonları olmasıdır.
Örneğin:
__AttachWing() ve __DetachWing()
__AttachAcce() ve __DetachAcce()
Böylece bir silah efekti (ACCE) taktığında sadece __AttachAcce() çağrılır ve kanatlarla ilgili hiçbir koda dokunulmaz. Bu daha büyük bir iştir ama en doğru yöntem budur.
Özetle: Kardeşim. else if'i if olarak değiştirmen, sorununu %99 ihtimalle çözecektir.
Umarım bu daha net bir yol haritası sunmuştur. İyi çalışmalar dilerim.