airscript.cpp

来自「这是整套横扫千军3D版游戏的源码」· C++ 代码 · 共 186 行

CPP
186
字号
#include "StdAfx.h"
#include "AirScript.h"
#include "Sim/Units/CommandAI/CommandAI.h"
#include "Sim/Units/UnitLoader.h"
#include "Sim/Units/CommandAI/Command.h"
#include "Sim/Units/Unit.h"
#include "Sim/Units/UnitHandler.h"
#include "Sim/Units/UnitDefHandler.h"
#include "Game/Camera.h"
#include "Sim/MoveTypes/AirMoveType.h"
#include "Platform/ConfigHandler.h"
#include "LogOutput.h"
#include "Map/Ground.h"
#include "mmgr.h"



CAirScript::CAirScript()
: CScript(std::string("Air combat test")),
	tcp(500,100,500),
	tcf(0,0,1),
	lastUpdateTime(0),
	timeOut(15),
	oldCamPos(500,500,500),
	oldCamDir(1,0,0)
{
	curPlane=0;
	for(int a=0;a<32;++a)
		oldUp[a]=UpVector;

	doRoll=false;
}

CAirScript::~CAirScript()
{
}

static const char* FindUnit(const char** name)
{
	for (int i = 0; name[i]; ++i) {
		if (unitDefHandler->GetUnitByName(name[i]))
			return name[i];
	}
	return name[0];
}

void CAirScript::Update()
{
	static const char* armhawk_name[] = { "arm_hawk", "ARMHAWK", NULL };
	static const char* armfig_name [] = { "arm_freedom_fighter", "ARMFIG", NULL };
	static const char* corvamp_name[] = { "core_vamp", "CORVAMP", NULL };
	static const char* corape_name [] = { "core_rapier", "CORAPE", NULL };

	switch(gs->frameNum){
	case 0:
		doRoll=!configHandler.GetInt("ReflectiveWater",1);

		ENTER_MIXED;
		tcp=camera->pos;
		tcf=camera->forward;
		ENTER_SYNCED;
		for(int a=0;a<10;++a){
			CUnit* u;
			if(gs->randFloat()<0.5f)
				u=unitLoader.LoadUnit(FindUnit(armhawk_name),float3(1650,300,2100+a*150),0,false,0,NULL);
			else
				u=unitLoader.LoadUnit(FindUnit(armfig_name),float3(1650,300,2100+a*150),0,false,0,NULL);
			u->pos.y=350;
			u->experience=0.3f;
			((CAirMoveType*)u->moveType)->SetState(CAirMoveType::AIRCRAFT_FLYING);
			planes.push_back(u->id);
			Command c2;
			c2.id=CMD_MOVE_STATE;
			c2.params.push_back(1);
			u->commandAI->GiveCommand(c2);

			Command c;
			c.id=CMD_PATROL;
			c.options=0;
			c.params.push_back(6570);
			c.params.push_back(0);
			c.params.push_back(2560);
			u->commandAI->GiveCommand(c);

			if(gs->randFloat()<0.5f){
				u=unitLoader.LoadUnit(FindUnit(corvamp_name),float3(3880,300,2100+a*150),1,false,0,NULL);
				((CAirMoveType*)u->moveType)->SetState(CAirMoveType::AIRCRAFT_FLYING);
			}else{
				u=unitLoader.LoadUnit(FindUnit(corape_name),float3(3880,300,2100+a*150),1,false,0,NULL);
			}
			u->pos.y=350;
			u->experience=0.3f;
			planes.push_back(u->id);
			u->commandAI->GiveCommand(c2);
			c.params[0]=500;
			u->commandAI->GiveCommand(c);
		}
		break;
	default:
		std::deque<int>::iterator pi;
		int num=0;
		for(pi=planes.begin();pi!=planes.end();++pi){
			if(uh->units[*pi]==0){
				CUnit* u;
				if(!(num&1))
					u=unitLoader.LoadUnit(FindUnit(armhawk_name),float3(1000+(num&1)*5000,500,2100+num*120),(num&1),false,0,NULL);
				else
					u=unitLoader.LoadUnit(FindUnit(corvamp_name),float3(1000+(num&1)*5000,500,2100+num*120),(num&1),false,0,NULL);
				u->pos.y=ground->GetHeight(1000+(num&1)*5000,2100+num*120)+350;
				u->experience=0.3f;
				u->speed.x=2.8f;
				((CAirMoveType*)u->moveType)->SetState(CAirMoveType::AIRCRAFT_FLYING);
				*pi=u->id;

				Command c;
				c.id=CMD_PATROL;
				c.options=0;
				c.params.push_back(7000-(num&1)*6500);
				c.params.push_back(200);
				c.params.push_back(2500+num*60);

				Command c2;
				c2.id=CMD_MOVE_STATE;
				c2.params.push_back(1);
				u->commandAI->GiveCommand(c2);
				u->commandAI->GiveCommand(c);
			}
			num++;
		}
		break;
	}
}

void CAirScript::SetCamera(void)
{
	if(curPlane==0 || uh->units[curPlane]==0){
		std::deque<int>::iterator pi;
		for(pi=planes.begin();pi!=planes.end();++pi){
			if(uh->units[*pi]!=0){
				curPlane=*pi;
				break;
			}
		}
		timeOut=min(1,timeOut+1);
	}
	if(timeOut>0){
		timeOut++;
		camera->forward=oldCamDir;
		camera->pos=oldCamPos;
		if(timeOut>15)
			timeOut=0;
		return;
	}

	if(uh->units[curPlane]==0)
		return;

	//CAircraft* u=(CAircraft*)uh->units[curPlane];
	CUnit *u = uh->units[curPlane];

	float deltaTime=gs->frameNum+gu->timeOffset-lastUpdateTime;
	lastUpdateTime=gs->frameNum+gu->timeOffset;

	float3 modPlanePos=u->pos-u->frontdir*25+u->speed*gu->timeOffset;
	tcp+=(modPlanePos-tcp)*(1-pow(0.95f,deltaTime));
	tcf+=(u->frontdir-tcf)*(1-pow(0.9f,deltaTime));
	tcf.Normalize();

	camera->pos=tcp;
	//camera->forward=((u->pos+u->speed*gu->timeOffset-camera->pos).Normalize()+u->frontdir).Normalize();
	camera->forward=((u->pos+u->speed*gu->timeOffset-camera->pos).Normalize()+tcf.Normalize());
	camera->forward.Normalize();

	if(doRoll){
		oldUp[gs->frameNum%32]=u->updir;
		float3 up(0,0,0);
		for(int a=0;a<32;++a)
			up+=oldUp[a];
		camera->up=up;
	} else {
		camera->up=UpVector;
	}
	oldCamDir=camera->forward;
	oldCamPos=camera->pos;
}

⌨️ 快捷键说明

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