demo update

This commit is contained in:
h4570
2022-08-20 00:10:07 +02:00
parent 8eb01d34da
commit 405d5afd35
21 changed files with 306 additions and 122 deletions
+21 -12
View File
@@ -40,8 +40,10 @@ Enemy::Enemy(Engine* engine, const EnemyInfo& t_info) {
walkSequence = {0, 1, 2};
fightSequence = {3, 4, 5};
spawnPoint = info.spawnPoint;
mesh->setPosition(info.spawnPoint);
terrainLeftUp = info.terrainLeftUp;
terrainRightDown = info.terrainRightDown;
setMeshToSpawn();
mesh->animation.setSequence(walkSequence);
mesh->animation.loop = true;
@@ -50,8 +52,7 @@ Enemy::Enemy(Engine* engine, const EnemyInfo& t_info) {
mesh->translation.translateY(-5.0F);
audio = &engine->audio;
audio->adpcm.setVolume(5, info.adpcmChannel);
// audio->adpcm.setVolume(30, info.adpcmChannel); // TEMP
audio->adpcm.setVolume(30, info.adpcmChannel);
allocateOptions();
@@ -64,6 +65,14 @@ Enemy::~Enemy() {
delete pair;
}
void Enemy::setMeshToSpawn() {
auto spawnPoint =
Vec4(Math::randomf(terrainLeftUp.x, terrainRightDown.x), 0.0F,
Math::randomf(terrainLeftUp.z, terrainRightDown.z), 1.0F);
mesh->setPosition(spawnPoint);
}
void Enemy::update(const Heightmap& heightmap, const Vec4& playerPosition,
const PlayerShootAction& shootAction) {
auto* enemyPosition = mesh->getPosition();
@@ -73,7 +82,7 @@ void Enemy::update(const Heightmap& heightmap, const Vec4& playerPosition,
auto diff = *enemyPosition - playerPosition;
auto ang = Math::atan2(diff.x, diff.z);
if (diff.length() > 110.0F) {
if (diff.length() > 150.0F) {
walk(heightmap, diff);
} else {
fight();
@@ -97,14 +106,10 @@ void Enemy::handlePlayerShoot(const PlayerShootAction& shootAction) {
auto bbox =
mesh->getCurrentBoundingBox().getTransformed(mesh->getModelMatrix());
float length = -1.0F;
auto isOnEnemy = ray.intersectBox(bbox.min(), bbox.max(), &length);
auto isOnEnemy = ray.intersectBox(bbox.min(), bbox.max());
if (isOnEnemy) {
mesh->setPosition(spawnPoint);
TYRA_LOG("Enemy hit!");
} else {
if (length != -1.0F) TYRA_LOG("Distance: ", length);
setMeshToSpawn();
}
}
@@ -144,6 +149,10 @@ void Enemy::animationCallback(const AnimationSequenceCallback& callback) {
}
}
void Enemy::allocateOptions() { options = new DynPipOptions(); }
void Enemy::allocateOptions() {
options = new DynPipOptions();
options->frustumCulling =
Tyra::PipelineFrustumCulling::PipelineFrustumCulling_None;
}
} // namespace Demo
+3 -4
View File
@@ -43,7 +43,7 @@ EnemyManager::EnemyManager(Engine* engine, const Heightmap& heightmap) {
auto* sample = engine->audio.adpcm.load(
FileUtils::fromCwd("game/models/zombie/punch.adpcm"));
const int enemyCount = 5;
const int enemyCount = 10;
for (int i = 0; i < enemyCount; i++) {
EnemyInfo info;
info.adpcmChannel = 9 + i;
@@ -51,9 +51,8 @@ EnemyManager::EnemyManager(Engine* engine, const Heightmap& heightmap) {
info.motherMesh = motherMesh;
info.clothTexture = clothTexture;
info.bodyTexture = bodyTexture;
info.spawnPoint =
Vec4(Math::randomf(heightmap.leftUp.x, heightmap.rightDown.x), 0.0F,
Math::randomf(heightmap.leftUp.z, heightmap.rightDown.z), 1.0F);
info.terrainLeftUp = heightmap.leftUp;
info.terrainRightDown = heightmap.rightDown;
enemies.push_back(new Enemy(engine, info));
}
}
+31 -38
View File
@@ -10,6 +10,7 @@
#include "states/game/game_state.hpp"
using std::make_unique;
using Tyra::FileUtils;
namespace Demo {
@@ -28,17 +29,20 @@ void GameState::onStart() {
TYRA_LOG("Game. RAM: ", engine->info.getAvailableRAM(), "MB");
engine->audio.song.stop();
engine->audio.song.load(FileUtils::fromCwd("game/ambiance.wav"));
engine->audio.song.inLoop = true;
engine->audio.song.setVolume(100);
engine->audio.song.load(FileUtils::fromCwd("game/game-audio.wav"));
engine->audio.song.setVolume(0);
engine->audio.song.play();
auto* repository = &engine->renderer.core.texture.repository;
player = new Player(engine);
terrain = new Terrain(repository);
enemyManager = new EnemyManager(engine, terrain->heightmap);
ship = new Ship(repository);
skybox = new Skybox(repository);
player = make_unique<Player>(engine);
terrain = make_unique<Terrain>(repository);
enemyManager = make_unique<EnemyManager>(engine, terrain->heightmap);
ship = make_unique<Ship>(repository);
skybox = make_unique<Skybox>(repository);
hud = make_unique<Hud>(repository);
engine->audio.song.setVolume(85);
initialized = true;
}
@@ -46,27 +50,12 @@ void GameState::onStart() {
GlobalStateType GameState::onFinish() {
if (!initialized) return STATE_EXIT;
delete player;
delete enemyManager;
delete terrain;
delete ship;
delete skybox;
initialized = false;
return STATE_EXIT;
}
void GameState::update() {
// Begin frame
player->update(terrain->heightmap);
auto cameraInfo = player->getCameraInfo();
engine->renderer.beginFrame(cameraInfo);
// Clear screen and render skybox
renderer.clear();
skybox->update(player->getPosition());
renderer.renderSkybox(*skybox->pair); // First, because of ALLPASS
// Check fps
if (fpsChecker++ > 50) {
TYRA_LOG("FPS: ", engine->info.getFps(),
@@ -75,25 +64,29 @@ void GameState::update() {
}
// Game logic
player->update(terrain->heightmap);
skybox->update(player->getPosition());
auto shootAction = player->getShootAction();
enemyManager->update(terrain->heightmap, player->getPosition(), shootAction);
auto* firstEnemyMesh = enemyManager->getPairs().front()->mesh;
// Render other stuff
renderer.add(ship->pair);
renderer.add(player->pair);
renderer.add(enemyManager->getPairs());
renderer.add(terrain->pair);
renderer.render();
// Debug
// auto& utility = engine->renderer.renderer3D.utility;
// utility.drawBox(*player->getCameraInfo().looksAt, 0.3F);
// auto* firstEnemy = enemyManager->getPairs().front()->mesh;
// utility.drawBBox(firstEnemy->getCurrentBoundingBox().getTransformed(
// firstEnemy->getModelMatrix()));
// End frame
// Render
engine->renderer.beginFrame(player->getCameraInfo());
{
renderer.clear();
{
renderer.add(skybox->pair); // First, because of ALLPASS
renderer.add(ship->pair);
renderer.add(player->pair);
renderer.add(enemyManager->getPairs());
renderer.add(terrain->pair);
renderer.add(firstEnemyMesh->getCurrentBoundingBox().getTransformed(
firstEnemyMesh->getModelMatrix()));
renderer.add(hud->crosshairSprite.get());
renderer.add(hud->hpSprite.get());
}
renderer.render();
}
engine->renderer.endFrame();
}
+43
View File
@@ -0,0 +1,43 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include "states/game/hud/hud.hpp"
using Tyra::FileUtils;
namespace Demo {
Hud::Hud(TextureRepository* t_repo) {
repo = t_repo;
hpSprite = std::make_unique<Sprite>();
hpSprite->mode = Tyra::MODE_STRETCH;
hpSprite->size.set(128.0F, 64.0F);
hpSprite->position.set(0, 448.0F - 64.0F - 5.0F);
hpTexture = repo->add(FileUtils::fromCwd("game/health_bar.png"));
hpTexture->addLink(hpSprite->id);
crosshairSprite = std::make_unique<Sprite>();
crosshairSprite->mode = Tyra::MODE_STRETCH;
crosshairSprite->size.set(16.0F, 16.0F);
crosshairSprite->position.set(512.0F / 2.0F - 16.0F / 2,
448.0F / 2.0F - 16.0F / 2);
crosshairTexture = repo->add(FileUtils::fromCwd("game/crosshair.png"));
crosshairTexture->addLink(crosshairSprite->id);
}
Hud::~Hud() {
repo->free(crosshairTexture->id);
repo->free(hpTexture->id);
}
} // namespace Demo
+3 -2
View File
@@ -18,7 +18,7 @@ Player::Player(Engine* engine)
pad = &engine->pad;
position = Vec4(3.0F, 50.0F, 0.0F);
camera.lookAt = Vec4(0.0F, 0.0F, -30.0F);
speed = 5.0F;
speed = 6.0F;
}
Player::~Player() { delete pair; }
@@ -36,7 +36,8 @@ PlayerShootAction Player::getShootAction() const {
action.isShooting = weapon.isShooting;
if (action.isShooting) {
action.ray = Ray(camera.position, camera.lookAt.getNormalized());
action.ray =
Ray(camera.position, (camera.lookAt - camera.position).getNormalized());
}
return action;
@@ -33,6 +33,10 @@ void GameRenderer::add(std::vector<RendererDynamicPair*> t_dynamicPairs) {
t_dynamicPairs.end());
}
void GameRenderer::add(Sprite* sprite) { sprites.push_back(sprite); }
void GameRenderer::add(const CoreBBox& bbox) { bboxes.push_back(bbox); }
void GameRenderer::add(RendererStaticPair* staticPair) {
staticPairs.push_back(staticPair);
}
@@ -44,14 +48,12 @@ void GameRenderer::add(RendererDynamicPair* dynamicPair) {
void GameRenderer::clear() {
staticPairs.clear();
dynamicPairs.clear();
}
void GameRenderer::renderSkybox(const RendererStaticPair& pair) {
renderer->renderer3D.usePipeline(&stpip);
stpip.render(pair.mesh, pair.options);
sprites.clear();
bboxes.clear();
}
void GameRenderer::render() {
// Render static stuff
if (staticPairs.size()) {
renderer->renderer3D.usePipeline(&stpip);
@@ -60,8 +62,9 @@ void GameRenderer::render() {
}
}
Threading::switchThread();
Threading::switchThread(); // give some time for audio thread
// Render animated stuff
if (dynamicPairs.size()) {
renderer->renderer3D.usePipeline(&dypip);
@@ -69,6 +72,18 @@ void GameRenderer::render() {
dypip.render(pair->mesh, pair->options);
}
}
Threading::switchThread();
// Render debug stuff after stapip/dynpip, otherwise it will not be visible
for (auto& bbox : bboxes) {
renderer->renderer3D.utility.drawBBox(bbox);
}
// Render 2D
for (auto& sprite : sprites) {
renderer->renderer2D.render(sprite);
}
}
} // namespace Demo
+2 -2
View File
@@ -43,12 +43,12 @@ void IntroState::onStart() {
}
GlobalStateType IntroState::onFinish() {
if (!initialized) return STATE_GAME;
if (!initialized) return STATE_LOADING;
stateManager.freeAll();
initialized = false;
return STATE_GAME;
return STATE_LOADING;
}
void IntroState::update() {
@@ -41,7 +41,7 @@ void IntroPressKeyState::onStart() {
for (u8 j = 0; j < mapCols; j++) {
mapSprites[i][j] = new Sprite;
mapSprites[i][j]->color.a = 0.0F;
mapSprites[i][j]->setMode(SpriteMode::MODE_STRETCH);
mapSprites[i][j]->mode = SpriteMode::MODE_STRETCH;
mapSprites[i][j]->size.set(textureWidthHeight, textureWidthHeight);
mapSprites[i][j]->position.set(i * textureWidthHeight,
j * textureWidthHeight);
+72
View File
@@ -0,0 +1,72 @@
/*
# _____ ____ ___
# | \/ ____| |___|
# | | | \ | |
#-----------------------------------------------------------------------
# Copyright 2022, tyra - https://github.com/h4570/tyra
# Licensed under Apache License 2.0
# Sandro Sobczyński <sandro.sobczynski@gmail.com>
*/
#include <tyra>
#include "states/loading/loading_state.hpp"
#include <memory>
using std::make_unique;
using std::unique_ptr;
using Tyra::FileUtils;
using Tyra::Sprite;
namespace Demo {
LoadingState::LoadingState(Engine* t_engine) : State(t_engine) {
state = STATE_LOADING;
_wantFinish = false;
initialized = false;
}
LoadingState::~LoadingState() {}
void LoadingState::onStart() {
TYRA_LOG("Loading. RAM: ", engine->info.getAvailableRAM(), "MB");
auto* repo = &engine->renderer.core.texture.repository;
auto fillerTexture = repo->add(FileUtils::fromCwd("loading/filler.png"));
auto loadingTexture = repo->add(FileUtils::fromCwd("loading/loading.png"));
auto fillerSprite = make_unique<Sprite>();
auto loadingSprite = make_unique<Sprite>();
fillerSprite->position.set(0.0F, 0.0F);
fillerSprite->size.set(600.0F, 600.0F);
fillerSprite->mode = Tyra::MODE_STRETCH;
loadingSprite->size.set(128.0F, 64.0F);
loadingSprite->mode = Tyra::MODE_STRETCH;
loadingSprite->position.set(5.0F, 448.0F - 64.0F - 5.0F);
fillerTexture->addLink(fillerSprite->id);
loadingTexture->addLink(loadingSprite->id);
engine->renderer.beginFrame();
engine->renderer.renderer2D.render(fillerSprite.get());
engine->renderer.renderer2D.render(loadingSprite.get());
engine->renderer.endFrame();
repo->free(fillerTexture->id);
repo->free(loadingTexture->id);
initialized = true;
}
GlobalStateType LoadingState::onFinish() {
if (!initialized) return STATE_GAME;
initialized = false;
return STATE_GAME;
}
void LoadingState::update() { _wantFinish = true; }
} // namespace Demo