263 lines
4.9 KiB
C++
263 lines
4.9 KiB
C++
#include "gameMap.h"
|
|
|
|
using namespace SE;
|
|
|
|
TMapCharacter::TMapCharacter() :
|
|
Pos(ZeroVec3),
|
|
RotationMatrix(IdentityMatrix),
|
|
Direction(vec3(0.0f, 0.0f, 1.0f)),
|
|
Destination(ZeroVec3),
|
|
VectorToDestination(ZeroVec3),
|
|
Velocity(0.0f)
|
|
{
|
|
}
|
|
|
|
void TMapCharacter::SetPos(vec3& pos)
|
|
{
|
|
Pos = pos;
|
|
}
|
|
|
|
void TMapCharacter::GoToDestination(vec3& dest)
|
|
{
|
|
Destination = vec3(dest.v[0], 0.0f, dest.v[2]);
|
|
Velocity = 0.002f;
|
|
}
|
|
|
|
void TMapCharacter::Update(cardinal timer)
|
|
{
|
|
const float CONST_DISTANCE_SLOW_DOWN = 1.0f;
|
|
const float CONST_DISTANCE_STOP = 0.1f;
|
|
const float CONST_ROTATION_ANGLE_STEP = pi/200;
|
|
|
|
VectorToDestination = (Destination - Pos);
|
|
VectorToDestination.v[1] = 0.0f;
|
|
VectorToDestination = Normalize(VectorToDestination);
|
|
|
|
if (!IsFloatEqual(Velocity, 0.0f))
|
|
{
|
|
float cosa = DotProduct(VectorToDestination, Direction);
|
|
|
|
float alpha = acosf(cosa);
|
|
|
|
if (alpha <= CONST_ROTATION_ANGLE_STEP * timer)
|
|
{
|
|
Direction = VectorToDestination;
|
|
}
|
|
else
|
|
{
|
|
vec3 n = Normalize(CrossProduct(Direction, VectorToDestination));
|
|
|
|
float sinb = sinf(CONST_ROTATION_ANGLE_STEP * timer / 2.0f);
|
|
float cosb = cosf(CONST_ROTATION_ANGLE_STEP * timer / 2.0f);
|
|
|
|
vec4 q;
|
|
q.v[0] = n.v[0] * sinb;
|
|
q.v[1] = n.v[1] * sinb;
|
|
q.v[2] = n.v[2] * sinb;
|
|
q.v[3] = cosb;
|
|
mat3 rmat = mat3(q);
|
|
RotationMatrix *= rmat;
|
|
Direction = rmat * Direction;
|
|
|
|
}
|
|
}
|
|
|
|
if (!(Pos == Destination))
|
|
{
|
|
|
|
float dist = sqrtf((Pos.v[0] - Destination.v[0])*(Pos.v[0] - Destination.v[0]) +
|
|
(Pos.v[1] - Destination.v[1])*(Pos.v[1] - Destination.v[1]) +
|
|
(Pos.v[2] - Destination.v[2])*(Pos.v[2] - Destination.v[2]));
|
|
|
|
if (dist > CONST_DISTANCE_SLOW_DOWN)
|
|
{
|
|
Pos = Pos + timer*Velocity*Direction;
|
|
}
|
|
else if (dist > CONST_DISTANCE_STOP && dist <= CONST_DISTANCE_SLOW_DOWN)
|
|
{
|
|
Pos = Pos + 0.5f*timer*Velocity*Direction;
|
|
}
|
|
else
|
|
{
|
|
Pos = Destination;
|
|
Velocity = 0.0f;
|
|
VectorToDestination = ZeroVec3;
|
|
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
vec3 TMapCharacter::GetPos()
|
|
{
|
|
return Pos;
|
|
}
|
|
|
|
mat3 TMapCharacter::GetRotationMatrix()
|
|
{
|
|
return RotationMatrix;
|
|
}
|
|
|
|
void TGameMap::LoadMap()
|
|
{
|
|
Land = new TSimpleLandClass;
|
|
Land->LoadFromFile(std::string("landscapes/out.ls1"));
|
|
Land->SetTexture(std::string("landscapes/out.bmp"));
|
|
Land->Scale(0.005f);
|
|
|
|
StaticModelArr.resize(3);
|
|
StaticModelArr[0].LoadModel("bt_box_yellow.lm1");
|
|
StaticModelArr[1].LoadModel("bt_box_red.lm1");
|
|
StaticModelArr[2].LoadModel("bt_box_blue.lm1");
|
|
|
|
StaticModelArr[0].ScaleModel(2.0);
|
|
StaticModelArr[0].RotateModel(mat3(vec4(0.0, sin(pi/6), 0.0, cos(pi/6))));
|
|
StaticModelArr[0].MoveModel(vec3(-1.0f, 0.13f, 4.3f));
|
|
|
|
StaticModelArr[1].ScaleModel(2.0);
|
|
StaticModelArr[1].RotateModel(mat3(vec4(-sin(pi / 3), 0.0, 0.0, cos(pi / 3))));
|
|
StaticModelArr[1].RotateModel(mat3(vec4(0.0, -sin(pi / 4), 0.0, cos(pi / 4))));
|
|
StaticModelArr[1].MoveModel(vec3(-6.0f, 0.0f, 8.8f));
|
|
|
|
StaticModelArr[2].ScaleModel(2.0);
|
|
StaticModelArr[2].MoveModel(vec3(-1.5f, 0.23f, 7.8f));
|
|
|
|
|
|
|
|
StaticModelArr[0].UpdateVBO();
|
|
StaticModelArr[1].UpdateVBO();
|
|
StaticModelArr[2].UpdateVBO();
|
|
|
|
//StaticModelArr[0].SetShaderTranslateVector(vec3(-1.0f, 0.23f, 6.3f));
|
|
PlayerChar = new TLiteModel;
|
|
PlayerChar->LoadModel("bt_cone.lm1");
|
|
|
|
AnimModel = new TAnimModel;
|
|
AnimModel->LoadModel("bonemodel.lm1");
|
|
|
|
animSeq = 0;
|
|
//AnimModel->ApplySequence("bonemodel.an1", animSeq);
|
|
|
|
GirlText = new TAnimModel;
|
|
GirlText->LoadModel("girl.lm1");
|
|
//GirlText->ScaleModel(0.1f);
|
|
//GirlText->MoveModel(vec3(0,4,0));
|
|
//GirlText->UpdateVBO();
|
|
//GirlText->ApplySequence("girl.an1", 0);
|
|
|
|
MapChar.SetPos(vec3(0.0f, 0.0f, 10.0f));
|
|
|
|
|
|
}
|
|
|
|
void TGameMap::FreeMap()
|
|
{
|
|
if (Land)
|
|
{
|
|
delete Land;
|
|
Land = NULL;
|
|
}
|
|
|
|
|
|
if (PlayerChar)
|
|
{
|
|
delete PlayerChar;
|
|
PlayerChar = NULL;
|
|
}
|
|
|
|
if (AnimModel)
|
|
{
|
|
delete AnimModel;
|
|
AnimModel = NULL;
|
|
}
|
|
|
|
if (GirlText)
|
|
{
|
|
delete GirlText;
|
|
GirlText = NULL;
|
|
}
|
|
|
|
StaticModelArr.clear();
|
|
}
|
|
|
|
TSimpleLandClass* TGameMap::GetLand()
|
|
{
|
|
return Land;
|
|
}
|
|
|
|
void TGameMap::DrawVBO()
|
|
{
|
|
|
|
|
|
Land->DrawVBO();
|
|
for (TLiteModelArr::iterator i = StaticModelArr.begin(); i != StaticModelArr.end(); ++i)
|
|
{
|
|
//i->DrawImmediate();
|
|
i->DrawVBO();
|
|
}
|
|
|
|
//PlayerChar->DrawVBO();
|
|
|
|
//AnimModel->DrawVBO();
|
|
|
|
//GirlText->DrawVBO();
|
|
|
|
}
|
|
|
|
cardinal timeForSeq = 0;
|
|
|
|
void TGameMap::Update(cardinal timer)
|
|
{
|
|
|
|
MapChar.Update(timer);
|
|
|
|
|
|
vec3 vecFrom, vecTo;
|
|
vec3 pos = Land->CalcVerticalCrossing(MapChar.GetPos());
|
|
|
|
PlayerChar->SetShaderTranslateVector(pos);
|
|
PlayerChar->SetShaderRotateMatrix(MapChar.GetRotationMatrix());
|
|
|
|
timeForSeq += timer;
|
|
|
|
if (timeForSeq >= 2000)
|
|
{
|
|
timeForSeq = 0;
|
|
|
|
if (animSeq != 12)
|
|
{
|
|
animSeq = 12;
|
|
//animSeq+= 1;
|
|
|
|
|
|
if (animSeq >= 100)
|
|
{
|
|
animSeq = 0;
|
|
}
|
|
|
|
//GirlText->ApplySequence("girl.an1", animSeq);
|
|
//GirlText->UpdateVBO();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//AnimModel->ApplySequence("bonemodel.an1", animSeq);
|
|
//AnimModel->UpdateVBO();
|
|
|
|
|
|
}
|
|
|
|
void TGameMap::PlayerClicked(int x, int y)
|
|
{
|
|
/*
|
|
vec3 vecFrom, vecTo;
|
|
SalmonRender->GetVectorOutOfCursor(x, y, vecFrom, vecTo);
|
|
|
|
vec3 r = Land->CalcCrossing(vecFrom, vecTo);
|
|
|
|
MapChar.GoToDestination(r);
|
|
*/
|
|
} |