📄 player.cpp
字号:
if(m_angle<0.2f)
m_angle = 0.2f;
}
}
}
m_ani_face.Update();
return flag_ret;
}
void CPlayer::on_bubble_pop(int index)
{
if (m_scale==MAIN_SCALE)
{
g_ptr_main_game->play_sound("bubble_sound\\pop");
}
m_lst_pop.push_back(m_ap_bubble[index]);
m_ap_bubble[index] = NULL;
}
void CPlayer::on_bubble_spread(int index)
{
_FALL_BUBBLE fb;
fb.p_bubble = m_ap_bubble[index];
fb.h = fb.p_bubble->m_pos_y;
fb.fall = 1.0f;
fb.v_x = (rnd()-0.5f)*m_fWidth*10.0f;
m_lst_spread.push_back(fb);
m_ap_bubble[index] = NULL;
}
bool CPlayer::Shoot()
{
if(m_ptr_bubble_current==NULL || m_ptr_bubble_next==NULL || !IsPlaying())
return false;
STRUCT_SHOOT_DATA shoot;
shoot.x_org = 0;
shoot.y_org = 0;
shoot.shoot_cmd = 0;
shoot.bubble = m_ptr_bubble_current->GetBubbleType();//(rnd()*59+10)/10;
shoot.ftan = tan(m_angle);
// if(g_ptr_main_game->IsReady())
g_ptr_main_game->query_shoot(&shoot);
//m_angle = rnd()*const_PI*3/4 + const_PI/8;
return true;
}
bool CPlayer::on_msg_shoot(STRUCT_SHOOT_DATA *pShoot)
{
if(m_ptr_bubble_current==NULL || m_ptr_bubble_next==NULL)
return false;
_SHOOT_BUBBLE sb;
sb.idx = pShoot->y_stop*m_width + pShoot->x_stop;
sb.shoot = *pShoot;
if(sb.idx>=0 && sb.idx<m_num_data)
{
if(sb.shoot.shoot_cmd%10==0)
{
if ((sb.shoot.shoot_cmd/10)%10==0)
{
m_is_scene_shaking = FALSE;
}
else
{
m_is_scene_shaking = TRUE;
}
SetBubble(sb.shoot.x_stop, sb.shoot.y_stop, m_ptr_bubble_current->GetBubbleType());
SAFE_DELETE(m_ap_bubble[sb.idx]);
m_ap_bubble[sb.idx] = m_ptr_bubble_current;
m_ptr_bubble_current->SetStop(FALSE);
m_ptr_bubble_current = m_ptr_bubble_next;
m_ptr_bubble_current->m_pos_x = 0;
m_ptr_bubble_current->m_pos_y = 0;
m_ptr_bubble_next = new CBubble(m_pEngine);
if(sb.shoot.bubble>0)
{
m_ptr_bubble_next->Create(sb.shoot.bubble);
m_ptr_bubble_next->m_pos_x = -m_fWidth;
}
else
{
m_ptr_bubble_next = NULL;
m_is_end = true;
}
m_angle = atan(pShoot->ftan);
if(m_angle<0)
m_angle += const_PI;
sb.y_speed = 50*sin(m_angle);
}
else
{
SetBubble(sb.shoot.x_stop, sb.shoot.y_stop, sb.shoot.bubble);
SAFE_DELETE(m_ap_bubble[sb.idx]);
m_ap_bubble[sb.idx] = new CBubble(m_pEngine);
m_ap_bubble[sb.idx]->Create(sb.shoot.bubble);
m_ap_bubble[sb.idx]->SetStop(FALSE);
m_ap_bubble[sb.idx]->m_pos_x = sb.shoot.x_org;
m_ap_bubble[sb.idx]->m_pos_y = sb.shoot.y_org;
if (num_bubble_bad>0)
{
num_bubble_bad--;
}
float angle = atan(pShoot->ftan);
if(angle<0)
angle += const_PI;
sb.y_speed = 70*sin(angle);
}
sb.y_pos = 0;
m_lst_shoot.push_front(sb);
return true;
}
return false;
}
bool CPlayer::update_scene_data(STRUCT_ADD_SCENE* ptr_add_scene, UCHAR *ptr_scene_data)
{
if(ptr_add_scene==NULL)
return false;
int state_old = GetState();
*(STRUCT_ADD_SCENE*)this = *ptr_add_scene;
if (GetState()!=PLAYER_STATE_PLAYING)
{
m_is_scene_shaking = FALSE;
}
else if (state_old!=GetState())
{//开始游戏
m_angle = const_PI_DIV_2;
}
if(m_width!=ptr_add_scene->m_width ||m_height!=ptr_add_scene->m_height)
{//错误
if(ptr_add_scene->m_width==0 || ptr_add_scene->m_height==0)
return false;
if(!Create(ptr_add_scene->m_width, ptr_add_scene->m_height))
return false;
}
if (ptr_scene_data==NULL)
{
return false;
}
if(m_ap_bubble==NULL)
{
m_ap_bubble = new CBubble*[m_width*m_height];
memset(m_ap_bubble, 0, sizeof(CBubble*)*m_width*m_height);
}
std::list<CBubble*>::iterator it = m_lst_pop.begin();
while (m_lst_pop.end()!=it)
{
if(*it)
delete(*it);
it = m_lst_pop.erase(it);
}
std::list<_FALL_BUBBLE>::iterator it_f = m_lst_spread.begin();
while (m_lst_spread.end()!=it_f)
{
if(it_f->p_bubble)
delete(it_f->p_bubble);
it_f = m_lst_spread.erase(it_f);
}
//重置当前泡泡和下一个泡泡
if(m_ptr_bubble_current==NULL)
{
m_ptr_bubble_current = new CBubble(m_pEngine);
}
if(m_ptr_bubble_current->GetBubbleType()!=current_bubble_type)
{
m_ptr_bubble_current->Create(current_bubble_type);
}
m_ptr_bubble_current->m_pos_x = 0;
if(m_ptr_bubble_next==NULL)
{
m_ptr_bubble_next = new CBubble(m_pEngine);
}
if(m_ptr_bubble_next->GetBubbleType()!=next_bubble_type)
{
m_ptr_bubble_next->Create(next_bubble_type);
}
m_ptr_bubble_next->m_pos_x = -m_fWidth;
//重置已固定泡泡
for(int x=0; x<m_width; x++)
{
for(int y=0; y<m_height; y++)
{
int i=m_width*y + x;
if(ptr_scene_data[i]==0)
{
if(m_ap_bubble[i])
SAFE_DELETE(m_ap_bubble[i]);
}
else
{
if(m_ap_bubble[i]==NULL)
{
m_ap_bubble[i] = new CBubble(m_pEngine);
}
if(m_ap_bubble[i]->GetBubbleType()!=ptr_scene_data[i])
{
m_ap_bubble[i]->Create(ptr_scene_data[i]);
}
m_ap_bubble[i]->m_pos_x = x;
m_ap_bubble[i]->m_pos_y = y;
GetBubbleCenter(m_ap_bubble[i]->m_pos_x,m_ap_bubble[i]->m_pos_y);
}
m_data[i] = ptr_scene_data[i];
}
}
return true;
}
void CPlayer::on_msg_pointer(int cmd)
{
switch(cmd) {
case _UI_CMD_TURN_LEFT:
if(m_pEngine && (m_control_pointer.key&1)!=1)
{
m_control_pointer.angle_base = m_angle;
m_control_pointer.key |= 1;
m_control_pointer.tick_base = m_pEngine->m_dwEngineTime;
}
break;
case _UI_CMD_TURN_RIGHT:
if(m_pEngine && (m_control_pointer.key&2)!=2)
{
m_control_pointer.angle_base = m_angle;
m_control_pointer.key |= 2;
m_control_pointer.tick_base = m_pEngine->m_dwEngineTime;
}
break;
case _UI_CMD_HODE_LEFT:
m_control_pointer.key &= !1;
break;
case _UI_CMD_HODE_RIGHT:
m_control_pointer.key &= !2;
break;
default:
break;
}
}
void CPlayer::on_msg_score(STRUCT_SCORE *pSS)
{
if(m_pEngine==NULL)
return;
SAFE_DELETE(m_ptr_texture_score);
m_ptr_texture_score = new CGsTexture(m_pEngine);
m_ptr_texture_score->CreateEx(100, 50);
GRECT rc(0,0,100,30);
char str_tip[100];
char str_score[30];
D3DCOLOR color;
if(pSS->gain>0)
{
strcpy(str_score, "win ! ");
sprintf(str_tip, "%s%d", "+", pSS->gain);
color = RGBA_MAKE(0, 200, 0, 255);
}
else
{
strcpy(str_score, "lost ! ");
sprintf(str_tip, "%s%d", "-", -pSS->gain);
color = RGBA_MAKE(200, 0, 0, 255);
}
m_ptr_texture_score->DrawText(NULL,
str_score,
&rc,
100,
50,
DT_CENTER|DT_SINGLELINE|DT_VCENTER,
RGBA_MAKE(0, 200, 255, 255)
);
if (pSS->gain!=0)
{
rc = GRECT(0, 20, 100, 50);
m_ptr_texture_score->DrawText(NULL,
str_tip,
&rc,
100,
50,
DT_CENTER|DT_SINGLELINE|DT_VCENTER,
color
);
}
//m_ptr_texture_score->Clear(RGBA_MAKE(255,255,255,255));
m_ptr_texture_score->SetBasePoint(GPOINT(50,25));
m_is_end = true;
}
bool CPlayer::IsReady()
{
if(m_ptr_bubble_current==NULL || m_ptr_bubble_next==NULL || !IsPlaying())
return false;
return true;
}
void CPlayer::update_user_data(int index, STRUCT_ADD_USER *pData)
{
if(m_pEngine==NULL || pData==NULL)
return;
const char* str_show = g_get_str_shows_res(pData->us_type);
if (str_show)
{
m_ani_face.Create(str_show);
m_ani_face.Play();
}
SAFE_DELETE(m_ptr_texture_state);
m_ptr_texture_state = new CGsTexture(m_pEngine);
m_ptr_texture_state->CreateEx(256, 64);
char str_tip[30];
GRECT rc(0,0,256,60);
m_ptr_texture_state->Clear(RGBA_MAKE(128, 128, 255, 190), &rc);
rc = GRECT(5,10,30,40);
sprintf(str_tip, "%d", index+1);
HFONT fnt = CGsFunc::Font_QuickCreateFont(32);
m_ptr_texture_state->DrawText(fnt,
str_tip,
&rc,
150,
40,
DT_CENTER|DT_SINGLELINE|DT_VCENTER,
RGBA_MAKE(255,255,0, 255)
);
::DeleteObject(fnt);
rc = GRECT(30,10,130,40);
fnt = CGsFunc::Font_QuickCreateFont(18);
m_ptr_texture_state->DrawText(fnt,
pData->str_name,
&rc,
120,
40,
DT_CENTER|DT_SINGLELINE|DT_VCENTER,
RGBA_MAKE(128, 255, 0, 255)
);
::DeleteObject(fnt);
fnt = CGsFunc::Font_QuickCreateFont(12);
rc = GRECT(130, 8, 155, 26);
m_ptr_texture_state->DrawText(fnt,
"得分:",
&rc,
256,
64,
DT_CENTER|DT_SINGLELINE|DT_VCENTER,
RGBA_MAKE(255, 128, 0, 255)
);
rc = GRECT(155, 10, 200, 26);
sprintf(str_tip, "%d", pData->n_score);
m_ptr_texture_state->DrawText(fnt,
str_tip,
&rc,
256,
64,
DT_CENTER|DT_SINGLELINE|DT_VCENTER,
(pData->n_score>=0) ? RGBA_MAKE(70, 250, 20, 255) : RGBA_MAKE(255, 10, 20, 255)
);
::DeleteObject(fnt);
fnt = CGsFunc::Font_QuickCreateFont(10);
rc = GRECT(130, 26, 155, 42);
m_ptr_texture_state->DrawText(fnt,
"胜局:",
&rc,
256,
64,
DT_CENTER|DT_SINGLELINE|DT_VCENTER,
RGBA_MAKE(255, 128, 0, 255)
);
rc = GRECT(155, 26, 200, 42);
sprintf(str_tip, "%d", pData->us_win);
m_ptr_texture_state->DrawText(fnt,
str_tip,
&rc,
256,
64,
DT_CENTER|DT_SINGLELINE|DT_VCENTER,
RGBA_MAKE(70, 250, 20, 255)
);
rc = GRECT(130, 42, 155, 58);
m_ptr_texture_state->DrawText(fnt,
"败局:",
&rc,
256,
64,
DT_CENTER|DT_SINGLELINE|DT_VCENTER,
RGBA_MAKE(255, 128, 0, 255)
);
rc = GRECT(155, 42, 200, 58);
sprintf(str_tip, "%d", pData->us_lost);
m_ptr_texture_state->DrawText(fnt,
str_tip,
&rc,
256,
64,
DT_CENTER|DT_SINGLELINE|DT_VCENTER,
RGBA_MAKE(195, 50, 120, 255)
);
::DeleteObject(fnt);
m_ptr_texture_state->SetBasePoint(GPOINT(128,0));
}
bool CPlayer::IsPlaying()
{
return m_state==PLAYER_STATE_PLAYING;
}
void CPlayer::Start()
{
m_angle = const_PI_DIV_2;
m_is_end = FALSE;
m_is_scene_shaking = FALSE;
m_is_shoot_shaking = FALSE;
m_tick_power_shooter = m_pEngine->m_dwEngineTime;
if (m_tick_power_shooter==0)
m_tick_power_shooter = 1;
m_tick_lost_control = 0;
m_tick_blind = 0;
}
void CPlayer::add_effect_cards(BYTE card_type, float ax, float ay)
{
_EFFECT_CARDS fc;
fc.card_type = card_type;
fc.ax = ax;
fc.ay = ay;
fc.scale = 2.0f;
fc.alpha = 1.0f;
fc.tick = m_pEngine->m_dwEngineTime;
m_lst_effect_cards.push_back(fc);
}
void CPlayer::trigger_scene_shaking()
{
m_is_scene_shaking = TRUE;
}
void CPlayer::add_effect_tip(const char *strTip, GPOINT pt_start, GPOINT pt_end, D3DCOLOR color, float fscale)
{
_EFFECT_TIP et;
et.pTexture = m_pEngine->Register_texture();
et.pTexture->CreateEx(64, 32, D3DX_SF_A1R5G5B5);
et.pTexture->SetBasePoint(GPOINT(32, 16));
et.pTexture->Clear(0);
GRECT rc(0,0,64,32);
HFONT fnt = CGsFunc::Font_QuickCreateFont(8 , NULL, -1, FALSE, FALSE, FALSE);
et.pTexture->DrawText(fnt,
strTip,
&rc,
64,
32,
DT_CENTER|DT_SINGLELINE|DT_VCENTER,
color
);
::DeleteObject(fnt);
//et.pTexture->Clear(color);
et.pt_src = pt_start;
et.pt_dest = pt_end;
et.start_time = m_pEngine->m_dwEngineTime;
et.scale = fscale;
m_lst_effect_tip.push_back(et);
}
void CPlayer::do_release_source()
{
std::list<_EFFECT_TIP>::iterator it_et = m_lst_effect_tip.begin();
while (it_et!=m_lst_effect_tip.end())
{
SAFE_DELETE(it_et->pTexture);
it_et = m_lst_effect_tip.erase(it_et);
}
}
HRESULT CPlayer::do_restore_source()
{
return S_OK;
}
void CPlayer::Reset()
{
m_angle = const_PI_DIV_2;
m_is_end = FALSE;
m_is_scene_shaking = FALSE;
m_is_shoot_shaking = FALSE;
Create(m_width, m_height);
m_tick_power_shooter = 0;
m_tick_lost_control = 0;
m_tick_blind = 0;
}
void CPlayer::TriggerSuperShooter()
{
if (IsSuperShooter())
m_tick_power_shooter += TIME_KEEP_SUPER_SHOOTER/2;
else
m_tick_power_shooter = m_pEngine->m_dwEngineTime;
}
BOOL CPlayer::IsSuperShooter()
{
return m_tick_power_shooter>0 && (m_tick_power_shooter > m_pEngine->m_dwEngineTime || m_pEngine->m_dwEngineTime-m_tick_power_shooter < TIME_KEEP_SUPER_SHOOTER);
}
BOOL CPlayer::IsBlind()
{
return m_tick_blind>0 && (m_tick_blind > m_pEngine->m_dwEngineTime || m_pEngine->m_dwEngineTime-m_tick_blind < TIME_KEEP_BLIND);
}
void CPlayer::TriggerBlind()
{
if (IsBlind())
m_tick_blind += TIME_KEEP_BLIND/2;
else
m_tick_blind = m_pEngine->m_dwEngineTime;
}
BOOL CPlayer::IsLostControl()
{
return m_tick_lost_control>0 && (m_tick_lost_control > m_pEngine->m_dwEngineTime || m_pEngine->m_dwEngineTime-m_tick_lost_control < TIME_KEEP_SUPER_SHOOTER);
}
void CPlayer::TriggerLostControl()
{
if (IsLostControl())
m_tick_lost_control += TIME_KEEP_SUPER_SHOOTER/2;
else
m_tick_lost_control = m_pEngine->m_dwEngineTime;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -