| 1 |
#include "stdafx.h" |
| 2 |
#include "CToggleIcon.h" |
| 3 |
#include "CSkinPlugin.h" |
| 4 |
#include "CNeutralMode.h" |
| 5 |
|
| 6 |
// 内部定数 |
| 7 |
const float TI_SLIDE_RATIO = 0.2f; // スライド速度 |
| 8 |
const float FRAME_TEX_UNIT = 0.125f; // フレームマッピング単位 |
| 9 |
const float ICON_TEX_UNIT = 0.25f; // アイコンマッピング単位 |
| 10 |
|
| 11 |
// static メンバ |
| 12 |
CToggleIcon *CToggleIcon::ms_PointIcon; |
| 13 |
|
| 14 |
/* |
| 15 |
* [static] |
| 16 |
* ポップアップテキストの描画 |
| 17 |
*/ |
| 18 |
void CToggleIcon::RenderPopupText(){ |
| 19 |
if(!ms_PointIcon) return; |
| 20 |
g_StrTex->RenderRight( |
| 21 |
g_DispWidth-TILE_UNIT*2-TILE_QUAD, g_DispHeight-TILE_UNIT*2, |
| 22 |
0xffffffff, 0xff000000, ms_PointIcon->m_Text.c_str()); |
| 23 |
g_StrTex->RenderRight( |
| 24 |
g_DispWidth-TILE_UNIT*2-TILE_QUAD, g_DispHeight-TILE_UNIT, |
| 25 |
0xffffffff, 0xff000000, ms_PointIcon->m_Expression.c_str()); |
| 26 |
ms_PointIcon = NULL; |
| 27 |
} |
| 28 |
|
| 29 |
/* |
| 30 |
* 初期化 |
| 31 |
*/ |
| 32 |
void CToggleIcon::Init( |
| 33 |
int x, int y, // 座標 |
| 34 |
int w, int h, // サイズ |
| 35 |
char *t, // テキスト |
| 36 |
char *expr, // 説明文 |
| 37 |
CInterface *p, // 親 |
| 38 |
CToggleIcon *l, // 前リンク |
| 39 |
CGameMode *mode, // 対応モード |
| 40 |
DWORD key, // ホットキー |
| 41 |
float u1, float v1, // 開放時テクスチャ座標 |
| 42 |
float u2, float v2, // 押下時テクスチャ座標 |
| 43 |
float u3, float v3, // アイコンテクスチャ座標 |
| 44 |
int mid // モード ID |
| 45 |
){ |
| 46 |
CInterface::Init(x, y, w, h, t, p); |
| 47 |
m_State = 0; |
| 48 |
m_Check = 0; |
| 49 |
m_ModeID = mid; |
| 50 |
m_TexPullU = u1, m_TexPullV = v1; |
| 51 |
m_TexPushU = u2, m_TexPushV = v2; |
| 52 |
m_TexIconU = u3, m_TexIconV = v3; |
| 53 |
m_Expression = expr; |
| 54 |
m_HotKey = key; |
| 55 |
m_SyncMode = mode; |
| 56 |
if(l){ |
| 57 |
m_Check = 0; |
| 58 |
m_Prev = l; |
| 59 |
m_Next = m_Prev->m_Next; |
| 60 |
m_Prev->m_Next = m_Next->m_Prev = this; |
| 61 |
}else{ |
| 62 |
m_Check = 1; |
| 63 |
m_Prev = m_Next = this; |
| 64 |
} |
| 65 |
} |
| 66 |
|
| 67 |
/* |
| 68 |
* チェッククリア |
| 69 |
*/ |
| 70 |
void CToggleIcon::ClearGroupCheck(){ |
| 71 |
CToggleIcon *ptr = this; |
| 72 |
do{ |
| 73 |
ptr->m_Check = 0; |
| 74 |
ptr = ptr->m_Next; |
| 75 |
} while(ptr!=this); |
| 76 |
} |
| 77 |
|
| 78 |
/* |
| 79 |
* チェック設定 |
| 80 |
*/ |
| 81 |
void CToggleIcon::SetCheck( |
| 82 |
bool inv // 反転フラグ |
| 83 |
){ |
| 84 |
if(inv && m_Check){ |
| 85 |
m_Check = 0; |
| 86 |
}else if(!m_Check){ |
| 87 |
ClearGroupCheck(); |
| 88 |
m_Check = 1; |
| 89 |
} |
| 90 |
if(m_SyncMode && !g_RSPV){ |
| 91 |
if(m_Check) m_SyncMode->Enter(); |
| 92 |
else g_NeutralMode->Enter(); |
| 93 |
} |
| 94 |
} |
| 95 |
|
| 96 |
/* |
| 97 |
* スライド座標設定 |
| 98 |
*/ |
| 99 |
void CToggleIcon::SetSlidePos( |
| 100 |
int x, int y, // 座標 |
| 101 |
bool fix // 固定フラグ |
| 102 |
){ |
| 103 |
if(fix){ |
| 104 |
m_SlideY = y; |
| 105 |
SetPos(x, y); |
| 106 |
}else{ |
| 107 |
m_SlideY = y*TI_SLIDE_RATIO+m_SlideY*(1.0f-TI_SLIDE_RATIO); |
| 108 |
SetPos(x, Round(m_SlideY)); |
| 109 |
} |
| 110 |
} |
| 111 |
|
| 112 |
/* |
| 113 |
* 入力チェック |
| 114 |
*/ |
| 115 |
bool CToggleIcon::ScanInput( |
| 116 |
bool enkey, // ホットキー有効 |
| 117 |
bool enmouse // マウス有効 |
| 118 |
){ |
| 119 |
POINT pos = g_Cursor.GetPos(); |
| 120 |
if(enmouse && IsInside(pos.x, pos.y)){ |
| 121 |
ms_PointIcon = this; |
| 122 |
switch(GetButton(DIM_LEFT)){ |
| 123 |
case S_PUSH: |
| 124 |
m_State = 2; |
| 125 |
g_Skin->MouseDown(); |
| 126 |
return true; |
| 127 |
case S_HOLD: |
| 128 |
if(m_State){ |
| 129 |
m_State = 2; |
| 130 |
return true; |
| 131 |
} |
| 132 |
break; |
| 133 |
default: |
| 134 |
if(m_State){ |
| 135 |
g_Skin->MouseUp(); |
| 136 |
SetCheck(true); |
| 137 |
} |
| 138 |
m_State = 0; |
| 139 |
break; |
| 140 |
} |
| 141 |
}else if(m_State){ |
| 142 |
switch(GetButton(DIM_LEFT)){ |
| 143 |
case S_HOLD: |
| 144 |
m_State = 1; |
| 145 |
return true; |
| 146 |
default: |
| 147 |
m_State = 0; |
| 148 |
break; |
| 149 |
} |
| 150 |
} |
| 151 |
if(enkey && GetKey(m_HotKey)==S_PUSH |
| 152 |
&& !CheckShift() && !CheckCtrl() && !CheckAlt()){ |
| 153 |
g_Skin->MouseUp(); |
| 154 |
SetCheck(true); |
| 155 |
return true; |
| 156 |
} |
| 157 |
return CInterface::ScanInput(); |
| 158 |
} |
| 159 |
|
| 160 |
/* |
| 161 |
* レンダリング |
| 162 |
*/ |
| 163 |
void CToggleIcon::Render( |
| 164 |
float altu, float altv // 代替テクスチャ座標 |
| 165 |
){ |
| 166 |
CInterface::RenderBrother(); |
| 167 |
int px, py, push = m_State==2; |
| 168 |
GetAbsPos(&px, &py); |
| 169 |
g_Skin->SetFrameTexture(); |
| 170 |
if(altu>=0.0f) SetUVMap(altu, altv, altu+FRAME_TEX_UNIT, altv+FRAME_TEX_UNIT); |
| 171 |
else if(m_Check) SetUVMap(m_TexPushU, m_TexPushV, |
| 172 |
m_TexPushU+FRAME_TEX_UNIT, m_TexPushV+FRAME_TEX_UNIT); |
| 173 |
else SetUVMap(m_TexPullU, m_TexPullV, |
| 174 |
m_TexPullU+FRAME_TEX_UNIT, m_TexPullV+FRAME_TEX_UNIT); |
| 175 |
TexMap2DRect(px, py, px+m_Width, py+m_Height, 0xffffffff); |
| 176 |
if(m_State==2) return; |
| 177 |
g_Skin->SetIconTexture(m_ModeID); |
| 178 |
SetUVMap(m_TexIconU, m_TexIconV, |
| 179 |
m_TexIconU+ICON_TEX_UNIT, m_TexIconV+ICON_TEX_UNIT); |
| 180 |
if(m_Check) px++, py++; |
| 181 |
TexMap2DRect(px, py, px+m_Width, py+m_Height, 0xffffffff); |
| 182 |
} |