⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 player.cpp

📁 网络泡泡被.net管理
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				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 + -