- 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.
Locale_inch'e sistemi ekleyi unutma. Py tarafında ise:
Nerede aktif olmasını istiyorsan
"animate" ekliyorsun.
ÖRNEK:
Uiinventory.py
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.
pythonwindowmanagermodule.cpp:
// 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:
// 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:
// 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:
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:
##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: