Tweeny Kullanmadan Animasyonlu Pencere

  • Konuyu açan Konuyu açan Tengrist
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 7
  • Gösterim Gösterim 370

Tengrist

Yasaklanmış Üye
Cezalı
Yardımsever Üye
Mesaj
1.388
Çözümler
43
Beğeni
1.241
Puan
1.309
Ticaret Puanı
0
Doğum günüme özel paylaşım. Kobra21 nickli macar kardeşime teşekkürler onun sayesinde paylaşıyorum. tweeny'i kullanamadığım client src si eski bir filesa bir müşterime eklemiştim. Arayan vardır diye paylaşıyorum.

pythonwindowmanagermodule.cpp:
Genişlet Daralt Kopyala
// arat

        else if (!stricmp(pszFlag, "rtl"))
            pWin->AddFlag(UI::CWindow::FLAG_RTL);
           
// Altına ekle


        else if (!stricmp(pszFlag, "animate"))
            pWin->AddFlag(UI::CWindow::FLAG_ANIMATED_BOARD);

pythonwindow.h:
Genişlet Daralt Kopyala
// Ara

FLAG_IS_BOARD_WITHOUT_ALPHA

// Altına mantıklı şekilde kendi bit’ini ver, BIT = bende << 15

#ifdef ENABLE_ANIMATED_BOARD
            FLAG_ANIMATED_BOARD = (1 << 15),
#endif

// Ara ya da sende nasıl varsa. (boşluklar / tab’lar yüzünden birebir aynı olmayabilir.)

virtual BOOL    IsWindow() { return TRUE; }

// Altına

#ifdef ENABLE_ANIMATED_BOARD
        virtual void SetScale(float fx, float fy);
#endif

// Ara ya da sende nasıl varsa. (boşluklar / tab’lar yüzünden birebir aynı olmayabilir.)

bool                m_bShow;

// Altına ekle

#ifdef ENABLE_ANIMATED_BOARD
        bool m_bAnimatingShow;
        bool m_bAnimatingHide;
        float m_fAnimScaleStart;
        float m_fAnimScaleEnd;
        float m_fAnimScale;
        uint32_t m_dwAnimDuration;
        uint32_t m_dwAnimStartTime;

        D3DXVECTOR2 m_v2Scale;
        D3DXMATRIX m_matScaling;

#endif

pythonwindow.cpp:
Genişlet Daralt Kopyala
// Ara

BOOL g_bOutlineBoxEnable = FALSE;

// Altına
// Bununla cubicOut fonksiyonunu işliyorsun

#ifdef ENABLE_ANIMATED_BOARD
float cubicOut(float t)
{
    float f = t - 1.0f;
    return f * f * f + 1.0f;
}
#endif

// Ara ya da sende nasıl varsa. (boşluklar / tab’lar yüzünden birebir aynı olmayabilir.)

CWindow::CWindow(PyObject* ppyObject) :
Burada --> m_bShow(false),

// Altına ekle

#ifdef ENABLE_ANIMATED_BOARD
        m_bAnimatingShow(false),
        m_bAnimatingHide(false),
        m_fAnimScaleStart(1.0f),
        m_fAnimScaleEnd(1.0f),
        m_fAnimScale(1.0f),
        m_dwAnimDuration(0),
        m_dwAnimStartTime(0),
#endif

// Ara

m_windowType = WINDOW_TYPE_WINDOW;

// Altına ekle

#ifdef ENABLE_ANIMATED_BOARD
        m_v2Scale = D3DXVECTOR2(1.0f, 1.0f);
        D3DXMatrixIdentity(&m_matScaling);
#endif

// Ara

    void CWindow::Show()
    {

// Buradaki m_bShow = true; kısmını değiştir

#ifdef ENABLE_ANIMATED_BOARD
        if (IsFlag(FLAG_ANIMATED_BOARD))
        {
            if (!this->m_bShow)
            {
                this->m_bShow = true;

                m_bAnimatingShow = true;
                m_bAnimatingHide = false;
                m_fAnimScaleStart = 0.0f;
                m_fAnimScaleEnd = 1.0f;
                m_fAnimScale = 0.0f;
                m_dwAnimDuration = 175;
                m_dwAnimStartTime = ELTimer_GetMSec();

                SetScale(0.0f, 0.0f);
            }
            else
            {
                this->m_bShow = true;
                SetScale(1.0f, 1.0f);
            }
        }
        else
        {
            m_bShow = true;
        }
#else
        m_bShow = true;
#endif


// Ara

    void CWindow::Hide()
    {
   
// Buradaki m_bShow = false; kısmını değiştir
// Şununla değiştir:

#ifdef ENABLE_ANIMATED_BOARD
        if (IsFlag(FLAG_ANIMATED_BOARD))
        {
            if (m_bShow)
            {
                m_bAnimatingHide = true;
                m_bAnimatingShow = false;
                m_fAnimScaleStart = 1.0f;
                m_fAnimScaleEnd = 0.0f;
                m_fAnimScale = 1.0f;
                m_dwAnimDuration = 120;
                m_dwAnimStartTime = ELTimer_GetMSec();
            }
            else
                m_bShow = false;
        }
        else
        {
            m_bShow = false;
        }
#else
        m_bShow = false;
#endif

// Ara void CWindow::Update()
// Bunun içinde OnUpdate(); satırını bul
// Onun altına ekle

#ifdef ENABLE_ANIMATED_BOARD
        if (IsFlag(FLAG_ANIMATED_BOARD))
        {
            if (m_bAnimatingShow || m_bAnimatingHide)
            {
                uint32_t now = ELTimer_GetMSec();
                uint32_t elapsed = now - m_dwAnimStartTime;

                float t = (float)elapsed / (float)m_dwAnimDuration;
                if (t > 1.0f)
                    t = 1.0f;

                float eased = cubicOut(t);
                m_fAnimScale = m_fAnimScaleStart + (m_fAnimScaleEnd - m_fAnimScaleStart) * eased;

                SetScale(m_fAnimScale, m_fAnimScale);

                if (t >= 1.0f)
                {
                    if (m_bAnimatingShow)
                    {
                        m_bAnimatingShow = false;
                        SetScale(1.0f, 1.0f);
                    }
                    if (m_bAnimatingHide)
                    {
                        m_bAnimatingHide = false;
                        SetScale(0.0f, 0.0f);
                        m_bShow = false;
                    }
                }
            }
        }
#endif

// Ara void CWindow::Render()
// Bunun içinde
//         if (!IsShow())
//            return;
// satırlarını bul
// Altına ekle

#ifdef ENABLE_ANIMATED_BOARD
        if (IsFlag(FLAG_ANIMATED_BOARD))
        {
            D3DXMATRIX oldMat;
            STATEMANAGER.GetTransform(D3DTS_WORLD, &oldMat);

            D3DXMATRIX newMat = oldMat * m_matScaling;
            STATEMANAGER.SetTransform(D3DTS_WORLD, &newMat);

            OnRender();

            std::for_each(m_pChildList.begin(), m_pChildList.end(), std::mem_fn(&CWindow::Render));

            STATEMANAGER.SetTransform(D3DTS_WORLD, &oldMat);

            return;
        }
#endif

// Dosyanın en sonuna şunu ekle

void UI::CWindow::SetScale(float fx, float fy)
{
#ifdef ENABLE_ANIMATED_BOARD
    m_v2Scale.x = fx;
    m_v2Scale.y = fy;
    UpdateRect();

    // Merkezden ölçekleme!
    float centerX = m_x + (m_lWidth / 2.0f);
    float centerY = m_y + (m_lHeight / 2.0f);

    D3DXMATRIX mat, matTrans, matTransBack;
    D3DXMatrixTranslation(&matTrans, -centerX, -centerY, 0.0f);
    D3DXMatrixScaling(&mat, fx, fy, 1.0f);
    D3DXMatrixTranslation(&matTransBack, centerX, centerY, 0.0f);

    m_matScaling = matTrans * mat * matTransBack;
#endif
}

Locale_inch'e sistemi ekleyi unutma. Py tarafında ise:

Nerede aktif olmasını istiyorsan


"animate" ekliyorsun.


ÖRNEK:


Uiinventory.py


uiscript içinde eklemen lazım animate:
Genişlet Daralt Kopyala
Uiinventory.py animate i ekleyeceksin virgüller ve "" dikkat et

window = {
    "name" : "InventoryWindow",

    "x" : SCREEN_WIDTH - 212,
    "y" : SCREEN_HEIGHT - 37 - 573,

    "style" : ("movable", "float", "window_without_alpha", "animate"),

uishop.py fixi:
Genişlet Daralt Kopyala
##Dosyanın en üst kısmında, son import satırının altına ekle:

ANIM_FIX = 0.2

##self.tooltipItem = 0 satırını iki kez ara.

##Biri def __init__(self): içinde,
##Diğeri def Destroy(self): içinde.

##Her birinin altına şu satırı ekle:

self.animfix = 0

##def Close(self): fonksiyonunda self.Hide() satırını bul.
##Onu aşağıdaki kodla değiştir tab ayarını kendine göre yaparsın:

# ANIMFIX
        if app.GetTime() >= self.animfix:
            self.animfix = app.GetTime() + ANIM_FIX
            self.Hide()

Bu sayede pencereyi kapatma (Close) çağrıları çok hızlı art arda tetiklenmeyecek, en az 0.2 saniye bekleme süresi (delay) eklenecek. Böylece animasyonun düzgün çalışması garanti altına alınmış oluyor.
 
Son düzenleme:
örnek py tarafı varmı hocam peki bakabileceğimiz
 
m_windowType = WINDOW_TYPE_WINDOW; bu kısım tam olarak nerede
constructor ın içine
C++:
Genişlet Daralt Kopyala
m_rect.bottom = m_rect.left = m_rect.right = m_rect.top = 0;
m_limitBiasRect.bottom = m_limitBiasRect.left = m_limitBiasRect.right = m_limitBiasRect.top = 0;

şunun altına ekler misiniz eski bir filesa eklemiştim 2 3 sene önce
 
constructor ın içine
C++:
Genişlet Daralt Kopyala
m_rect.bottom = m_rect.left = m_rect.right = m_rect.top = 0;
m_limitBiasRect.bottom = m_limitBiasRect.left = m_limitBiasRect.right = m_limitBiasRect.top = 0;

şunun altına ekler misiniz eski bir filesa eklemiştim 2 3 sene önce
STATEMANAGER içinde hata veriyor

pythonwindow.cpp içine

#include "../eterLib/StateManager.h"

harici başka hata almadan sorunsuz ekledim teşekkürler

 
Son düzenleme:
fantazi olsun diye vb.nette ekranda random gezinecek ve ordan buraya kendi kendini küçülüp büyülten ve şekilden şekle girecek şekilde saçma bir şey yapmıştım can sıkıntısından :) işsizlik insana gerçekten neler yaptırıyor düşün artık :D bu arada macar sucuğu iyi diyolar henüz yemek nasip olmadı ama zjhxfgasghkd
 
Geri
Üst