ÔÚ´«ÆæÀàÓÎÏ·µÄ¿ª·¢ÖУ¬**Óû§½çÃæ£¨UI£©µÄÁé»îÐԺͽ»»¥Ð§ÂÊ**Ö±½ÓÓ°ÏìÍæ¼ÒµÄ³Á½þ¸ÐÓë²Ù×÷ÌåÑé¡£GOMÒýÇæÆ¾½èÆä¸ß¶È¿É¶¨ÖƵÄUIϵͳ£¬ÓÈÆäÊÇ **“Ðü¸¡°´Å¥”** Óë **“×Ô¶¨Òå°´Å¥”** ¹¦ÄÜ£¬³ÉΪ¿ª·¢ÕßÓÅ»¯ÓÎÏ·½çÃæµÄºËÐŤ¾ß¡£±¾ÎĽ«´Ó¹¦ÄÜʵÏÖ¡¢¼¼ÊõÂß¼µ½Ó¦Óó¡¾°£¬È«Ãæ½âÎöÕâÁ½´ó¹¦ÄܵÄÔÀíÓëDZÁ¦¡£
---
### Ò»¡¢¹¦Äܶ¨Î»ÓëÉè¼ÆÂß¼
#### 1. **Ðü¸¡°´Å¥£¨Floating Button£©**
- **¶¯Ì¬½»»¥ÌØÐÔ**£ºÐü¸¡°´Å¥¿ÉÍÑÀë¹Ì¶¨UIÃæ°å£¬¸ù¾ÝÍæ¼Ò²Ù×÷»ò³¡¾°ÐèÇó¶¯Ì¬µ÷ÕûλÖã¨Èç¸úËæ½ÇÉ«ÒÆ¶¯¡¢Îü¸½ÓÚÆÁÄ»±ßÔµ£©¡£
- **µäÐÍÓ¦Óó¡¾°**£º
- **¿ì½Ý²Ù×÷**£º¿ìËÙÇл»¼¼ÄÜ¡¢Ò©Æ·Ê¹Óá£
- **³¡¾°Ìáʾ**£ºÔÚÌØ¶¨µØÍ¼£¨ÈçBOSSÕ½³¡£©×Ô¶¯µ¯³öÈÎÎñÖ¸Òý»òΣÏÕ¾¯¸æ¡£
- **¼¼ÊõÏÞÖÆ**£ºÐèͨ¹ý×ø±ê¿ØÖÆ£¨`X/YÖáÆ«ÒÆÖµ`£©ºÍ´¥·¢Ìõ¼þ£¨ÈçѪÁ¿µÍÓÚ30%ʱÏÔʾ£©ÊµÏÖ¶¯Ì¬Âß¼¡£
#### 2. **×Ô¶¨Òå°´Å¥£¨Custom Button£©**
- **Áé»îÐÔÓë¶àÑùÐÔ**£º¿ª·¢Õß¿É×Ô¶¨Òå°´Å¥µÄͼ±ê¡¢³ß´ç¡¢´¥·¢Ê¼þ¼°¶¯»Ð§¹û£¬ÉõÖÁǶÌ׸´Ôӽű¾¡£
- **ºËÐÄÓÅÊÆ**£º
- **¶à²ã¼¶½»»¥**£ºÖ§³Ö°´Å¥×éǶÌ×£¨ÈçÖ÷²Ëµ¥Õ¹¿ª×Ó°´Å¥£©¡£
- **Ìõ¼þ´¥·¢**£º¸ù¾ÝÍæ¼ÒµÈ¼¶¡¢×°±¸×´Ì¬µÈ¶¯Ì¬ÏÔʾ»òÒþ²Ø°´Å¥¡£
- **Éè¼Æ°¸Àý**£ºÔÚÐлá½çÃæÖУ¬Í¨¹ý×Ô¶¨Ò尴ťʵÏÖ“Ò»¼üÕÙ»½³ÉÔ±”“×ÊÔ´¾èÏ×”µÈ¸´ÔÓ¹¦ÄÜ¡£
---
### ¶þ¡¢¼¼ÊõʵÏÖ£º´Ó½Å±¾µ½ÒýÇæµÄÐ×÷
#### 1. **µ×²ãÂß¼ÒÀÀµ**
- **LUA½Å±¾Çý¶¯**£º°´Å¥µÄÏÔʾ¡¢Òþ²Ø¼°Ê¼þÏìӦͨ³£Í¨¹ýLUA½Å±¾ÓëÒýÇæAPI½»»¥¡£ÀýÈ磺
```lua
-- ´´½¨Ðü¸¡°´Å¥²¢°ó¶¨Ê¼þ
local btn = ui.CreateFloatingButton("icon_boss", 100, 100)
btn.OnClick = function()
ExecuteSkill("FireSword") -- ´¥·¢¼¼ÄÜ
end
```
- **×ø±êÓë²ã¼¶¿ØÖÆ**£ºÍ¨¹ý`SetPosition()`ºÍ`SetZOrder()`¹ÜÀí°´Å¥µÄÏÔʾÓÅÏȼ¶£¬±ÜÃâÓëÆäËûUIÔªËØ³åÍ»¡£
#### 2. **×ÊÔ´¹ÜÀíÓëÐÔÄÜÓÅ»¯**
- **ËØ²Ä¹æ·¶**£º°´Å¥Í¼±êÐèÊÊÅä¶àÖÖ·Ö±æÂÊ£¨Èç1024x768¡¢1920x1080£©£¬²¢Ô¤¼ÓÔØÖÁ×ÊÔ´³ØÒÔ¼õÉÙ¿¨¶Ù¡£
- **ʼþ½ÚÁ÷**£º¸ßƵ´¥·¢µÄ°´Å¥£¨ÈçÁ¬»÷¼¼ÄÜ£©ÐèÉèÖÃÀäȴʱ¼ä»òʼþ¶ÓÁУ¬·ÀÖ¹½Å±¾×èÈû¡£
---
### Èý¡¢Ó¦Óó¡¾°Ó뿪·¢Êµ¼ù
#### 1. **ÌáÉýÕ½¶·Á÷³©¶È**
- **°¸Àý**£ºÔÚPK³¡¾°ÖУ¬Ðü¸¡°´Å¥¿ÉʵʱÏÔʾµÐÈËѪÁ¿ºÍ¾àÀ룬×Ô¶¨Òå°´Å¥ÔòÌṩ“Ò»¼ü»»×°”“¿ì½Ý»Ø³Ç”¹¦ÄÜ¡£
- **Êý¾ÝÑéÖ¤**£ºÄ³´«ÆæÊµ²âÏÔʾ£¬ÒýÈëÐü¸¡¼¼ÄÜÀ¸ºó£¬Íæ¼Ò²Ù×÷ÏìÓ¦ËÙ¶ÈÌáÉýÔ¼40%¡£
#### 2. **ÐÂÊÖÒýµ¼Ó븶·Ñת»¯**
- **¶¯Ì¬Òýµ¼**£ºÍ¨¹ýÐü¸¡°´Å¥¸ßÁÁй¦ÄÜ£¨ÈçÊ׳äÀñ°ü£©£¬²¢½áºÏ¶¯»Ð§¹ûÎüÒýµã»÷¡£
- **¸¶·ÑÈë¿Ú¶¨ÖÆ**£ºÔÚVIP½çÃæÖУ¬×Ô¶¨Òå°´Å¥¿Éչʾ²»Í¬µµÎ»ÌØÈ¨£¬Ö±½ÓÌø×ªÖ§¸¶Ò³Ãæ¡£
#### 3. **Ðлá¹ÜÀíÓëÉç½»ÔöÇ¿**
- **Ðü¸¡¹«¸æ°å**£ºÐлáÁìÐä¿É·¢²¼¶¯Ì¬Ö¸ÁÈ缯½á×ø±ê£©£¬°´Å¥ÊµÊ±Ë¢Ð²¢Í¬²½ÖÁ³ÉÔ±½çÃæ¡£
- **×Ô¶¨Òå½»»¥Á´**£ºÀýÈ糤°´°´Å¥´¥·¢ÓïÒôÁÄÌ졢˫»÷·¢ËÍÔ¤ÉèÕ½ÊõÖ¸Áî¡£
---
### ËÄ¡¢¿ª·¢Öеij£¼ûÎÊÌâÓëÓÅ»¯½¨Òé
#### 1. **·Ö±æÂÊÊÊÅäÎÊÌâ**
- **ÎÊÌâ**£º°´Å¥Î»ÖÃÔڸ߷ֱæÂÊÆÁÄ»ÖÐÆ«ÒÆ¡£
- **½â¾ö·½°¸**£ºÊ¹ÓÃÏà¶Ô×ø±ê£¨°Ù·Ö±È£©¶ø·Ç¹Ì¶¨ÏñËØÖµ£¬»òͨ¹ý`êµã£¨Anchor£©`°ó¶¨ÆÁÄ»±ßÔµ¡£
#### 2. **ʼþ³åÍ»ÓëÎó´¥**
- **ÎÊÌâ**£ºÐü¸¡°´Å¥ÕÚµ²¹Ø¼ü²Ù×÷ÇøÓò£¨Èç½ÇÉ«ÒÆ¶¯Ò¡¸Ë£©¡£
- **½â¾ö·½°¸**£ºÉèÖÓ͸Ã÷´©Í¸”ÊôÐÔ£¬»òÔö¼Ó°´Å¥ÍÏ×§¸´Î»¹¦ÄÜ¡£
#### 3. **ÐÔÄÜ¿ªÏú¿ØÖÆ**
- **ÓÅ»¯²ßÂÔ**£º
- ¶ÔÒþ²Ø°´Å¥½ûÓÃUpdateʼþ¡£
- ʹÓÃÎÆÀíѹËõ¼¼Êõ¼õÉÙͼ±ê×ÊÔ´Õ¼Óá£
---
### Î塢δÀ´Õ¹Íû£º´Ó¹¦Äܵ½Éú̬µÄÑÓÉì
- **AIÇý¶¯µÄ¶¯Ì¬UI**£º½áºÏÍæ¼ÒÐÐΪÊý¾Ý£¬×Ô¶¯µ÷Õû°´Å¥²¼¾Ö£¨Èç¸ßƵ¼¼ÄÜÓÅÏÈÖö¥£©¡£
- **¿çƽ̨ÊÊÅä**£ºÌ½Ë÷ÒÆ¶¯¶Ë´¥¿ØÊÖÊÆÓëÐü¸¡°´Å¥µÄÈںϣ¨È绬¶¯Õ¹¿ª¼¼ÄÜÂÖÅÌ£©¡£
---
#### ½áÓï
GOMÒýÇæµÄ“Ðü¸¡°´Å¥”Óë“×Ô¶¨Òå°´Å¥”²»½öÊǼ¼Êõ¹¤¾ß£¬¸üÊÇ**ÖØËÜÍæ¼Ò½»»¥ÌåÑé**µÄÇÅÁº¡£Í¨¹ý¾«×¼µÄ½Å±¾¿ØÖÆÓë×ÊÔ´ÓÅ»¯£¬¿ª·¢Õß¿ÉÍ»ÆÆ´«Í³´«ÆæÓÎÏ·µÄUIÏÞÖÆ£¬´òÔì¼æ¾ßЧÂÊÓë³Á½þ¸ÐµÄ¸öÐÔ»¯½çÃæ¡£Î´À´£¬Ëæ×ÅÒýÇæ¹¦Äܵĵü´ú£¬ÕâÁ½´óÄ£¿é»ò½«³ÉΪÓÎÏ·²îÒ컯µÄ¹Ø¼ü¾ºÕùÁ¦¡£
#### 1. ×¼±¸¹¤×÷
ÔÚ¿ªÊ¼Ö®Ç°£¬ÇëÈ·±£ÄãÒѾ°²×°ÁËGOMÒýÇæ£¬²¢ÇÒÓÐÒ»¸ö»ù±¾µÄÓÎÏ·¿ò¼Ü´î½¨Íê³É¡£´ËÍ⣬»¹ÐèҪ׼±¸ºÃËùÓбØÒªµÄ¿Í»§¶ËºÍ·þÎñÆ÷¶ËÎļþ¡£
#### 2. Àí½â“Ðü¸¡°´Å¥”ºÍ“×Ô¶¨Òå°´Å¥”
##### ¸¡¶¯°´Å¥£¨Floating Button£©
¸¡¶¯°´Å¥ÊÇÖ¸¹Ì¶¨ÔÚÆÁĻij¸öλÖõİ´Å¥£¬Í¨³£ÓÃÓÚ¿ìËÙ·ÃÎʳ£Óù¦ÄÜ£¬Èç´ò¿ªÉ̵ꡢ´«ËÍÃŵȡ£
##### ×Ô¶¨Òå°´Å¥£¨Custom Button£©
×Ô¶¨Òå°´Å¥ÊÇÖ¸¿ÉÒÔ¸ù¾ÝÐèÒªÌí¼Óµ½½çÃæÈÎÒâλÖõİ´Å¥£¬Ìṩ¸ü¶àµÄ½»»¥Ñ¡ÏÈç¼¼ÄÜ¿ì½Ý¼ü¡¢ÈÎÎñÌáʾµÈ¡£
#### 3. ʵÏÖ¸¡¶¯°´Å¥
##### ²½ÖèÒ»£º±à¼ÅäÖÃÎļþ
Ê×ÏÈ£¬ÔÚ`data\button_proto.txt`ÎļþÖÐÌí¼Ó¸¡¶¯°´Å¥µÄÅäÖá£
```plaintext
vnum name type position x y width height image_normal image_pressed script
1001 É̵갴ť FLOATING_BUTTON TOP_RIGHT 10 10 50 50 buttons/shop_button.png buttons/shop_button_pressed.png open_shop_dialog()
```
- `vnum`: °´Å¥Î¨Ò»±àºÅ¡£
- `name`: °´Å¥Ãû³Æ¡£
- `type`: °´Å¥ÀàÐÍ£¨FLOATING_BUTTON£©¡£
- `position`: ¹Ì¶¨Î»Öã¨TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT£©¡£
- `x`: X×ø±êÆ«ÒÆÁ¿¡£
- `y`: Y×ø±êÆ«ÒÆÁ¿¡£
- `width`: °´Å¥¿í¶È¡£
- `height`: °´Å¥¸ß¶È¡£
- `image_normal`: ĬÈÏͼÏñ·¾¶¡£
- `image_pressed`: °´Ñ¹×´Ì¬ÏµÄͼÏñ·¾¶¡£
- `script`: µã»÷°´Å¥Ê±Ö´ÐеĽű¾¡£
##### ²½Öè¶þ£º×¼±¸Í¼Ïñ×ÊÔ´
È·±£Í¼Ïñ×ÊÔ´´æÔÚÓÚÖ¸¶¨Â·¾¶Ï¡£
```plaintext
resource/image/buttons/shop_button.png
resource/image/buttons/shop_button_pressed.png
```
##### ²½ÖèÈý£ºÐ޸Ŀͻ§¶Ë´úÂë
ÔÚ¿Í»§¶Ë´úÂëÖд¦Àí°´Å¥Ê¼þ¡£´ò¿ª`src/client_ui.cpp`Îļþ£¬Ìí¼Ó´¦Àí¸¡¶¯°´Å¥µÄÂß¼¡£
**client_ui.cpp**
```cpp
#include "client_ui.h"
#include "packet_sender.h"
void CClientUI::InitializeButtons()
{
// ³õʼ»¯¸¡¶¯°´Å¥
CUIButton* shopButton = new CUIButton();
shopButton->SetVnum(1001);
shopButton->SetName("É̵갴ť");
shopButton->SetType(BUTTON_TYPE_FLOATING);
shopButton->SetPosition(TOP_RIGHT, 10, 10);
shopButton->SetSize(50, 50);
shopButton->SetImageNormal("buttons/shop_button.png");
shopButton->SetImagePressed("buttons/shop_button_pressed.png");
shopButton->SetScript("open_shop_dialog()");
AddButton(shopButton);
}
void CClientUI::OnButtonClick(int buttonVnum)
{
switch (buttonVnum)
{
case 1001: // É̵갴ť
ExecuteScript("open_shop_dialog()");
break;
// ÆäËû°´Å¥...
}
}
void CClientUI::ExecuteScript(const std::string& script)
{
if (script == "open_shop_dialog()")
{
OpenShopDialog();
}
// ÆäËû½Å±¾...
}
void CClientUI::OpenShopDialog()
{
// ÏÔʾÉ̵ê¶Ô»°¿ò
CUIDialog* shopDialog = new CUIDialog(DIALOG_SHOP);
AddDialog(shopDialog);
}
```
##### ²½ÖèËÄ£º±àÒë²¢²âÊÔ
È·±£ËùÓÐÐ޸ĺóµÄ´úÂë¶¼Äܳɹ¦±àÒë¡£
```sh
g++ -o client src/client_main.cpp src/client_ui.cpp src/packet_sender.cpp -lengine
```
Æô¶¯¿Í»§¶Ë£¬¹Û²ì¸¡¶¯°´Å¥ÊÇ·ñÕýÈ·ÏÔʾºÍÏìÓ¦µã»÷ʼþ¡£
```sh
start client.exe
```
#### 4. ʵÏÖ×Ô¶¨Òå°´Å¥
##### ²½ÖèÒ»£º±à¼ÅäÖÃÎļþ
ÔÚ`data\button_proto.txt`ÎļþÖÐÌí¼Ó×Ô¶¨Òå°´Å¥µÄÅäÖá£
```plaintext
vnum name type position x y width height image_normal image_pressed script
1002 ¼¼Äܰ´Å¥ CUSTOM_BUTTON INVENTORY_TAB 100 100 50 50 buttons/skill_button.png buttons/skill_button_pressed.png cast_skill(10001)
```
- `vnum`: °´Å¥Î¨Ò»±àºÅ¡£
- `name`: °´Å¥Ãû³Æ¡£
- `type`: °´Å¥ÀàÐÍ£¨CUSTOM_BUTTON£©¡£
- `position`: ¹Ì¶¨Î»Öã¨INVENTORY_TAB, STATUS_TAB, SKILL_TABµÈ£©¡£
- `x`: X×ø±êÆ«ÒÆÁ¿¡£
- `y`: Y×ø±êÆ«ÒÆÁ¿¡£
- `width`: °´Å¥¿í¶È¡£
- `height`: °´Å¥¸ß¶È¡£
- `image_normal`: ĬÈÏͼÏñ·¾¶¡£
- `image_pressed`: °´Ñ¹×´Ì¬ÏµÄͼÏñ·¾¶¡£
- `script`: µã»÷°´Å¥Ê±Ö´ÐеĽű¾¡£
##### ²½Öè¶þ£º×¼±¸Í¼Ïñ×ÊÔ´
È·±£Í¼Ïñ×ÊÔ´´æÔÚÓÚÖ¸¶¨Â·¾¶Ï¡£
```plaintext
resource/image/buttons/skill_button.png
resource/image/buttons/skill_button_pressed.png
```
##### ²½ÖèÈý£ºÐ޸Ŀͻ§¶Ë´úÂë
ÔÚ¿Í»§¶Ë´úÂëÖд¦Àí×Ô¶¨Ò尴ťʼþ¡£´ò¿ª`src/client_ui.cpp`Îļþ£¬Ìí¼Ó´¦Àí×Ô¶¨Òå°´Å¥µÄÂß¼¡£
**client_ui.cpp**
```cpp
#include "client_ui.h"
#include "packet_sender.h"
void CClientUI::InitializeButtons()
{
// ³õʼ»¯¸¡¶¯°´Å¥
CUIButton* shopButton = new CUIButton();
shopButton->SetVnum(1001);
shopButton->SetName("É̵갴ť");
shopButton->SetType(BUTTON_TYPE_FLOATING);
shopButton->SetPosition(TOP_RIGHT, 10, 10);
shopButton->SetSize(50, 50);
shopButton->SetImageNormal("buttons/shop_button.png");
shopButton->SetImagePressed("buttons/shop_button_pressed.png");
shopButton->SetScript("open_shop_dialog()");
AddButton(shopButton);
// ³õʼ»¯×Ô¶¨Òå°´Å¥
CUIButton* skillButton = new CUIButton();
skillButton->SetVnum(1002);
skillButton->SetName("¼¼Äܰ´Å¥");
skillButton->SetType(BUTTON_TYPE_CUSTOM);
skillButton->SetPosition(INVENTORY_TAB, 100, 100);
skillButton->SetSize(50, 50);
skillButton->SetImageNormal("buttons/skill_button.png");
skillButton->SetImagePressed("buttons/skill_button_pressed.png");
skillButton->SetScript("cast_skill(10001)");
AddButton(skillButton);
}
void CClientUI::OnButtonClick(int buttonVnum)
{
switch (buttonVnum)
{
case 1001: // É̵갴ť
ExecuteScript("open_shop_dialog()");
break;
case 1002: // ¼¼Äܰ´Å¥
ExecuteScript("cast_skill(10001)");
break;
// ÆäËû°´Å¥...
}
}
void CClientUI::ExecuteScript(const std::string& script)
{
if (script == "open_shop_dialog()")
{
OpenShopDialog();
}
else if (script.substr(0, 11) == "cast_skill(")
{
int skillVnum = std::stoi(script.substr(11, script.find(')') - 11));
CastSkill(skillVnum);
}
// ÆäËû½Å±¾...
}
void CClientUI::CastSkill(int skillVnum)
{
CPacketSender::GetInstance()->SendCastSkillPacket(skillVnum);
}
```
##### ²½ÖèËÄ£º±àÒë²¢²âÊÔ
È·±£ËùÓÐÐ޸ĺóµÄ´úÂë¶¼Äܳɹ¦±àÒë¡£
```sh
g++ -o client src/client_main.cpp src/client_ui.cpp src/packet_sender.cpp -lengine
```
Æô¶¯¿Í»§¶Ë£¬¹Û²ì×Ô¶¨Òå°´Å¥ÊÇ·ñÕýÈ·ÏÔʾºÍÏìÓ¦µã»÷ʼþ¡£
```sh
start client.exe
```
#### 5. ÈÕÖ¾Îļþ¼ì²é
##### ²é¿´¿Í»§¶ËÈÕÖ¾
´ò¿ª¿Í»§¶ËµÄÈÕÖ¾Îļþ£¨Í¨³£Î»ÓÚ`log\client.log`£©£¬²éÕÒÏà¹ØµÄ´íÎóÐÅÏ¢¡£
```plaintext
[2023-10-01 12:34:56] INFO: Initialized floating button [É̵갴ť] at position (TOP_RIGHT, 10, 10)
[2023-10-01 12:34:56] INFO: Initialized custom button [¼¼Äܰ´Å¥] at position (INVENTORY_TAB, 100, 100)
[2023-10-01 12:34:56] INFO: Clicked button [É̵갴ť], executing script [open_shop_dialog()]
[2023-10-01 12:34:56] INFO: Opening shop dialog
[2023-10-01 12:34:56] INFO: Clicked button [¼¼Äܰ´Å¥], executing script [cast_skill(10001)]
[2023-10-01 12:34:56] INFO: Casting skill [10001]
```
¸ù¾ÝÈÕÖ¾ÖеÄÐÅÏ¢£¬È·Èϰ´Å¥ÊÇ·ñÕýÈ·³õʼ»¯ºÍÏìÓ¦µã»÷ʼþ¡£
#### 6. ³£¼ûÎÊÌâ¼°½â¾ö·½°¸
##### ÎÊÌâÒ»£º°´Å¥²»ÏÔʾ
- **¼ì²éÅäÖÃÎļþ**£ºÈ·±£`button_proto.txt`ÖеÄÅäÖÃÕýÈ·ÎÞÎó¡£
- **¼ì²éͼÏñ×ÊÔ´**£ºÈ·±£Í¼ÏñÎļþ´æÔÚ²¢ÇÒ·¾¶ÕýÈ·¡£
- **ÖØÆô¿Í»§¶Ë**£ºÓÐʱºòÖØÆô¿Í»§¶Ë¿ÉÒÔ½â¾öÏÔʾÎÊÌâ¡£
##### ÎÊÌâ¶þ£º°´Å¥µã»÷ÎÞ·´Ó¦
- **¼ì²é½Å±¾**£ºÈ·±£½Å±¾ÄÚÈÝÕýÈ·²¢ÇÒÖ§³ÖËùÐèµÄ²Ù×÷¡£
- **¼ì²é´úÂëÂß¼**£ºÈ·±£°´Å¥µã»÷ʼþ±»ÕýÈ·²¶»ñºÍ´¦Àí¡£
- **ÆôÓõ÷ÊÔģʽ**£ºÆôÓõ÷ÊÔģʽ²é¿´ÏêϸµÄÈÕÖ¾ÐÅÏ¢¡£
##### ÎÊÌâÈý£ºÍ¼Ïñ¼ÓÔØÊ§°Ü
- **¼ì²éÎļþ·¾¶**£ºÈ·±£Í¼ÏñÎļþ·¾¶ÕýÈ·¡£
- **¸üÐÂ×ÊÔ´°ü**£ºÈ·±£ÐµÄͼÏñÎļþ±»´ò°üµ½¿Í»§¶Ë×ÊÔ´°üÖС£
- **¼ì²éÎļþȨÏÞ**£ºÈ·±£¿Í»§¶ËÓжÁȡͼÏñÎļþµÄȨÏÞ¡£
##### ÎÊÌâËÄ£ºÍøÂçÑÓ³Ùµ¼Ö°´Å¥Ê§Ð§
- **ÓÅ»¯ÍøÂçͨÐÅ**£ºÈ·±£ÍøÂçÁ¬½ÓÎȶ¨¡£
- **¼õÉÙÊý¾Ý°ü´óС**£ºÓÅ»¯Êý¾Ý°üÒÔ¼õÉÙ´«Êäʱ¼ä¡£
- **¼ì²é·À»ðǽÉèÖÃ**£ºÈ·±£·À»ðǽûÓÐ×èÖ¹±ØÒªµÄͨÐÅ¡£
#### 7. ×ܽá
ͨ¹ýÒÔÉϲ½Ö裬ÄãÓ¦¸ÃÄܹ»ÔÚGOM´«ÆæÒýÇæÖгɹ¦ÊµÏÖ“Ðü¸¡°´Å¥”ºÍ“×Ô¶¨Òå°´Å¥”¹¦ÄÜ¡£Õâ²»½öÌáÉýÁËÓÎÏ·µÄ½»»¥ÐÔºÍÓû§ÌåÑ飬»¹ÌṩÁ˸ü¶àµÄ¶¨ÖÆ»¯Ñ¡ÏϣÍûÕâÆª½Ì³Ì¶ÔÄãÓÐËù°ïÖú£¡
---
### Ò»¡¢¹¦Äܶ¨Î»ÓëÉè¼ÆÂß¼
#### 1. **Ðü¸¡°´Å¥£¨Floating Button£©**
- **¶¯Ì¬½»»¥ÌØÐÔ**£ºÐü¸¡°´Å¥¿ÉÍÑÀë¹Ì¶¨UIÃæ°å£¬¸ù¾ÝÍæ¼Ò²Ù×÷»ò³¡¾°ÐèÇó¶¯Ì¬µ÷ÕûλÖã¨Èç¸úËæ½ÇÉ«ÒÆ¶¯¡¢Îü¸½ÓÚÆÁÄ»±ßÔµ£©¡£
- **µäÐÍÓ¦Óó¡¾°**£º
- **¿ì½Ý²Ù×÷**£º¿ìËÙÇл»¼¼ÄÜ¡¢Ò©Æ·Ê¹Óá£
- **³¡¾°Ìáʾ**£ºÔÚÌØ¶¨µØÍ¼£¨ÈçBOSSÕ½³¡£©×Ô¶¯µ¯³öÈÎÎñÖ¸Òý»òΣÏÕ¾¯¸æ¡£
- **¼¼ÊõÏÞÖÆ**£ºÐèͨ¹ý×ø±ê¿ØÖÆ£¨`X/YÖáÆ«ÒÆÖµ`£©ºÍ´¥·¢Ìõ¼þ£¨ÈçѪÁ¿µÍÓÚ30%ʱÏÔʾ£©ÊµÏÖ¶¯Ì¬Âß¼¡£
#### 2. **×Ô¶¨Òå°´Å¥£¨Custom Button£©**
- **Áé»îÐÔÓë¶àÑùÐÔ**£º¿ª·¢Õß¿É×Ô¶¨Òå°´Å¥µÄͼ±ê¡¢³ß´ç¡¢´¥·¢Ê¼þ¼°¶¯»Ð§¹û£¬ÉõÖÁǶÌ׸´Ôӽű¾¡£
- **ºËÐÄÓÅÊÆ**£º
- **¶à²ã¼¶½»»¥**£ºÖ§³Ö°´Å¥×éǶÌ×£¨ÈçÖ÷²Ëµ¥Õ¹¿ª×Ó°´Å¥£©¡£
- **Ìõ¼þ´¥·¢**£º¸ù¾ÝÍæ¼ÒµÈ¼¶¡¢×°±¸×´Ì¬µÈ¶¯Ì¬ÏÔʾ»òÒþ²Ø°´Å¥¡£
- **Éè¼Æ°¸Àý**£ºÔÚÐлá½çÃæÖУ¬Í¨¹ý×Ô¶¨Ò尴ťʵÏÖ“Ò»¼üÕÙ»½³ÉÔ±”“×ÊÔ´¾èÏ×”µÈ¸´ÔÓ¹¦ÄÜ¡£
---
### ¶þ¡¢¼¼ÊõʵÏÖ£º´Ó½Å±¾µ½ÒýÇæµÄÐ×÷
#### 1. **µ×²ãÂß¼ÒÀÀµ**
- **LUA½Å±¾Çý¶¯**£º°´Å¥µÄÏÔʾ¡¢Òþ²Ø¼°Ê¼þÏìӦͨ³£Í¨¹ýLUA½Å±¾ÓëÒýÇæAPI½»»¥¡£ÀýÈ磺
```lua
-- ´´½¨Ðü¸¡°´Å¥²¢°ó¶¨Ê¼þ
local btn = ui.CreateFloatingButton("icon_boss", 100, 100)
btn.OnClick = function()
ExecuteSkill("FireSword") -- ´¥·¢¼¼ÄÜ
end
```
- **×ø±êÓë²ã¼¶¿ØÖÆ**£ºÍ¨¹ý`SetPosition()`ºÍ`SetZOrder()`¹ÜÀí°´Å¥µÄÏÔʾÓÅÏȼ¶£¬±ÜÃâÓëÆäËûUIÔªËØ³åÍ»¡£
#### 2. **×ÊÔ´¹ÜÀíÓëÐÔÄÜÓÅ»¯**
- **ËØ²Ä¹æ·¶**£º°´Å¥Í¼±êÐèÊÊÅä¶àÖÖ·Ö±æÂÊ£¨Èç1024x768¡¢1920x1080£©£¬²¢Ô¤¼ÓÔØÖÁ×ÊÔ´³ØÒÔ¼õÉÙ¿¨¶Ù¡£
- **ʼþ½ÚÁ÷**£º¸ßƵ´¥·¢µÄ°´Å¥£¨ÈçÁ¬»÷¼¼ÄÜ£©ÐèÉèÖÃÀäȴʱ¼ä»òʼþ¶ÓÁУ¬·ÀÖ¹½Å±¾×èÈû¡£
---
### Èý¡¢Ó¦Óó¡¾°Ó뿪·¢Êµ¼ù
#### 1. **ÌáÉýÕ½¶·Á÷³©¶È**
- **°¸Àý**£ºÔÚPK³¡¾°ÖУ¬Ðü¸¡°´Å¥¿ÉʵʱÏÔʾµÐÈËѪÁ¿ºÍ¾àÀ룬×Ô¶¨Òå°´Å¥ÔòÌṩ“Ò»¼ü»»×°”“¿ì½Ý»Ø³Ç”¹¦ÄÜ¡£
- **Êý¾ÝÑéÖ¤**£ºÄ³´«ÆæÊµ²âÏÔʾ£¬ÒýÈëÐü¸¡¼¼ÄÜÀ¸ºó£¬Íæ¼Ò²Ù×÷ÏìÓ¦ËÙ¶ÈÌáÉýÔ¼40%¡£
#### 2. **ÐÂÊÖÒýµ¼Ó븶·Ñת»¯**
- **¶¯Ì¬Òýµ¼**£ºÍ¨¹ýÐü¸¡°´Å¥¸ßÁÁй¦ÄÜ£¨ÈçÊ׳äÀñ°ü£©£¬²¢½áºÏ¶¯»Ð§¹ûÎüÒýµã»÷¡£
- **¸¶·ÑÈë¿Ú¶¨ÖÆ**£ºÔÚVIP½çÃæÖУ¬×Ô¶¨Òå°´Å¥¿Éչʾ²»Í¬µµÎ»ÌØÈ¨£¬Ö±½ÓÌø×ªÖ§¸¶Ò³Ãæ¡£
#### 3. **Ðлá¹ÜÀíÓëÉç½»ÔöÇ¿**
- **Ðü¸¡¹«¸æ°å**£ºÐлáÁìÐä¿É·¢²¼¶¯Ì¬Ö¸ÁÈ缯½á×ø±ê£©£¬°´Å¥ÊµÊ±Ë¢Ð²¢Í¬²½ÖÁ³ÉÔ±½çÃæ¡£
- **×Ô¶¨Òå½»»¥Á´**£ºÀýÈ糤°´°´Å¥´¥·¢ÓïÒôÁÄÌ졢˫»÷·¢ËÍÔ¤ÉèÕ½ÊõÖ¸Áî¡£
---
### ËÄ¡¢¿ª·¢Öеij£¼ûÎÊÌâÓëÓÅ»¯½¨Òé
#### 1. **·Ö±æÂÊÊÊÅäÎÊÌâ**
- **ÎÊÌâ**£º°´Å¥Î»ÖÃÔڸ߷ֱæÂÊÆÁÄ»ÖÐÆ«ÒÆ¡£
- **½â¾ö·½°¸**£ºÊ¹ÓÃÏà¶Ô×ø±ê£¨°Ù·Ö±È£©¶ø·Ç¹Ì¶¨ÏñËØÖµ£¬»òͨ¹ý`êµã£¨Anchor£©`°ó¶¨ÆÁÄ»±ßÔµ¡£
#### 2. **ʼþ³åÍ»ÓëÎó´¥**
- **ÎÊÌâ**£ºÐü¸¡°´Å¥ÕÚµ²¹Ø¼ü²Ù×÷ÇøÓò£¨Èç½ÇÉ«ÒÆ¶¯Ò¡¸Ë£©¡£
- **½â¾ö·½°¸**£ºÉèÖÓ͸Ã÷´©Í¸”ÊôÐÔ£¬»òÔö¼Ó°´Å¥ÍÏ×§¸´Î»¹¦ÄÜ¡£
#### 3. **ÐÔÄÜ¿ªÏú¿ØÖÆ**
- **ÓÅ»¯²ßÂÔ**£º
- ¶ÔÒþ²Ø°´Å¥½ûÓÃUpdateʼþ¡£
- ʹÓÃÎÆÀíѹËõ¼¼Êõ¼õÉÙͼ±ê×ÊÔ´Õ¼Óá£
---
### Î塢δÀ´Õ¹Íû£º´Ó¹¦Äܵ½Éú̬µÄÑÓÉì
- **AIÇý¶¯µÄ¶¯Ì¬UI**£º½áºÏÍæ¼ÒÐÐΪÊý¾Ý£¬×Ô¶¯µ÷Õû°´Å¥²¼¾Ö£¨Èç¸ßƵ¼¼ÄÜÓÅÏÈÖö¥£©¡£
- **¿çƽ̨ÊÊÅä**£ºÌ½Ë÷ÒÆ¶¯¶Ë´¥¿ØÊÖÊÆÓëÐü¸¡°´Å¥µÄÈںϣ¨È绬¶¯Õ¹¿ª¼¼ÄÜÂÖÅÌ£©¡£
---
#### ½áÓï
GOMÒýÇæµÄ“Ðü¸¡°´Å¥”Óë“×Ô¶¨Òå°´Å¥”²»½öÊǼ¼Êõ¹¤¾ß£¬¸üÊÇ**ÖØËÜÍæ¼Ò½»»¥ÌåÑé**µÄÇÅÁº¡£Í¨¹ý¾«×¼µÄ½Å±¾¿ØÖÆÓë×ÊÔ´ÓÅ»¯£¬¿ª·¢Õß¿ÉÍ»ÆÆ´«Í³´«ÆæÓÎÏ·µÄUIÏÞÖÆ£¬´òÔì¼æ¾ßЧÂÊÓë³Á½þ¸ÐµÄ¸öÐÔ»¯½çÃæ¡£Î´À´£¬Ëæ×ÅÒýÇæ¹¦Äܵĵü´ú£¬ÕâÁ½´óÄ£¿é»ò½«³ÉΪÓÎÏ·²îÒ컯µÄ¹Ø¼ü¾ºÕùÁ¦¡£
#### 1. ×¼±¸¹¤×÷
ÔÚ¿ªÊ¼Ö®Ç°£¬ÇëÈ·±£ÄãÒѾ°²×°ÁËGOMÒýÇæ£¬²¢ÇÒÓÐÒ»¸ö»ù±¾µÄÓÎÏ·¿ò¼Ü´î½¨Íê³É¡£´ËÍ⣬»¹ÐèҪ׼±¸ºÃËùÓбØÒªµÄ¿Í»§¶ËºÍ·þÎñÆ÷¶ËÎļþ¡£
#### 2. Àí½â“Ðü¸¡°´Å¥”ºÍ“×Ô¶¨Òå°´Å¥”
##### ¸¡¶¯°´Å¥£¨Floating Button£©
¸¡¶¯°´Å¥ÊÇÖ¸¹Ì¶¨ÔÚÆÁĻij¸öλÖõİ´Å¥£¬Í¨³£ÓÃÓÚ¿ìËÙ·ÃÎʳ£Óù¦ÄÜ£¬Èç´ò¿ªÉ̵ꡢ´«ËÍÃŵȡ£
##### ×Ô¶¨Òå°´Å¥£¨Custom Button£©
×Ô¶¨Òå°´Å¥ÊÇÖ¸¿ÉÒÔ¸ù¾ÝÐèÒªÌí¼Óµ½½çÃæÈÎÒâλÖõİ´Å¥£¬Ìṩ¸ü¶àµÄ½»»¥Ñ¡ÏÈç¼¼ÄÜ¿ì½Ý¼ü¡¢ÈÎÎñÌáʾµÈ¡£
#### 3. ʵÏÖ¸¡¶¯°´Å¥
##### ²½ÖèÒ»£º±à¼ÅäÖÃÎļþ
Ê×ÏÈ£¬ÔÚ`data\button_proto.txt`ÎļþÖÐÌí¼Ó¸¡¶¯°´Å¥µÄÅäÖá£
```plaintext
vnum name type position x y width height image_normal image_pressed script
1001 É̵갴ť FLOATING_BUTTON TOP_RIGHT 10 10 50 50 buttons/shop_button.png buttons/shop_button_pressed.png open_shop_dialog()
```
- `vnum`: °´Å¥Î¨Ò»±àºÅ¡£
- `name`: °´Å¥Ãû³Æ¡£
- `type`: °´Å¥ÀàÐÍ£¨FLOATING_BUTTON£©¡£
- `position`: ¹Ì¶¨Î»Öã¨TOP_LEFT, TOP_RIGHT, BOTTOM_LEFT, BOTTOM_RIGHT£©¡£
- `x`: X×ø±êÆ«ÒÆÁ¿¡£
- `y`: Y×ø±êÆ«ÒÆÁ¿¡£
- `width`: °´Å¥¿í¶È¡£
- `height`: °´Å¥¸ß¶È¡£
- `image_normal`: ĬÈÏͼÏñ·¾¶¡£
- `image_pressed`: °´Ñ¹×´Ì¬ÏµÄͼÏñ·¾¶¡£
- `script`: µã»÷°´Å¥Ê±Ö´ÐеĽű¾¡£
##### ²½Öè¶þ£º×¼±¸Í¼Ïñ×ÊÔ´
È·±£Í¼Ïñ×ÊÔ´´æÔÚÓÚÖ¸¶¨Â·¾¶Ï¡£
```plaintext
resource/image/buttons/shop_button.png
resource/image/buttons/shop_button_pressed.png
```
##### ²½ÖèÈý£ºÐ޸Ŀͻ§¶Ë´úÂë
ÔÚ¿Í»§¶Ë´úÂëÖд¦Àí°´Å¥Ê¼þ¡£´ò¿ª`src/client_ui.cpp`Îļþ£¬Ìí¼Ó´¦Àí¸¡¶¯°´Å¥µÄÂß¼¡£
**client_ui.cpp**
```cpp
#include "client_ui.h"
#include "packet_sender.h"
void CClientUI::InitializeButtons()
{
// ³õʼ»¯¸¡¶¯°´Å¥
CUIButton* shopButton = new CUIButton();
shopButton->SetVnum(1001);
shopButton->SetName("É̵갴ť");
shopButton->SetType(BUTTON_TYPE_FLOATING);
shopButton->SetPosition(TOP_RIGHT, 10, 10);
shopButton->SetSize(50, 50);
shopButton->SetImageNormal("buttons/shop_button.png");
shopButton->SetImagePressed("buttons/shop_button_pressed.png");
shopButton->SetScript("open_shop_dialog()");
AddButton(shopButton);
}
void CClientUI::OnButtonClick(int buttonVnum)
{
switch (buttonVnum)
{
case 1001: // É̵갴ť
ExecuteScript("open_shop_dialog()");
break;
// ÆäËû°´Å¥...
}
}
void CClientUI::ExecuteScript(const std::string& script)
{
if (script == "open_shop_dialog()")
{
OpenShopDialog();
}
// ÆäËû½Å±¾...
}
void CClientUI::OpenShopDialog()
{
// ÏÔʾÉ̵ê¶Ô»°¿ò
CUIDialog* shopDialog = new CUIDialog(DIALOG_SHOP);
AddDialog(shopDialog);
}
```
##### ²½ÖèËÄ£º±àÒë²¢²âÊÔ
È·±£ËùÓÐÐ޸ĺóµÄ´úÂë¶¼Äܳɹ¦±àÒë¡£
```sh
g++ -o client src/client_main.cpp src/client_ui.cpp src/packet_sender.cpp -lengine
```
Æô¶¯¿Í»§¶Ë£¬¹Û²ì¸¡¶¯°´Å¥ÊÇ·ñÕýÈ·ÏÔʾºÍÏìÓ¦µã»÷ʼþ¡£
```sh
start client.exe
```
#### 4. ʵÏÖ×Ô¶¨Òå°´Å¥
##### ²½ÖèÒ»£º±à¼ÅäÖÃÎļþ
ÔÚ`data\button_proto.txt`ÎļþÖÐÌí¼Ó×Ô¶¨Òå°´Å¥µÄÅäÖá£
```plaintext
vnum name type position x y width height image_normal image_pressed script
1002 ¼¼Äܰ´Å¥ CUSTOM_BUTTON INVENTORY_TAB 100 100 50 50 buttons/skill_button.png buttons/skill_button_pressed.png cast_skill(10001)
```
- `vnum`: °´Å¥Î¨Ò»±àºÅ¡£
- `name`: °´Å¥Ãû³Æ¡£
- `type`: °´Å¥ÀàÐÍ£¨CUSTOM_BUTTON£©¡£
- `position`: ¹Ì¶¨Î»Öã¨INVENTORY_TAB, STATUS_TAB, SKILL_TABµÈ£©¡£
- `x`: X×ø±êÆ«ÒÆÁ¿¡£
- `y`: Y×ø±êÆ«ÒÆÁ¿¡£
- `width`: °´Å¥¿í¶È¡£
- `height`: °´Å¥¸ß¶È¡£
- `image_normal`: ĬÈÏͼÏñ·¾¶¡£
- `image_pressed`: °´Ñ¹×´Ì¬ÏµÄͼÏñ·¾¶¡£
- `script`: µã»÷°´Å¥Ê±Ö´ÐеĽű¾¡£
##### ²½Öè¶þ£º×¼±¸Í¼Ïñ×ÊÔ´
È·±£Í¼Ïñ×ÊÔ´´æÔÚÓÚÖ¸¶¨Â·¾¶Ï¡£
```plaintext
resource/image/buttons/skill_button.png
resource/image/buttons/skill_button_pressed.png
```
##### ²½ÖèÈý£ºÐ޸Ŀͻ§¶Ë´úÂë
ÔÚ¿Í»§¶Ë´úÂëÖд¦Àí×Ô¶¨Ò尴ťʼþ¡£´ò¿ª`src/client_ui.cpp`Îļþ£¬Ìí¼Ó´¦Àí×Ô¶¨Òå°´Å¥µÄÂß¼¡£
**client_ui.cpp**
```cpp
#include "client_ui.h"
#include "packet_sender.h"
void CClientUI::InitializeButtons()
{
// ³õʼ»¯¸¡¶¯°´Å¥
CUIButton* shopButton = new CUIButton();
shopButton->SetVnum(1001);
shopButton->SetName("É̵갴ť");
shopButton->SetType(BUTTON_TYPE_FLOATING);
shopButton->SetPosition(TOP_RIGHT, 10, 10);
shopButton->SetSize(50, 50);
shopButton->SetImageNormal("buttons/shop_button.png");
shopButton->SetImagePressed("buttons/shop_button_pressed.png");
shopButton->SetScript("open_shop_dialog()");
AddButton(shopButton);
// ³õʼ»¯×Ô¶¨Òå°´Å¥
CUIButton* skillButton = new CUIButton();
skillButton->SetVnum(1002);
skillButton->SetName("¼¼Äܰ´Å¥");
skillButton->SetType(BUTTON_TYPE_CUSTOM);
skillButton->SetPosition(INVENTORY_TAB, 100, 100);
skillButton->SetSize(50, 50);
skillButton->SetImageNormal("buttons/skill_button.png");
skillButton->SetImagePressed("buttons/skill_button_pressed.png");
skillButton->SetScript("cast_skill(10001)");
AddButton(skillButton);
}
void CClientUI::OnButtonClick(int buttonVnum)
{
switch (buttonVnum)
{
case 1001: // É̵갴ť
ExecuteScript("open_shop_dialog()");
break;
case 1002: // ¼¼Äܰ´Å¥
ExecuteScript("cast_skill(10001)");
break;
// ÆäËû°´Å¥...
}
}
void CClientUI::ExecuteScript(const std::string& script)
{
if (script == "open_shop_dialog()")
{
OpenShopDialog();
}
else if (script.substr(0, 11) == "cast_skill(")
{
int skillVnum = std::stoi(script.substr(11, script.find(')') - 11));
CastSkill(skillVnum);
}
// ÆäËû½Å±¾...
}
void CClientUI::CastSkill(int skillVnum)
{
CPacketSender::GetInstance()->SendCastSkillPacket(skillVnum);
}
```
##### ²½ÖèËÄ£º±àÒë²¢²âÊÔ
È·±£ËùÓÐÐ޸ĺóµÄ´úÂë¶¼Äܳɹ¦±àÒë¡£
```sh
g++ -o client src/client_main.cpp src/client_ui.cpp src/packet_sender.cpp -lengine
```
Æô¶¯¿Í»§¶Ë£¬¹Û²ì×Ô¶¨Òå°´Å¥ÊÇ·ñÕýÈ·ÏÔʾºÍÏìÓ¦µã»÷ʼþ¡£
```sh
start client.exe
```
#### 5. ÈÕÖ¾Îļþ¼ì²é
##### ²é¿´¿Í»§¶ËÈÕÖ¾
´ò¿ª¿Í»§¶ËµÄÈÕÖ¾Îļþ£¨Í¨³£Î»ÓÚ`log\client.log`£©£¬²éÕÒÏà¹ØµÄ´íÎóÐÅÏ¢¡£
```plaintext
[2023-10-01 12:34:56] INFO: Initialized floating button [É̵갴ť] at position (TOP_RIGHT, 10, 10)
[2023-10-01 12:34:56] INFO: Initialized custom button [¼¼Äܰ´Å¥] at position (INVENTORY_TAB, 100, 100)
[2023-10-01 12:34:56] INFO: Clicked button [É̵갴ť], executing script [open_shop_dialog()]
[2023-10-01 12:34:56] INFO: Opening shop dialog
[2023-10-01 12:34:56] INFO: Clicked button [¼¼Äܰ´Å¥], executing script [cast_skill(10001)]
[2023-10-01 12:34:56] INFO: Casting skill [10001]
```
¸ù¾ÝÈÕÖ¾ÖеÄÐÅÏ¢£¬È·Èϰ´Å¥ÊÇ·ñÕýÈ·³õʼ»¯ºÍÏìÓ¦µã»÷ʼþ¡£
#### 6. ³£¼ûÎÊÌâ¼°½â¾ö·½°¸
##### ÎÊÌâÒ»£º°´Å¥²»ÏÔʾ
- **¼ì²éÅäÖÃÎļþ**£ºÈ·±£`button_proto.txt`ÖеÄÅäÖÃÕýÈ·ÎÞÎó¡£
- **¼ì²éͼÏñ×ÊÔ´**£ºÈ·±£Í¼ÏñÎļþ´æÔÚ²¢ÇÒ·¾¶ÕýÈ·¡£
- **ÖØÆô¿Í»§¶Ë**£ºÓÐʱºòÖØÆô¿Í»§¶Ë¿ÉÒÔ½â¾öÏÔʾÎÊÌâ¡£
##### ÎÊÌâ¶þ£º°´Å¥µã»÷ÎÞ·´Ó¦
- **¼ì²é½Å±¾**£ºÈ·±£½Å±¾ÄÚÈÝÕýÈ·²¢ÇÒÖ§³ÖËùÐèµÄ²Ù×÷¡£
- **¼ì²é´úÂëÂß¼**£ºÈ·±£°´Å¥µã»÷ʼþ±»ÕýÈ·²¶»ñºÍ´¦Àí¡£
- **ÆôÓõ÷ÊÔģʽ**£ºÆôÓõ÷ÊÔģʽ²é¿´ÏêϸµÄÈÕÖ¾ÐÅÏ¢¡£
##### ÎÊÌâÈý£ºÍ¼Ïñ¼ÓÔØÊ§°Ü
- **¼ì²éÎļþ·¾¶**£ºÈ·±£Í¼ÏñÎļþ·¾¶ÕýÈ·¡£
- **¸üÐÂ×ÊÔ´°ü**£ºÈ·±£ÐµÄͼÏñÎļþ±»´ò°üµ½¿Í»§¶Ë×ÊÔ´°üÖС£
- **¼ì²éÎļþȨÏÞ**£ºÈ·±£¿Í»§¶ËÓжÁȡͼÏñÎļþµÄȨÏÞ¡£
##### ÎÊÌâËÄ£ºÍøÂçÑÓ³Ùµ¼Ö°´Å¥Ê§Ð§
- **ÓÅ»¯ÍøÂçͨÐÅ**£ºÈ·±£ÍøÂçÁ¬½ÓÎȶ¨¡£
- **¼õÉÙÊý¾Ý°ü´óС**£ºÓÅ»¯Êý¾Ý°üÒÔ¼õÉÙ´«Êäʱ¼ä¡£
- **¼ì²é·À»ðǽÉèÖÃ**£ºÈ·±£·À»ðǽûÓÐ×èÖ¹±ØÒªµÄͨÐÅ¡£
#### 7. ×ܽá
ͨ¹ýÒÔÉϲ½Ö裬ÄãÓ¦¸ÃÄܹ»ÔÚGOM´«ÆæÒýÇæÖгɹ¦ÊµÏÖ“Ðü¸¡°´Å¥”ºÍ“×Ô¶¨Òå°´Å¥”¹¦ÄÜ¡£Õâ²»½öÌáÉýÁËÓÎÏ·µÄ½»»¥ÐÔºÍÓû§ÌåÑ飬»¹ÌṩÁ˸ü¶àµÄ¶¨ÖÆ»¯Ñ¡ÏϣÍûÕâÆª½Ì³Ì¶ÔÄãÓÐËù°ïÖú£¡

