📄 maingame.cpp
字号:
if(!pUnit->is_death())
pUnit->PlyFidget();
}
else
{
if(!pUnit->is_death())
pUnit->PlyWalkTo(p->pos.dest_x, p->pos.dest_y);
}
// add_game_msg(RGBA_MAKE(0,205,255,230), "角色:(%s)移动向点(%d, %d)", pUnit->GetName(), (int)p->dest_x, (int)p->dest_y);
}
}
void MainGame::on_handle_unit(void* pData)
{
if(pData==NULL)
return;
STRUCT_HANDLE_UNIT* p = (STRUCT_HANDLE_UNIT*)pData;
Game_Unit* pUnit = (Game_Unit*)m_world.GetObject(p->uid);
Game_Unit* pUnit_obj = (Game_Unit*)m_world.GetObject(p->uid_obj);
if(pUnit)
{
if(pUnit->IsPlayer() && pUnit->m_aim_unit==0 && pUnit_obj)
{
pUnit->m_aim_unit = pUnit_obj->GetID();
}
switch(p->action)
{
case GSACT_AIM_OBJECT:
{
if(p->uid_obj == m_id_player)
{
pUnit->SetControl(TRUE);
pUnit->add_effect_ani("magic\\confusion.txg");//magic\\martyr_client.txg");
pUnit->m_aim_unit = p->uid_obj;
add_game_msg(RGBA_MAKE(50,200,0,200), "角色:(%s) 锁定 角色(%s) 为目标", pUnit->GetName(), pUnit_obj->GetName());
}
else
{
pUnit->SetControl(FALSE);
}
if(pUnit->is_death() || (pUnit_obj && pUnit_obj->is_death()))
{
pUnit->SetControl(FALSE);
}
}
break;
case GSACT_ATTACK:
{
if(pUnit_obj==NULL)
break;
//STRUCT_EFFECT_SPECIFIC uae = p->effect_specific;
pUnit->add_effect_specific(p->effect_specific);
if(pUnit->is_death())
{
pUnit->CaleDamage(FALSE);
}
else
{
if(p->effect_specific.uid_action_type>=100 && !pUnit->is_ranged())
{
pUnit->PlyRanged(pUnit_obj->m_FlatX, pUnit_obj->m_FlatY);
}
else if(!pUnit->is_melee())
{
pUnit->PlyMeleeTo(pUnit_obj->m_FlatX, pUnit_obj->m_FlatY);
}
}
}
break;
case GSACT_SPELL:
{
if(pUnit_obj==NULL)
break;
//STRUCT_EFFECT_SPECIFIC uae = p->effect_specific;
pUnit->add_effect_specific(p->effect_specific);
if(pUnit->is_death())
{
pUnit->CaleDamage(FALSE);
}
else
{
if(!pUnit->is_spell() && !pUnit->is_melee())
pUnit->PlySpell(pUnit_obj->m_FlatX, pUnit_obj->m_FlatY, NULL);
}
}
break;
case GSACT_REVIVE:
{
if(pUnit_obj==NULL)
break;
if(abs(pUnit->m_FlatX-p->pos.src_x)>50)
pUnit->m_FlatX = p->pos.src_x;
if(abs(pUnit->m_FlatY-p->pos.src_y)>50)
pUnit->m_FlatY = p->pos.src_y;
if(abs(pUnit_obj->m_FlatX-p->pos.dest_x)>50)
pUnit_obj->m_FlatX = p->pos.dest_x;
if(abs(pUnit_obj->m_FlatY-p->pos.dest_y)>50)
pUnit_obj->m_FlatY = p->pos.dest_y;
pUnit_obj->life = pUnit_obj->base_life;
pUnit_obj->mana = pUnit_obj->base_mana;
pUnit_obj->update_status();
pUnit_obj->PlyFidget();
pUnit_obj->add_effect_ani("magic\\divine_intervention.txg");
pUnit->add_effect_sound("sound\\fight.wav");
}
break;
default:
break;
}
}
}
void MainGame::on_login(void *pData)
{
StartGame();
}
void MainGame::on_add_unit(void *pData)
{
STRUCT_ADD_UNIT* p = (STRUCT_ADD_UNIT*)pData;
std::string str_res = g_get_unit_res(p->unit_type);
// switch(p->unit_type)
// {
// case 1:
// str_res = "npc\\behemoth.ini";
// break;
// case 2:
// str_res = "npc\\arch_angel.ini";//"npc\\chaos_magic_female.ini";
// break;
// case 3:
// str_res = "npc\\evil_sorceress.ini";//"npc\\life_magic_female.ini";
// break;
// case 4:
// str_res = "npc\\bandit.ini";//"npc\\chaos_archer_male.ini";
// break;
// case 5:
// str_res = "npc\\black_dragon.ini";
// break;
// case 6:
// str_res = "npc\\titan.ini";
// break;
// case 7:
// str_res = "npc\\wolf.ini";//"npc\\dark_blademaster.ini";
// break;
// case 8:
// str_res = "npc\\gargantuan.ini";
// break;
// case 9:
// str_res = "npc\\berserker.ini";
// break;
// case 10:
// str_res = "npc\\dwarf.ini";
// break;
// case 11:
// str_res = "npc\\imp.ini";
// break;
// case 12:
// str_res = "npc\\dark_blademaster.ini";
// break;
// case 13:
// str_res = "npc\\dark_knight.ini";
// break;
// case 14:
// str_res = "npc\\beholder.ini";
// break;
// case 15:
// str_res = "npc\\champion.ini";
// break;
// case 16:
// str_res = "npc\\crusader.ini";
// break;
// case 17:
// str_res = "npc\\mermaid.ini";
// break;
// case 18:
// str_res = "npc\\minotaur.ini";
// break;
// case 19:
// str_res = "npc\\naga.ini";
// break;
// case 20:
// str_res = "npc\\orge_mage.ini";
// break;
// case 21:
// str_res = "npc\\skeleton.ini";
// break;
// case 22:
// str_res = "npc\\sprite.ini";
// break;
// case 23:
// str_res = "npc\\thunderbird.ini";
// break;
// case 24:
// str_res = "npc\\Troglodyte.ini";
// break;
// case 25:
// str_res = "npc\\troll.ini";
// break;
// case 26:
// str_res = "npc\\unicorn.ini";
// break;
// case 27:
// str_res = "npc\\vampire.ini";
// break;
// case 28:
// str_res = "npc\\white_tiger.ini";
// break;
// default:
// return;
// }
// if(m_id_player == 0)
// {
// str_res = "npc\\dark_knight.ini";//"npc\\evil_sorceress.ini";
// }
Game_Unit* pUnit = (Game_Unit*)m_world.GetObject(p->uid);
if(pUnit==NULL)
{
pUnit = new Game_Unit(this);
pUnit->Create(p->uid, str_res.c_str(), p->pos_x,p->pos_y,0);
if(FALSE==m_world.AddObject(pUnit))
{
delete pUnit;
return ;
}
}
Game_Unit* pPlayer = GetControlUnit();
if(pPlayer)
{
if(pPlayer->m_aim_unit==pUnit->m_id)
{
pPlayer->m_aim_unit = 0;
}
}
pUnit->base_life = p->base_life;
pUnit->base_mana = p->base_mana;
pUnit->base_level = p->base_level;
pUnit->base_damage = p->base_damage;
pUnit->base_strength = p->base_strength;
pUnit->base_agility = p->base_agility;
pUnit->base_magic = p->base_magic;
pUnit->life = p->life;
pUnit->mana = p->mana;
pUnit->count_pk = p->count_pk;
pUnit->count_hunter = p->count_hunter;
pUnit->count_die = p->count_die;
if(p->exp_level==pUnit->exp_level_up
&& p->exp_level_up>0
&& p->exp_level_up!=p->exp_level
&& pUnit->base_level>1)
{//升级
pUnit->add_effect_ani("magic\\fire_resistance_potion.txg");
pUnit->add_effect_tip("Level Up!", RGBA_MAKE(205,255,0,255), 4.0f, UNIT_EFFECT_FLAG_DAMAGE);
pUnit->add_effect_sound("sound\\laugh.wav");
}
else
{
pUnit->base_experience = p->base_experience;
}
pUnit->exp_level = p->exp_level;
pUnit->exp_level_up = p->exp_level_up;
if(abs(pUnit->m_FlatX-p->pos_x)>10)
pUnit->m_FlatX = p->pos_x;
if(abs(pUnit->m_FlatY-p->pos_y)>10)
pUnit->m_FlatY = p->pos_y;
if(m_id_player == 0 || m_id_player==pUnit->m_id)
{
m_id_player = p->uid;
//pUnit->m_is_locate_control = TRUE;
m_world.SetFocusObject(pUnit);
pUnit->SetName(p->str_name);
pUnit->update_status();
//pUnit->SetControl(TRUE);
}
else
{
pUnit->m_aim_unit = 0;
pUnit->m_is_locate_control = FALSE;
pUnit->m_is_auto_attack = FALSE;
//strcpy(p->str_name, "比蒙巨兽");
// D3DCOLOR color;
// Game_Unit* pPlayer = GetControlUnit();
// if(pPlayer)
// {
// int lv = p->base_level - pPlayer->base_level;
// if(lv>5)
// {
// color = RGBA_MAKE(255,0,205,255);
// }
// else if(lv>2)
// {
// color = RGBA_MAKE(255,0,100,255);
// }
// else
// {
// color = RGBA_MAKE(200,0,10,255);
// }
// pUnit->SetName(p->str_name, color);
// }
pUnit->SetName(p->str_name);
pUnit->update_status();
}
pUnit->PlyWait();
if(p->life<=0)
{//死尸
pUnit->PlyDeath();
pUnit->GetAnimation()->SetCurrentFrame(-1);
}
pUnit->SetFaceToAngle(p->face_to);
add_game_msg(RGBA_MAKE(0,0,255,230), "新加入角色:(%s)", pUnit->GetName());
}
void MainGame::on_del_unit(void *pData)
{
STRUCT_DEL_UNIT* p = (STRUCT_DEL_UNIT*)pData;
Game_Unit* pUnit = (Game_Unit*)m_world.GetObject(p->uid);
if(pUnit)
add_game_msg(RGBA_MAKE(0,0,255,230), "删除角色:(%s)", pUnit->GetName());
m_world.DeleteObject(p->uid);
}
FLAG MainGame::Update(DWORD dwPassTime)
{
Game_Client::DoUpdate();
if(m_select_magic<0 && m_is_handling_place && m_pEngine->TestMouseState(MK_LBUTTON))
{
Game_Unit* pUnit = GetControlUnit();
if(pUnit)
{
LONG x,y;
m_world.GetOriginal(x, y);
x+=m_pEngine->m_Pos.x;
y+=m_pEngine->m_Pos.y;
if(x!=LONG(pUnit->m_FlatX)||y!=LONG(pUnit->m_FlatY))
pUnit->query_goto(x, y);
}
}
if(Game_Client::IsReady())
{
m_ani_dreamland.Update();
m_world.Update();
if(!m_bk_music.IsPlaying())
{
char strMusic[100];
sprintf(strMusic, "music\\battle_%d.mp3", (int)(rnd()*5.0f));
m_bk_music.SetStreamSource(strMusic);
m_bk_music.Play();
}
}
return 0;
}
HRESULT MainGame::Render()
{
HRESULT hr = S_OK;
m_pEngine->PreparePaint();
if(Game_Client::IsReady())
{
// m_pEngine->DarkenScene(0.2f);
m_pEngine->DarkenScene(0.0f);
m_pEngine->PreparePaint();
//幻境
LONG ox,oy;
m_world.GetOriginal(ox, oy);
CGsTexture* pTexture = m_ani_dreamland.GetCurrentFrame();
//if(pTexture==NULL)
// goto exit;
int w = pTexture->GetWidth();
int h = pTexture->GetHeight();
float scale = 0.7f;
float left = ox/scale/w;
//if(left>1.0f)goto exit;
float top = oy/scale/h;
//if(top>1.0f)goto exit;
float right = (ox+m_world.GetViewWidthPix())/scale/w;
// if(right>1.0f)
// {
// m_aVertex[1].sx = w*scale - ox;
// m_aVertex[3].sx = m_aVertex[1].sx;
// right=1.0f;
// }
// else
// {
m_aVertex[1].sx = m_world.GetViewWidthPix();
m_aVertex[3].sx = m_world.GetViewWidthPix();
// }
float bottom = (oy+m_world.GetViewHeightPix())/scale/h;
// if(bottom>1.0f)
// {
// m_aVertex[2].sy = h*scale - oy;
// m_aVertex[3].sy = m_aVertex[2].sy;
// bottom=1.0f;
// }
// else
// {
m_aVertex[2].sy = m_world.GetViewHeightPix();
m_aVertex[3].sy = m_world.GetViewHeightPix();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -