solidobject.cpp

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

CPP
191
字号
#include "StdAfx.h"
#include "SolidObject.h"
#include "Map/ReadMap.h"
//#include "PhysicsEngine.h"
#include "Rendering/GL/myGL.h"
#include "LogOutput.h"
#include "Map/Ground.h"
#include "myMath.h"
#include "Rendering/GL/glExtra.h"

CR_BIND_DERIVED(CSolidObject, CWorldObject, );

CR_REG_METADATA(CSolidObject, 
(
	CR_MEMBER(mass),
	CR_MEMBER(blocking),
	CR_MEMBER(floatOnWater),
	CR_MEMBER(isUnderWater),
	CR_MEMBER(immobile),
	CR_MEMBER(blockHeightChanges),
	CR_MEMBER(xsize),
	CR_MEMBER(ysize),
	CR_MEMBER(height),
	CR_MEMBER(heading),
	CR_MEMBER(midPos),
	CR_MEMBER(isMoving),
	CR_MEMBER(residualImpulse),
	CR_MEMBER(mobility),
	CR_MEMBER(mapPos),
	CR_MEMBER(isMarkedOnBlockingMap),
	CR_ENUM_MEMBER(physicalState),
	CR_MEMBER(speed),
	CR_RESERVED(16))
);

CSolidObject::CSolidObject(EObjectType synced):
	CWorldObject(synced),
	mass(100000),
	blocking(false),
	blockHeightChanges(false),
	floatOnWater(false),
	xsize(1),
	ysize(1),
	height(1),
	//relMidPos(0,0,0),

	physicalState(Ghost),
	midPos(pos),

	immobile(false),
	//velocity(0,0,0),
	//momentum(0,0,0),
	isMoving(false),
	heading(0),
	buildFacing(0),
	//newVelocity(0,0,0),
	//newMomentum(0,0,0),
	residualImpulse(0,0,0),

	mobility(0),
	yardMap(0),
	isMarkedOnBlockingMap(false),

	speed(0,0,0),
	isUnderWater(false)
{
	mapPos=GetMapPos();
//	mapPos.x=0;
//	mapPos.y=0;
}


/*
Destructor
*/
CSolidObject::~CSolidObject() {
	UnBlock();
//	readmap->CleanBlockingMap(this);	//Debug

	if(mobility)
		delete mobility;
}


/*
Draws some additional information about this object.
*/
void CSolidObject::Draw() {
/*	if(gu->drawdebug) {
		glDisable(GL_TEXTURE_2D);

		//Draw heading-directions.
		glBegin(GL_LINE_STRIP);
		glColor4f(0,0,1,1);
		glVertexf3(midPos);
		glVertexf3(midPos + frontdir*50);
		glEnd();

		glBegin(GL_LINE_STRIP);
		glColor4f(1,1,0,1);
		glVertexf3(midPos);
		glVertexf3(midPos + rightdir*50);
		glEnd();

		glBegin(GL_LINE_STRIP);
		glColor4f(0,1,0,1);
		glVertexf3(midPos);
		glVertexf3(midPos + updir*50);
		glEnd();

		//Draw velocity-vector.
		glBegin(GL_LINE_STRIP);
		glColor4f(1,0,0,1);
		glVertexf3(midPos);
		glVertexf3(midPos + velocity*50);
		glEnd();

		//Draw blocked area on GroundBlockingMap.
		if(isMarkedOnBlockingMap) {
			glBegin(GL_LINE_STRIP);
			glColor4f(1,0,0,1);
			glVertexf3((mapPos + float3(xsize*SQUARE_SIZE/2, 5, ysize*SQUARE_SIZE/2)));
			glVertexf3((mapPos + float3(-xsize*SQUARE_SIZE/2, 5, ysize*SQUARE_SIZE/2)));
			glVertexf3((mapPos + float3(-xsize*SQUARE_SIZE/2, 5, -ysize*SQUARE_SIZE/2)));
			glVertexf3((mapPos + float3(xsize*SQUARE_SIZE/2, 5, -ysize*SQUARE_SIZE/2)));
			glVertexf3((mapPos + float3(xsize*SQUARE_SIZE/2, 5, ysize*SQUARE_SIZE/2)));
			glEnd();
		}

		glEnable(GL_TEXTURE_2D);
	}*/
}



/////////////////////
// Useful fuctions //
/////////////////////

/*
Removes this object from GroundBlockingMap.
*/
void CSolidObject::UnBlock() {
	if(isMarkedOnBlockingMap) {
		readmap->RemoveGroundBlockingObject(this);
	}
}


/*
Adds this object to the GroundBlockingMap.
*/
void CSolidObject::Block() {
	if(isMarkedOnBlockingMap)
		UnBlock();

	if(blocking && (physicalState == OnGround || physicalState == Floating || physicalState == Hovering || physicalState == Submarine)){
		//Using yardmap if available.
		if(yardMap) {
			readmap->AddGroundBlockingObject(this, yardMap);
		} else {
			readmap->AddGroundBlockingObject(this);
		}
	}
}



bool CSolidObject::AddBuildPower(float amount, CUnit* builder) {
	return false;
}

int2 CSolidObject::GetMapPos()
{
	int2 p;
	p.x = (int(pos.x+SQUARE_SIZE/2) / SQUARE_SIZE) - xsize/2;
	p.y = (int(pos.z+SQUARE_SIZE/2) / SQUARE_SIZE) - ysize/2;

	if(p.x<0)
		p.x=0;
	if(p.x>gs->mapx-xsize)
		p.x=gs->mapx-xsize;

	if(p.y<0)
		p.y=0;
	if(p.y>gs->mapy-ysize)
		p.y=gs->mapy-ysize;

	return p;
}

⌨️ 快捷键说明

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