Skip to content

Commit 1c36f6b

Browse files
Add team-based color and logic to player and enemy
Introduces EnemyTeam to PlayerEntity and PlayerController, passing team as a constructor argument. EnemySpawner now takes a team and applies team-based coloring to its materials. PlayerController sets material colors based on team. Enemy AI now checks team before targeting players. Map spawner logic assigns teams to spawners. Also fixes texture cleanup and cached texture removal in GfxTexture2d destructor.
1 parent a520ab5 commit 1c36f6b

File tree

7 files changed

+89
-35
lines changed

7 files changed

+89
-35
lines changed

src/brl/gfx/texture.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,21 @@ brl::GfxTexture2d* brl::GfxTexture2d::getWhiteTexture()
136136
brl::GfxTexture2d::~GfxTexture2d()
137137
{
138138
GfxTexture::~GfxTexture();
139-
delete[] pixels;
139+
if (pixels)
140+
{
141+
142+
delete[] pixels;
143+
pixels = nullptr;
144+
}
145+
for (const auto& cached_texture : cachedTextures)
146+
{
147+
if (cached_texture.second == this)
148+
{
149+
cachedTextures.erase(std::find(cachedTextures.begin(), cachedTextures.end(), cached_texture));
150+
break;
151+
}
152+
}
153+
140154
}
141155

142156
brl::GfxTexture2dArray::GfxTexture2dArray(Color32* pixels, int width, int height, int layerCount)

test/include/enemy.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ struct EnemyController : ActorBehaviour
5252

5353
struct EnemySpawner : ActorBehaviour
5454
{
55-
EnemySpawner();
55+
EnemySpawner(EnemyTeam team);
5656
void start() override;
5757
void update() override;
5858

test/include/player.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,26 +7,31 @@
77
#include "borealis/gfx/sprite.hpp"
88
#include "borealis/util/input.hpp"
99

10+
enum EnemyTeam : int;
11+
1012
struct PlayerEntity : ActorBehaviour
1113
{
1214
PlayerEntity();
1315

1416
void handleAttack(glm::vec3 dir, float power) override;
1517

1618
bool isGuarding = false;
19+
EnemyTeam Team;
20+
1721

1822
static std::vector<PlayerEntity*> cachedEntities;
1923
};
2024

2125
struct PlayerController : PlayerEntity
2226
{
2327

24-
PlayerController();
28+
PlayerController(EnemyTeam team);
2529
void update() override;
2630
void handleAttack(glm::vec3 dir, float power) override;
2731

2832
brl::GfxImage* healthBarImage;
2933

34+
3035
private:
3136
brl::GfxMaterial* material = nullptr;
3237
brl::GfxMeshRenderer* renderer;

test/src/enemy.cpp

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ void EnemyController::update()
123123

124124
float distance = glm::distance(pos, position());
125125

126-
if (distance < 7.5f)
126+
if (distance < 7.5f && cachedEntity->Team != Team)
127127
{
128128
playerEntity = cachedEntity;
129129
entityPosition = pos;
@@ -281,7 +281,7 @@ brl::UtilCoroutine EnemyController::DeathCoroutine()
281281

282282
}
283283

284-
EnemySpawner::EnemySpawner()
284+
EnemySpawner::EnemySpawner(EnemyTeam t)
285285
{
286286
auto tower = brl::GfxModel::loadModel("models/tower/tower.glb");
287287

@@ -291,33 +291,44 @@ EnemySpawner::EnemySpawner()
291291
shaderBins[1] = new brl::GfxShader(GL_FRAGMENT_SHADER, brl::readFileString("shaders/map_object/frg.glsl"));
292292
auto shader = new brl::GfxShaderProgram(shaderBins, 2, true);
293293

294-
team = (EnemyTeam)brl::random(0, 3);
294+
team = t;
295+
296+
auto color = glm::vec3{0};
297+
switch (team)
298+
{
299+
300+
case Red:
301+
color = glm::vec3(212, 28, 64);
302+
break;
303+
case Blue:
304+
color = glm::vec3(66, 93, 245);
305+
break;
306+
case Yellow:
307+
color = glm::vec3(245, 188, 66);
308+
break;
309+
case Black:
310+
color = glm::vec3(28, 36, 48);
311+
break;
312+
}
295313

296314
for (auto material : tower->materials)
297315
{
298316
material->reloadShader(shader);
299-
auto color = glm::vec3{0};
300-
switch (team)
301-
{
302-
303-
case Red:
304-
color = glm::vec3(212, 28, 64);
305-
break;
306-
case Blue:
307-
color = glm::vec3(66, 93, 245);
308-
break;
309-
case Yellow:
310-
color = glm::vec3(245, 188, 66);
311-
break;
312-
case Black:
313-
color = glm::vec3(28, 36, 48);
314-
break;
315-
}
316317
material->setVec3("_color", color);
317318
}
318319

319320
const auto& towerEntity = tower->createEntity();
320321

322+
auto renderer = towerEntity->getEntityInChildren<brl::GfxMeshRenderer>();
323+
for (int i = 0; i < renderer->materials.size(); ++i)
324+
{
325+
auto material = new brl::GfxMaterial(*renderer->materials[i]);
326+
material->reloadShader(shader);
327+
material->setVec3("_color", color);
328+
329+
renderer->materials[i] = material;
330+
}
331+
321332
towerEntity->setEulerAngles({0, 180, 0});
322333
towerEntity->localScale = glm::vec3(1.0f);
323334

test/src/main.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,10 @@ int main(int argc, const char* argv[])
6363

6464
map->loadMap();
6565

66-
auto player = new PlayerController();
66+
auto player = new PlayerController(Red);
6767
player->healthBarImage = healthBar;
6868

69-
auto enemy = new EnemySpawner();
69+
auto enemy = new EnemySpawner(Red);
7070
enemy->localPosition = {0, 0, -20};
7171

7272

test/src/map.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#include "FastNoiseLite.h"
33
#include "enemy.h"
44
#include "borealis/util/random.hpp"
5+
#include "glm/gtx/integer.hpp"
56

67
MapObject::MapObject(brl::GfxMeshRenderer* renderer)
78
{
@@ -353,15 +354,15 @@ void MapController::loadMap()
353354

354355
// place spawners
355356

356-
int spawnersMax = 5;
357+
int spawnersMax = 6;
357358
int spawnerCount = 0;
358359
for (int x = 0; x < chunkCountX*MAP_CHUNK_SIZE; ++x)
359360
{
360361
for (int y = 0; y < chunkCountY * MAP_CHUNK_SIZE; ++y)
361362
{
362363
if (brl::random(0, 1000) >= 999)
363364
{
364-
auto enemySpawner = new EnemySpawner();
365+
auto enemySpawner = new EnemySpawner((EnemyTeam)glm::mod(spawnerCount,4));
365366

366367
auto blockX = (x * MAP_BLOCK_SPACING) - ((chunkCountX*MAP_CHUNK_SIZE) / 2);
367368
;

test/src/player.cpp

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,32 +14,55 @@ void PlayerEntity::handleAttack(glm::vec3 dir, float power)
1414
{
1515
}
1616

17-
PlayerController::PlayerController()
17+
PlayerController::PlayerController(EnemyTeam team)
1818
{
19+
Team = team;
20+
std::string unitFolder = "textures/Units/NonColor Units/";
1921

20-
auto texture = brl::GfxTexture2d::loadTexture("textures/Units/Yellow Units/Warrior/Warrior_Idle.png");
21-
auto walkTexture = brl::GfxTexture2d::loadTexture("textures/Units/Yellow Units/Warrior/Warrior_Run.png");
22-
auto attackTexture = brl::GfxTexture2d::loadTexture("textures/Units/Yellow Units/Warrior/Warrior_Attack1.png");
23-
auto guardTexture = brl::GfxTexture2d::loadTexture("textures/Units/Yellow Units/Warrior/Warrior_Guard.png");
22+
auto texture = brl::GfxTexture2d::loadTexture(unitFolder + "Warrior/Warrior_Idle.png");
23+
auto walkTexture = brl::GfxTexture2d::loadTexture(unitFolder + "Warrior/Warrior_Run.png");
24+
auto attackTexture = brl::GfxTexture2d::loadTexture(unitFolder + "Warrior/Warrior_Attack1.png");
25+
auto guardTexture = brl::GfxTexture2d::loadTexture(unitFolder + "Warrior/Warrior_Guard.png");
2426
idleSprites = brl::GfxSprite::extractSpritesToArray(texture, 192, 192, true);
2527
walkSprites = brl::GfxSprite::extractSpritesToArray(walkTexture, 192, 192, true);
2628
attackSprites = brl::GfxSprite::extractSpritesToArray(attackTexture, 192, 192, true);
2729
guardSprites = brl::GfxSprite::extractSpritesToArray(guardTexture, 192, 192, true);
2830

31+
2932
auto shaderBins = new brl::GfxShader*[2];
3033

31-
shaderBins[0] = new brl::GfxShader(GL_VERTEX_SHADER, brl::readFileString("shaders/test/vtx.glsl"));
32-
shaderBins[1] = new brl::GfxShader(GL_FRAGMENT_SHADER, brl::readFileString("shaders/test/frg.glsl"));
34+
shaderBins[0] = new brl::GfxShader(GL_VERTEX_SHADER, brl::readFileString("shaders/enemy/enemy.vert"));
35+
shaderBins[1] = new brl::GfxShader(GL_FRAGMENT_SHADER, brl::readFileString("shaders/enemy/enemy.frag"));
3336
auto shader = new brl::GfxShaderProgram(shaderBins, 2, true);
3437

35-
3638
material = new brl::GfxMaterial(shader);
3739
// material->setVec3("color", brl::vector3{1,0,0});
3840
material->setTexture("idleSprite", idleSprites);
3941
material->setTexture("walkSprite", walkSprites);
4042
material->setTexture("attackSprite", attackSprites);
4143
material->setTexture("guardSprite", guardSprites);
4244

45+
glm::vec3 v;
46+
switch (Team)
47+
{
48+
49+
case Red:
50+
v = glm::vec3(212, 28, 64);
51+
break;
52+
case Blue:
53+
v = glm::vec3(66, 93, 245);
54+
break;
55+
case Yellow:
56+
v = glm::vec3(245, 188, 66);
57+
break;
58+
case Black:
59+
v = glm::vec3(28, 36, 48);
60+
break;
61+
}
62+
material->setVec3("_color", v);
63+
material->setVec3("_armorColor", glm::vec3(239, 225, 171));
64+
material->setVec3("_weaponColor", glm::vec3(212, 237, 194));
65+
4366
renderer = new brl::GfxMeshRenderer();
4467
renderer->mesh = brl::GfxMesh::GetPrimitive(brl::QUAD);
4568
renderer->setMaterial(material);

0 commit comments

Comments
 (0)