[Updated] Code for use with WASM, [TODO] Make enemy gun follow player, spawn bullets from tip of the barrel

This commit is contained in:
Ninjaws
2024-12-17 23:15:26 +01:00
parent 2400b0500a
commit d740e1a167
25 changed files with 371 additions and 438 deletions
+1 -48
View File
@@ -1,10 +1,8 @@
#include "entities/Map.h"
#include "services/AssetService.h"
#include <string>
#include <fstream>
#include <sstream>
#include <iostream>
#include "services/AssetService.h"
#include "entities/Map.h"
Map::Map()
{
@@ -114,19 +112,6 @@ void Map::loadTileset()
this->tileset = AssetService::getInstance().loadTexture("Textures/tileset.png");
}
// std::unordered_map<ECorner, Vector2> Map::cornersToTilePos(std::unordered_map<ECorner, Vector2> corners)
// {
// // std::cout << "Starting converting" << std::endl;
// std::unordered_map<ECorner, Vector2> cornersTilePos;
// for (const auto &pair : corners)
// {
// // std::cout << "Foreach pair" << std::endl;
// Vector2 original = corners[pair.first];
// cornersTilePos[pair.first] = {floorf(original.x / this->tileSize), floorf(original.y / this->tileSize)};
// }
// return cornersTilePos;
// }
void Map::draw()
{
for (int i = 0; i < map.size(); i++)
@@ -146,35 +131,3 @@ void Map::draw()
}
}
// std::unordered_map<ECorner, bool> Map::checkForCollision(TextureWrapper texture)
// {
// // std::cout << "Converting.." << std::endl;
// std::unordered_map<ECorner, Vector2> cornersTilePos = cornersToTilePos(texture.getCorners());
// // std::cout << "Done with converting" << std::endl;
// std::unordered_map<ECorner, bool> cornerCollisions;
// for (const auto &pair : cornersTilePos)
// {
// // std::cout << "foreach collision check" << std::endl;
// Vector2 pos = cornersTilePos[pair.first];
// // std::cout << pos.x << " " << pos.y << std::endl;
// if(colMap[pos.y][pos.x] == 1) {
// cornerCollisions[pair.first] = true;
// } else {
// cornerCollisions[pair.first] = false;
// }
// }
// // std::cout << "Finished collision checks" << std::endl;
// return cornerCollisions;
// // for (int i = 0; i < tiles.size(); i++)
// // {
// // if (colMap[tiles[i].y][tiles[i].x] == 1)
// // {
// // timesCollision.push_back(i);
// // }
// // }
// }
+3 -3
View File
@@ -3,6 +3,7 @@
#include "services/GameService.h"
#include "services/CollectableService.h"
#include "services/InputService.h"
#include "services/MapService.h"
void Player::applyGravity()
{
@@ -171,7 +172,7 @@ void Player::consumableCollision()
{
healthPack.setPickedUp(true);
AssetService::getInstance().playSound(ESound::HEAL_PICKUP);
health = std::max(health + healthPack.getHealAmount(), (int)max_health);
health = std::min(health + healthPack.getHealAmount(), (int)max_health);
}
}
}
@@ -188,8 +189,6 @@ void Player::consumableCollision()
AssetService::getInstance().playSound(ESound::POWERUP);
jumpPower += powerup.getExtraJumpPower();
gainedPowerup = true;
// health = std::max(health+powerup.getHealAmount(),(int)max_health);
// }
}
}
@@ -200,6 +199,7 @@ void Player::consumableCollision()
this->texture.getPosition().y < flag.getObject().getPosition().y + flag.getObject().getSize().y)
{
flag.setTouched(true);
finishReached = true;
}
}
-57
View File
@@ -1,66 +1,9 @@
#include "raylib.h"
// #include "screens/Screen.h"
// #include "screens/TitleScreen.h"
#include "services/StateService.h"
// #include <iostream>
// #if defined(PLATFORM_WEB)
// #include <emscripten/emscripten.h>
// #endif
// void step();
// static void gameloop();
int main()
{
StateService& stateService = StateService::getInstance();
stateService.setScreenSize({640,544});
stateService.startGame();
// std::cout << "StateService instance: " << service << std::endl;
// InitWindow(640, 544, "Jelly Rescue");
// // SetTargetFPS(60);
// // setScreen(EScreen::TITLE);
// #if defined(PLATFORM_WEB)
// emscripten_set_main_loop(step, 0, 1);
// #else
// while (!WindowShouldClose())
// {
// step();
// }
// #endif
// CloseWindow();
return 0;
}
// static void gameloop()
// {
// // InitAudioDevice();
// InitWindow(640, 544, "Jelly Rescue");
// // SetTargetFPS(60);
// // setScreen(EScreen::TITLE);
// #if defined(PLATFORM_WEB)
// emscripten_set_main_loop(step, 0, 1);
// #else
// while (!WindowShouldClose())
// {
// step();
// }
// #endif
// CloseWindow();
// // CloseAudioDevice();
// }
// void step()
// {
// ClearBackground(BLACK);
// }
+2 -2
View File
@@ -1,7 +1,7 @@
#include "screens/MainScreen.h"
#include "raylib.h"
#include "services/AudioService.h"
#include "services/StateService.h"
#include "raylib.h"
#include "services/InputService.h"
MainScreen::MainScreen()
@@ -60,7 +60,7 @@ void MainScreen::mouseLogic()
Vector2 pos = buttons[i].getPosition();
Rectangle rect = {pos.x, pos.y, dim.x, dim.y};
Vector2 mousePos = GetMousePosition();
Vector2 mousePos = InputService::getInstance().getMousePos();
// mousePos.x >= rect.x && mousePos.x <= (rect.x+rect.width) &&
if ((mousePos.x + textPadding) >= rect.x && mousePos.x <= (rect.x + rect.width + textPadding) && (mousePos.y + textPadding) >= rect.y && mousePos.y <= (rect.y + rect.height + textPadding))
{
-2
View File
@@ -3,7 +3,6 @@
#include "services/StateService.h"
#include "enums/EFont.h"
#include "services/AudioService.h"
#include <iostream>
#include "services/InputService.h"
TitleScreen::TitleScreen()
@@ -34,7 +33,6 @@ TitleScreen::TitleScreen()
void TitleScreen::logic()
{
// std::cout << "Next screen!" << std::endl;
if (InputService::getInstance().isKeyPressed(KEY_ENTER) || InputService::getInstance().isMouseButtonPressed(MOUSE_BUTTON_LEFT))
{
StateService::getInstance().setScreen(EScreen::MAIN);
+2 -3
View File
@@ -1,8 +1,7 @@
#include "screens/TutorialScreen.h"
#include "services/StateService.h"
#include "enums/EFont.h"
#include "enums/EScreen.h"
#include "enums/EFont.h"
#include "services/StateService.h"
#include "services/InputService.h"
TutorialScreen::TutorialScreen() {
-1
View File
@@ -1,5 +1,4 @@
#include "services/AssetService.h"
#include <iostream>
AssetService::AssetService()
{
setAssetDir("assets/");
+196
View File
@@ -0,0 +1,196 @@
#include "services/CollectableService.h"
#include "services/MapService.h"
void CollectableService::initCrates()
{
crates.clear();
int tileSize = MapService::getInstance().getMap().getTileSize();
for (int i = 0; i < amountOfCrates; i++)
{
crates.push_back(Crate());
}
crates[0].getObject().setPosition({38.0f * tileSize, 9.0f * tileSize});
crates[1].getObject().setPosition({41.0f * tileSize, 5.0f * tileSize});
crates[2].getObject().setPosition({68.0f * tileSize, 4.0f * tileSize});
for (int i = 0; i < crates.size(); i++)
{
Vector2i crateTilePos = Vector2i(crates[i].getObject().getPosition().x / tileSize, crates[i].getObject().getPosition().y / tileSize);
MapService::getInstance().getMap().updateColmapTile(crateTilePos, true);
}
}
void CollectableService::initJellies()
{
jellies.clear();
}
void CollectableService::initAmmoPacks()
{
ammoPacks.clear();
int tileSize = MapService::getInstance().getMap().getTileSize();
for (int i = 0; i < amountOfAmmoPacks; i++)
{
ammoPacks.push_back(AmmoPack());
}
ammoPacks[0].getObject().setPosition({32.0f * tileSize, 9.0f * tileSize});
ammoPacks[1].getObject().setPosition({48.0f * tileSize, 5.0f * tileSize});
ammoPacks[2].getObject().setPosition({88.0f * tileSize, 9.0f * tileSize});
ammoPacks[3].getObject().setPosition({105.0f * tileSize, 15.0f * tileSize});
}
void CollectableService::initHealthPacks()
{
healthPacks.clear();
int tileSize = MapService::getInstance().getMap().getTileSize();
for (int i = 0; i < amountOfHealthPacks; i++)
{
healthPacks.push_back(HealthPack());
}
healthPacks[0].getObject().setPosition({28.0f * tileSize, 10.0f * tileSize});
healthPacks[1].getObject().setPosition({64.0f * tileSize, 6.0f * tileSize});
healthPacks[2].getObject().setPosition({118.0f * tileSize, 11.0f * tileSize});
healthPacks[3].getObject().setPosition({74.0f * tileSize, 8.0f * tileSize});
}
void CollectableService::initPowerups()
{
powerUps.clear();
int tileSize = MapService::getInstance().getMap().getTileSize();
for (int i = 0; i < amountOfPowerups; i++)
{
powerUps.push_back(Powerup());
}
powerUps[0].getObject().setPosition({41.0f * tileSize + 8, 10.0f * tileSize - 25});
}
void CollectableService::initFlag()
{
int tileSize = MapService::getInstance().getMap().getTileSize();
this->flag = Flag({118.0f * tileSize - tileSize / 2.0f, 3.0f * tileSize - 8});
}
void CollectableService::crateLogic()
{
for (auto it = crates.begin(); it != crates.end();)
{
auto &crate = *it;
/**
* If the crate has been hit:
* 1. Create a Jelly on the location of the crate
* 2. Remove the collision tile from the collision map
* 3. Remove the crate
*/
if (crate.hasBeenHit())
{
Vector2 pos = crate.getObject().getPosition();
jellies.push_back(Jelly(pos));
Vector2i tilePos = Vector2i(pos.x / MapService::getInstance().getMap().getTileSize(), pos.y / MapService::getInstance().getMap().getTileSize());
MapService::getInstance().getMap().updateColmapTile(tilePos, false);
it = crates.erase(it);
}
else
{
++it;
}
}
}
void CollectableService::jellyLogic()
{
for (int i = 0; i < jellies.size(); i++)
{
jellies[i].logic();
}
}
void CollectableService::ammoPackLogic()
{
for (auto it = ammoPacks.begin(); it != ammoPacks.end();)
{
auto &ammoPack = *it;
if (ammoPack.hasBeenPickedUp())
{
it = ammoPacks.erase(it);
}
else
{
++it;
}
}
}
void CollectableService::healthPackLogic()
{
for (auto it = healthPacks.begin(); it != healthPacks.end();)
{
auto &healthPack = *it;
if (healthPack.hasBeenPickedUp())
{
it = healthPacks.erase(it);
}
else
{
++it;
}
}
}
void CollectableService::powerupLogic()
{
for (auto it = powerUps.begin(); it != powerUps.end();)
{
auto &powerUp = *it;
if (powerUp.hasBeenPickedUp())
{
it = powerUps.erase(it);
}
else
{
powerUp.logic();
++it;
}
}
}
void CollectableService::drawCrates()
{
for (int i = 0; i < crates.size(); i++)
{
crates[i].draw();
}
}
void CollectableService::drawJellies()
{
for (int i = 0; i < jellies.size(); i++)
{
jellies[i].draw();
}
}
void CollectableService::drawAmmoPacks()
{
for (int i = 0; i < ammoPacks.size(); i++)
{
ammoPacks[i].draw();
}
}
void CollectableService::drawHealthpacks()
{
for (int i = 0; i < healthPacks.size(); i++)
{
healthPacks[i].draw();
}
}
void CollectableService::drawPowerups()
{
for (int i = 0; i < powerUps.size(); i++)
{
powerUps[i].draw();
}
}
+51
View File
@@ -0,0 +1,51 @@
#include "services/EnemyService.h"
#include "services/MapService.h"
void EnemyService::initEnemies()
{
this->enemies.clear();
const int AMNT_OF_ENEMIES = 8;
int tileSize = MapService::getInstance().getMap().getTileSize();
for (int i = 0; i < AMNT_OF_ENEMIES; i++)
{
enemies.push_back(Enemy());
}
this->enemies[0].getObject().setPosition({31.0f * tileSize, 15.0f * tileSize});
this->enemies[1].getObject().setPosition({51.0f * tileSize, 10.0f * tileSize});
this->enemies[2].getObject().setPosition({56.0f * tileSize, 5.0f * tileSize});
this->enemies[3].getObject().setPosition({78.0f * tileSize, 10.0f * tileSize});
this->enemies[4].getObject().setPosition({82.0f * tileSize, 15.0f * tileSize});
this->enemies[5].getObject().setPosition({88.0f * tileSize, 4.0f * tileSize});
this->enemies[6].getObject().setPosition({98.0f * tileSize, 11.0f * tileSize});
this->enemies[7].getObject().setPosition({103.0f * tileSize, 15.0f * tileSize});
}
void EnemyService::enemyLogic()
{
for (auto it = enemies.begin(); it != enemies.end();)
{
auto &enemy = *it;
if (enemy.getObject().getPosition().y < 0)
{
it = enemies.erase(it);
}
else
{
enemy.logic();
++it;
}
}
}
void EnemyService::drawEnemies()
{
for (int i = 0; i < enemies.size(); i++)
{
enemies[i].draw();
}
}
std::vector<Enemy> &EnemyService::getEnemies()
{
return this->enemies;
}
+3 -11
View File
@@ -49,17 +49,9 @@ void StateService::startGame()
// InitWindow(640,544, "Jelly Rescue");
InitWindow(screenSize.x, screenSize.y, "Jelly Rescue");
SetTargetFPS(45);
#if not defined(PLATFORM_WEB)
HideCursor();
// #if defined(PLATFORM_WEB)
// emscripten_set_keypress_callback(EMSCRIPTEN_EVENT_TARGET_CANVAS, nullptr, 1, staticStep);
// #endif
// #if defined(PLATFORM_WEB)
// emscripten_set_focusin_callback(EMSCRIPTEN_EVENT_TARGET_CANVAS, nullptr, 1, [](const EmscriptenFocusEvent* event) {
// std::cout << "Canvas Focused!" << std::endl;
// });
// #endif
#endif
setScreen(EScreen::TITLE);
@@ -67,7 +59,6 @@ void StateService::startGame()
emscripten_set_main_loop(StateService::staticStep, 0, 1);
#else
// while (!WindowShouldClose() && instance->gameRunning)
while (!WindowShouldClose() && gameRunning)
{
step();
@@ -90,6 +81,7 @@ void StateService::handleMusic()
void StateService::step()
{
InputService::getInstance().checkKeys();
InputService::getInstance().checkMousePos();
handleMusic();
currentScreen->draw();