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

📄 gamelogic.cpp

📁 大型3D游戏设计制作详析及源代码,游戏脚本,设计报告,技术报告,用户手册
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		item.pic_id = m_enumPointer->icon_id ;

		item.description = m_enumPointer->description.c_str() ;
	
		item.x = 38 ;
		item.height = 60 ;
		item.width = 210 ;
		item.y += 50 ;
		if ( m_enumPointer == m_focused_menu_item )
		{
			item.is_focus = true ;
		}
		else
		{
			item.is_focus = false ;
		}

		memcpy(pItem, &item, sizeof( SMenuItem ) ) ;
		item.y += 28 ;
		m_enumPointer++ ;
	}
	else
	{
		item.pic_id = -1 ;
		item.description = NULL ;
		item.x = 0 ;
		item.y = 0 ;
		memcpy(pItem, &item, sizeof( SMenuItem ) ) ;
		reset_enum_pointer(m_enumPointer) ;
	}
}

/*
 *	菜单指针有没有到结尾
 */
bool CGameLogic::is_enum_item_end(const std::vector<SPropertyItem>::iterator& pos)
{
	switch ( m_current_menu ) {
	case MENU1:
			return pos == m_gerneral_menu.end() ;
		break;
	case MENU2:
			return pos == m_ActorManager->GetActiveActor().m_tools.end() ;
		break;
	case MENU3:
		    return pos == m_ActorManager->GetActiveActor().m_skills.end() ;
		break ;
	case MENU4:
		    return pos == m_gerneral_menu.end() ;
		break ;
	default:
		break ;
	}
	return true ;
}

/*
 *	菜单指针是不是到开头
 */
bool CGameLogic::is_enum_item_begin(const std::vector<SPropertyItem>::iterator& pos)
{
	switch ( m_current_menu ) {
	case MENU1:
		return pos == m_gerneral_menu.begin() ;
		break;
	case MENU2:
		return pos == m_ActorManager->GetActiveActor().m_tools.begin() ;
		break;
	case MENU3:
		return pos == m_ActorManager->GetActiveActor().m_skills.begin() ;
		break ;
	case MENU4:
		return pos == m_gerneral_menu.begin() ;
		break ;
	default:
		break ;
	}
	return true ;
}

/*
 *	重置枚举指针到开始
 */
void CGameLogic::reset_enum_pointer(std::vector<SPropertyItem>::iterator& pos)
{
	pos = m_scroll_point ;
}

/*
 *	当前人物调查地图
 */
void CGameLogic::Research()
{
	CPlayer&	Actor = m_ActorManager->GetActiveActor() ;
	int ix = Actor.x ;
	int iy = Actor.y ;
	int new_event ;

	/*
	 *	自身所在位置的调查
	 */
	int event_id = this->m_LogicMap[m_current_map][ix/granularity][iy/granularity] ;

	/* 先根据地图处理地图事件 */
	if ( event_id > 256 )
	{
		/* 调用触发事件 */
		m_EventManager->Call_Event( event_id ) ;

		/* 如果触发事件有后续事件,则改动逻辑地图 */
		if ( (new_event = m_EventManager->Following_Event(event_id)) != -1)
		{
			this->m_LogicMap[m_current_map][ix/granularity][iy/granularity] = new_event ;
		}

		return ;
	}

	/*
	 *	自身周边的位置调查
	 */
	for (int dx = -1; dx <= 1; dx ++ )
	{
		for ( int dy = -1; dy <= 1; dy++ )
		{
			event_id = this->m_LogicMap[m_current_map][ix/granularity + dx ][iy/granularity + dy ] ;

			if ( event_id >= 300 && event_id <= 310 )
			{
				/* 调用触发事件 */
				m_EventManager->Call_Event( event_id ) ;

				/* 修改地图 */
				this->m_LogicMap[m_current_map][ix/granularity + dx][iy/granularity + dy] = 1 ;

				return ;
			}
		}
	}

	/* 看看是否有用户关注的npc,如果有,引发菜单*/
	if ( m_ActorManager->GetUserAttention() != NULL )
	{
		BringUpMenu( MENU4 ) ;
	}
}

/*
 *	对菜单选择的处理
 */
void CGameLogic::SelectItem()
{
	CPlayer&	Actor = m_ActorManager->GetActiveActor() ;
	CPlayer*    npc = NULL ;
	vector<string>	Argu ;

	switch (m_current_menu) 
	{
	case MENU1 :			/* 人物属性菜单:回车不作为 */
		break;
	case MENU2 :			/* 物品菜单:回车就使用物品 */
		if ( !is_enum_item_end( m_focused_menu_item ) )
		{
			// 改变人物属性
			Actor.ChangeProperty( m_focused_menu_item->name, m_focused_menu_item->val ) ;

			// 从装备中删除节点
			Actor.m_tools.erase( m_focused_menu_item ) ;
			
			// 枚举指针恢复到第一条
			m_enumPointer = Actor.m_tools.begin() ;

			// 恢复焦点指针到第一位
			m_focused_menu_item = m_enumPointer ;
			
			/* 卷屏点也恢复到开始 */
			m_scroll_point = m_enumPointer ;
		}
		
		break;
	case MENU3 :
		/* 三号菜单:招数菜单,选择招数进行攻击 */
		
		if ( m_focused_menu_item->val != 999 )
		{
			/* actor状态变成攻击,播放攻击帧 */
			Actor.Attack( m_focused_menu_item->description, m_npcFighter ) ;
		}
		else
		{
			Actor.TryEscape( m_npcFighter ) ;
		}
		
		m_GameState = NORMAL ;
		m_current_menu = NOMENU ;
		break ;

	case MENU4 :
		/* 四号菜单:人物调查菜单:选择不同的行为 */
		switch ( m_focused_menu_item->val ) 
		{
		/* 和关注npc聊天 */
		case 0 :
			Argu.push_back(m_ActorManager->GetUserAttention()->name) ;
			Argu.push_back(m_ActorManager->GetActiveActor().name) ;
			m_GameState = NORMAL ;
			m_current_menu = NOMENU ;
			m_EventManager->Call_Event(m_ActorManager->GetUserAttention()->TalkScript(), &Argu) ;
			break ;

		/* 和关注的npc战斗 */
		case 1 :
			Argu.push_back(m_ActorManager->GetActiveActor().name) ;
			Argu.push_back(m_ActorManager->GetUserAttention()->name) ;
			m_GameState = NORMAL ;
			m_current_menu = NOMENU ;
			m_EventManager->Call_Event("fight", &Argu) ;
			break ;

		/* 啥也不作,关掉菜单 */
		case 2 :
			m_GameState = NORMAL ;
			m_current_menu = NOMENU ;
			break ;

		/* 出人物生平简介 */
		case 3 :
			Argu.push_back(m_ActorManager->GetUserAttention()->name) ;
			Argu.push_back(m_ActorManager->GetActiveActor().name) ;
			m_GameState = NORMAL ;
			m_current_menu = NOMENU ;
			m_EventManager->Call_Event("show", &Argu) ;

			break ;
		default:
			break ;
		}

		break ;
	}
}

/*
 *	卷动菜单:返回false如果卷动到底不作为
 */
bool CGameLogic::Scrolled( int waypoint )
{
	if ( waypoint == DOWNWARD )
	{
		if ( !is_enum_item_end( m_scroll_point + MAXSCROLLITEM ) )
		{
			m_scroll_point++ ;
			reset_enum_pointer( m_enumPointer ) ;
			return true ;
		}
	}
	else
	{
		if ( !is_enum_item_begin( m_scroll_point ) )
		{
			m_scroll_point-- ;
			reset_enum_pointer( m_enumPointer ) ;
			return true ;
		}
	}
	return false ;
}

/*
 *	查询战斗状态:不在战斗状态返回-1
 */
void CGameLogic::QueryBattleState(int* x, int* y, int* radius )
{
	if ( !m_is_fighting )
	{
		*x = 0 ;
		*y = 0 ;
		*radius = -1 ;
	}
	else
	{
		*x = m_lightspot_x ;
		*y = m_lightspot_y ;
		*radius = m_lightspot_radius ;
	}
}

/*
 *	设定对战的npcActor
 */
void CGameLogic::StartFight(const std::string& name, const string& npc_name)
{
	CPlayer& actor = this->m_ActorManager->GetActor(name) ;
	CPlayer& npc = this->m_ActorManager->GetActor(npc_name) ;

	m_is_fighting = true ;

	this->m_npcFighter = npc_name ;

	if ( m_walking_speed <= SLOWMODE )
	{
		SetLightSpot( (actor.x + npc.x) / 2, ( actor.y + npc.y ) / 2 , 90 ) ;
	}
	else 
	{
		SetLightSpot( (actor.x + npc.x) / 2, ( actor.y + npc.y ) / 2 , 150 ) ;
	}
}

void CGameLogic::EndFight(const string& name)
{
	m_is_fighting = false ;

	if ( name == "牛二" )
	{
		m_ActorManager->GetActiveActor().Die() ;

		m_EventManager->Do_Event("Die_event") ;

		return ;
	}

	// 从战斗脚本里退出
	m_EventManager->Return_from_Event() ;
}

void CGameLogic::BringUpMenu(int id )
{
	SPropertyItem item ;

	switch (id) 
	{
	/* 人物属性菜单 */
	case MENU1 :
		/* 拷贝菜单项 */
		dump_property_menu() ;

		m_enumPointer = m_gerneral_menu.begin() ;
		m_focused_menu_item = m_gerneral_menu.begin() ;
		m_scroll_point = m_enumPointer ;
		Speak("菜单") ;
		break;

	/* 人物装备菜单 */
	case MENU2 :
		m_enumPointer = m_ActorManager->GetActiveActor().m_tools.begin() ;
		m_focused_menu_item = m_ActorManager->GetActiveActor().m_tools.begin() ;
		m_scroll_point = m_enumPointer ;
		Speak("菜单") ;
		break;

	/* 战斗时人物技能菜单 */
	case MENU3 :
		m_enumPointer = m_ActorManager->GetActiveActor().m_skills.begin() ;
		m_focused_menu_item = m_ActorManager->GetActiveActor().m_skills.begin() ;
		m_scroll_point = m_enumPointer ;
		break ;

	/* 利用通用菜单的人物调查菜单 */
	case MENU4 :
		memset(&item, 0, sizeof(item) ) ;
		m_gerneral_menu.clear() ;

		item.icon_id = -1 ;

		item.description = "<size=12> </p>    看看他到底是什么人" ;
		item.val = 3 ;
		m_gerneral_menu.push_back(item) ;


		/* 出现在菜单上的描述 */
		item.description = "<size=12> </p>       和他聊一聊吧" ;

		/* 菜单的id,用于按键时判断菜单的选择项 */
		item.val = 0 ;
		m_gerneral_menu.push_back(item) ;

		item.description = "<size=12> </p>     真不爽,打他丫的" ;
		item.val = 1 ;
		m_gerneral_menu.push_back(item) ;

		item.description = "<size=12> </p>       不理他,走人" ;
		item.val = 2 ;
		m_gerneral_menu.push_back(item) ;

		m_enumPointer = m_gerneral_menu.begin() ;
		m_focused_menu_item = m_gerneral_menu.begin() ;
		m_scroll_point = m_enumPointer ;

		break ;
	default:
		throw( exception("try to use invalide menu!") ) ;
	}
	m_GameState = MENUING ;
	m_current_menu = id ;
}

void CGameLogic::dump_property_menu()
{
	CPlayer& actor = m_ActorManager->GetActiveActor() ;
	SPropertyItem* property ;
	SPropertyItem  item ;
	stringstream stream ;
	string empty ;

	memset(&item, 0, sizeof(item) ) ;
	m_gerneral_menu.clear() ;

	property = actor.Property("生命力") ;
	item.icon_id = m_ActorManager->GetSimpleObj( property->name ).ResID ;
	stream << "<size=13>生命力" << ": <color=255>" << property->val ;

	property = actor.Property("生命力上限") ;
	stream << "<color=16777215>/" << property->val << "</p>" << property->description ;

	item.description = stream.str() ;
	m_gerneral_menu.push_back(item) ;
	
	stream.rdbuf()->str( empty ) ;

	property = actor.Property("魔法力") ;
	item.icon_id = m_ActorManager->GetSimpleObj( property->name ).ResID ;
	stream << "<size=13>法术" << ": " << property->val ;

	property = actor.Property("魔法力上限") ;
	stream << "/" << property->val << "</p>" << property->description ;
	item.description = stream.str() ;
	m_gerneral_menu.push_back(item) ;
	stream.rdbuf()->str( empty ) ;

	property = actor.Property("攻击力") ;
	item.icon_id = m_ActorManager->GetSimpleObj( property->name ).ResID ;
	stream << "<size=13>攻击力" << ": " << property->val ;

	property = actor.Property("攻击力上限") ;
	stream << "/" << property->val << "</p>" << property->description ;

	item.description = stream.str() ;
	m_gerneral_menu.push_back(item) ;
	stream.rdbuf()->str( empty ) ;

	property = actor.Property("等级") ;
	item.icon_id = m_ActorManager->GetSimpleObj( property->name ).ResID ;
	stream << "<size=13>等级" << ":" << property->val << "</p>" << property->description ;
	item.description = stream.str() ;
	m_gerneral_menu.push_back(item) ;
	stream.rdbuf()->str( empty ) ;

	property = actor.Property("经验") ;
	item.icon_id = m_ActorManager->GetSimpleObj( property->name ).ResID ;
	stream << "<size=13>江湖经验" << ": " << property->val << "</p>" << property->description ;
	item.description = stream.str() ;
	m_gerneral_menu.push_back(item) ;
	stream.rdbuf()->str( empty ) ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -