NPC code
This commit is contained in:
1 parent
2e4a7ab467
commit
995e2c8e5b
10 files changed
+923706
-167
No files matched your search
+34
-112
@@ -162,12 +162,31 @@ namespace ZL
|
||||
benchMesh.data.Move({ -2.1, 0.5, -7.9 });
|
||||
benchMesh.RefreshVBO();
|
||||
|
||||
violaIdleModel.LoadFromFile("resources/idleviola_uv010.txt", CONST_ZIP_FILE);
|
||||
violaWalkModel.LoadFromFile("resources/walkviola_uv010.txt", CONST_ZIP_FILE);
|
||||
auto violaTexture = std::make_shared<Texture>(CreateTextureDataFromPng("resources/viola.png", CONST_ZIP_FILE));
|
||||
|
||||
zombieModel.LoadFromFile("resources/w/zombie002.txt", CONST_ZIP_FILE);
|
||||
|
||||
violaTexture = std::make_unique<Texture>(CreateTextureDataFromPng("resources/viola.png", CONST_ZIP_FILE));
|
||||
// Player (Viola)
|
||||
player = std::make_unique<Character>();
|
||||
player->loadAnimation(AnimationState::IDLE, "resources/idleviola_uv010.txt", CONST_ZIP_FILE);
|
||||
player->loadAnimation(AnimationState::WALK, "resources/walkviola_uv010.txt", CONST_ZIP_FILE);
|
||||
player->setTexture(violaTexture);
|
||||
player->walkSpeed = 3.0f;
|
||||
player->rotationSpeed = 8.0f;
|
||||
player->modelScale = 0.12f;
|
||||
player->modelCorrectionRotation =
|
||||
Eigen::Quaternionf(Eigen::AngleAxisf(-M_PI * 0.5f, Eigen::Vector3f::UnitX())) *
|
||||
Eigen::Quaternionf(Eigen::AngleAxisf(M_PI, Eigen::Vector3f::UnitZ()));
|
||||
|
||||
auto defaultTexture = std::make_shared<Texture>(CreateTextureDataFromPng("resources/w/default_skin001.png", CONST_ZIP_FILE));
|
||||
|
||||
auto zombie = std::make_unique<Character>();
|
||||
zombie->loadAnimation(AnimationState::IDLE, "resources/w/default_idle002.txt", CONST_ZIP_FILE);
|
||||
zombie->setTexture(defaultTexture);
|
||||
zombie->walkSpeed = 1.5f;
|
||||
zombie->rotationSpeed = 2.0f;
|
||||
zombie->modelScale = 0.01f;
|
||||
zombie->position = Eigen::Vector3f(0.f, 0.f, -15.f);
|
||||
zombie->setTarget(zombie->position);
|
||||
npcs.push_back(std::move(zombie));
|
||||
|
||||
loadingCompleted = true;
|
||||
}
|
||||
@@ -206,7 +225,8 @@ namespace ZL
|
||||
|
||||
renderer.RotateMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(cameraInclination, Eigen::Vector3f::UnitX())).toRotationMatrix());
|
||||
renderer.RotateMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(cameraAzimuth, Eigen::Vector3f::UnitY())).toRotationMatrix());
|
||||
renderer.TranslateMatrix({ -violaPosition.x(), -violaPosition.y(), -violaPosition.z() });
|
||||
const Eigen::Vector3f& camTarget = player ? player->position : Eigen::Vector3f::Zero();
|
||||
renderer.TranslateMatrix({ -camTarget.x(), -camTarget.y(), -camTarget.z() });
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, roomTexture->getTexID());
|
||||
renderer.DrawVertexRenderStruct(roomMesh);
|
||||
@@ -219,41 +239,8 @@ namespace ZL
|
||||
renderer.DrawVertexRenderStruct(benchMesh);
|
||||
|
||||
|
||||
renderer.PushMatrix();
|
||||
renderer.TranslateMatrix({ 0,0,-15 });
|
||||
renderer.ScaleMatrix(0.01);
|
||||
zombieModelMutable.AssignFrom(zombieModel.mesh);
|
||||
zombieModelMutable.RefreshVBO();
|
||||
glBindTexture(GL_TEXTURE_2D, violaTexture->getTexID());
|
||||
renderer.DrawVertexRenderStruct(zombieModelMutable);
|
||||
renderer.PopMatrix();
|
||||
|
||||
renderer.PushMatrix();
|
||||
|
||||
renderer.TranslateMatrix({ violaPosition.x(), violaPosition.y(), violaPosition.z() });
|
||||
renderer.RotateMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(-violaFacingAngle, Eigen::Vector3f::UnitY())).toRotationMatrix());
|
||||
renderer.ScaleMatrix(0.12);
|
||||
renderer.RotateMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(-M_PI * 0.5f, Eigen::Vector3f::UnitX())).toRotationMatrix());
|
||||
renderer.RotateMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(M_PI, Eigen::Vector3f::UnitZ())).toRotationMatrix());
|
||||
|
||||
//renderer.RotateMatrix(QuatFromRotateAroundX(-M_PI / 2.0));
|
||||
//renderer.RotateMatrix(QuatFromRotateAroundZ(M_PI));
|
||||
|
||||
if (violaCurrentAnimation == 0) {
|
||||
|
||||
violaIdleModelMutable.AssignFrom(violaIdleModel.mesh);
|
||||
violaIdleModelMutable.RefreshVBO();
|
||||
glBindTexture(GL_TEXTURE_2D, violaTexture->getTexID());
|
||||
renderer.DrawVertexRenderStruct(violaIdleModelMutable);
|
||||
}
|
||||
else if (violaCurrentAnimation == 1) {
|
||||
violaWalkModelMutable.AssignFrom(violaWalkModel.mesh);
|
||||
violaWalkModelMutable.RefreshVBO();
|
||||
glBindTexture(GL_TEXTURE_2D, violaTexture->getTexID());
|
||||
renderer.DrawVertexRenderStruct(violaWalkModelMutable);
|
||||
}
|
||||
|
||||
renderer.PopMatrix();
|
||||
if (player) player->draw(renderer);
|
||||
for (auto& npc : npcs) npc->draw(renderer);
|
||||
|
||||
|
||||
renderer.PopMatrix();
|
||||
@@ -332,74 +319,8 @@ namespace ZL
|
||||
|
||||
lastTickCount = newTickCount;
|
||||
|
||||
// Move Viola toward target
|
||||
Eigen::Vector3f toTarget = violaTarget - violaPosition;
|
||||
toTarget.y() = 0.f;
|
||||
float dist = toTarget.norm();
|
||||
if (dist > VIOLA_WALK_THRESHOLD) {
|
||||
Eigen::Vector3f dir = toTarget / dist;
|
||||
float moveAmount = VIOLA_WALK_SPEED * delta / 1000.f;
|
||||
if (moveAmount >= dist) {
|
||||
violaPosition = violaTarget;
|
||||
violaPosition.y() = 0.f;
|
||||
} else {
|
||||
violaPosition += dir * moveAmount;
|
||||
}
|
||||
violaTargetFacingAngle = atan2(dir.x(), -dir.z());
|
||||
violaCurrentAnimation = 1;
|
||||
} else {
|
||||
violaCurrentAnimation = 0;
|
||||
}
|
||||
|
||||
// Rotate Viola toward target facing angle at constant angular speed
|
||||
float angleDiff = violaTargetFacingAngle - violaFacingAngle;
|
||||
while (angleDiff > M_PI) angleDiff -= 2.f * static_cast<float>(M_PI);
|
||||
while (angleDiff < -M_PI) angleDiff += 2.f * static_cast<float>(M_PI);
|
||||
float rotStep = VIOLA_ROTATION_SPEED * delta / 1000.f;
|
||||
if (std::fabs(angleDiff) <= rotStep) {
|
||||
violaFacingAngle = violaTargetFacingAngle;
|
||||
} else {
|
||||
violaFacingAngle += (angleDiff > 0.f ? rotStep : -rotStep);
|
||||
}
|
||||
|
||||
if (violaCurrentAnimation == 0) {
|
||||
|
||||
violaCurrentIdleFrame += delta / 24.f;
|
||||
|
||||
while (violaCurrentIdleFrame >= 40) {
|
||||
violaCurrentIdleFrame -= 40;
|
||||
}
|
||||
|
||||
if (int(violaCurrentIdleFrame) != violaLastIdleFrame) {
|
||||
violaIdleModel.Interpolate(int(violaCurrentIdleFrame));
|
||||
violaLastIdleFrame = int(violaCurrentIdleFrame);
|
||||
}
|
||||
}
|
||||
else if (violaCurrentAnimation == 1) {
|
||||
|
||||
violaCurrentWalkFrame += delta / 24.f;
|
||||
|
||||
while (violaCurrentWalkFrame >= 30) {
|
||||
violaCurrentWalkFrame -= 30;
|
||||
}
|
||||
|
||||
if (int(violaCurrentWalkFrame) != violaLastWalkFrame) {
|
||||
violaWalkModel.Interpolate(int(violaCurrentWalkFrame));
|
||||
violaLastWalkFrame = int(violaCurrentWalkFrame);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
zombieCurrentIdleFrame += delta / 24.f;
|
||||
|
||||
while (zombieCurrentIdleFrame >= 90) {
|
||||
zombieCurrentIdleFrame -= 90;
|
||||
}
|
||||
|
||||
if (int(zombieCurrentIdleFrame) != zombieLastIdleFrame) {
|
||||
zombieModel.Interpolate(int(zombieCurrentIdleFrame));
|
||||
zombieLastIdleFrame = int(zombieCurrentIdleFrame);
|
||||
}
|
||||
if (player) player->update(delta);
|
||||
for (auto& npc : npcs) npc->update(delta);
|
||||
}
|
||||
|
||||
|
||||
@@ -500,14 +421,15 @@ namespace ZL
|
||||
Eigen::Vector3f camRight(cosAzim, 0.f, sinAzim);
|
||||
Eigen::Vector3f camForward(sinAzim * cosIncl, -sinIncl, -cosAzim * cosIncl);
|
||||
Eigen::Vector3f camUp(sinAzim * sinIncl, cosIncl, -cosAzim * sinIncl);
|
||||
Eigen::Vector3f camPos = violaPosition + Eigen::Vector3f(-sinAzim * cosIncl, sinIncl, cosAzim * cosIncl) * Environment::zoom;
|
||||
const Eigen::Vector3f& playerPos = player ? player->position : Eigen::Vector3f::Zero();
|
||||
Eigen::Vector3f camPos = playerPos + Eigen::Vector3f(-sinAzim * cosIncl, sinIncl, cosAzim * cosIncl) * Environment::zoom;
|
||||
|
||||
Eigen::Vector3f rayDir = (camForward + camRight * (ndcX * aspect * tanHalfFov) + camUp * (ndcY * tanHalfFov)).normalized();
|
||||
|
||||
if (rayDir.y() < -0.001f) {
|
||||
if (rayDir.y() < -0.001f && player) {
|
||||
float t = -camPos.y() / rayDir.y();
|
||||
Eigen::Vector3f hit = camPos + rayDir * t;
|
||||
violaTarget = Eigen::Vector3f(hit.x(), 0.f, hit.z());
|
||||
player->setTarget(Eigen::Vector3f(hit.x(), 0.f, hit.z()));
|
||||
}
|
||||
} else {
|
||||
handleUp(ZL::UiManager::MOUSE_FINGER_ID, mx, my);
|
||||
|
||||
Reference in new issue
Block a user