diff options
author | Yann Herklotz <ymherklotz@gmail.com> | 2018-01-06 11:30:24 +0000 |
---|---|---|
committer | Yann Herklotz <ymherklotz@gmail.com> | 2018-01-06 11:30:24 +0000 |
commit | c7090180503f263c60ec34844992e0e8d4bea85a (patch) | |
tree | 6ecc5b2e16856db49de056738b36e1ba103d3049 /examples/shooter | |
parent | cf4c73f2a75b470a4d4c4167105f92bc46f1926c (diff) | |
parent | 07012cf0982d3f86aebe83b5bdc4a67332c635da (diff) | |
download | YAGE-c7090180503f263c60ec34844992e0e8d4bea85a.tar.gz YAGE-c7090180503f263c60ec34844992e0e8d4bea85a.zip |
Merge branch 'develop'
Diffstat (limited to 'examples/shooter')
-rw-r--r-- | examples/shooter/bullet.cpp | 33 | ||||
-rw-r--r-- | examples/shooter/bullet.h | 24 | ||||
-rw-r--r-- | examples/shooter/direction.h | 11 | ||||
-rw-r--r-- | examples/shooter/main.cpp | 169 | ||||
-rw-r--r-- | examples/shooter/player.cpp | 72 | ||||
-rw-r--r-- | examples/shooter/player.h | 36 |
6 files changed, 345 insertions, 0 deletions
diff --git a/examples/shooter/bullet.cpp b/examples/shooter/bullet.cpp new file mode 100644 index 00000000..c589b4db --- /dev/null +++ b/examples/shooter/bullet.cpp @@ -0,0 +1,33 @@ +#include "bullet.h" + +Bullet::Bullet(const glm::vec4 &bound, Direction dir, float speed, float depth) + : bound_(bound), dir_(dir), speed_(speed), depth_(depth) +{ +} + +void Bullet::draw(yage::SpriteBatch &sp) +{ + switch(dir_) { + case Direction::UP: + bound_.y += speed_; + break; + case Direction::DOWN: + bound_.y -= speed_; + break; + case Direction::LEFT: + bound_.x -= speed_; + break; + case Direction::RIGHT: + bound_.x += speed_; + break; + } + sp.draw( + bound_, {0, 0, 1, 1}, + yage::ResourceManager::getTexture("examples/resources/bullet.png").id, + yage::Colour(255, 255, 255, 255), depth_); +} + +glm::vec4 Bullet::position() const +{ + return bound_; +} diff --git a/examples/shooter/bullet.h b/examples/shooter/bullet.h new file mode 100644 index 00000000..19430fda --- /dev/null +++ b/examples/shooter/bullet.h @@ -0,0 +1,24 @@ +#ifndef EXAMPLES_SHOOTER_BULLET_H +#define EXAMPLES_SHOOTER_BULLET_H + +#include <yage/yage.h> + +#include "direction.h" + +class Bullet : public yage::Drawable +{ +public: + Bullet(const glm::vec4 &bound, Direction dir, float speed, float depth = 0.f); + + void draw(yage::SpriteBatch &sp); + + // getters + glm::vec4 position() const; +private: + glm::vec4 bound_; + Direction dir_; + float speed_; + float depth_; +}; + +#endif diff --git a/examples/shooter/direction.h b/examples/shooter/direction.h new file mode 100644 index 00000000..010c6b54 --- /dev/null +++ b/examples/shooter/direction.h @@ -0,0 +1,11 @@ +#ifndef EXAMPLES_SHOOTER_DIRECTION_H +#define EXAMPLES_SHOOTER_DIRECTION_H + +enum class Direction { + LEFT, + DOWN, + RIGHT, + UP, +}; + +#endif diff --git a/examples/shooter/main.cpp b/examples/shooter/main.cpp new file mode 100644 index 00000000..e38bf53b --- /dev/null +++ b/examples/shooter/main.cpp @@ -0,0 +1,169 @@ +#include <yage/yage.h> + +#include "bullet.h" +#include "direction.h" +#include "player.h" + +#include <memory> +#include <vector> + +using std::cout; + +int main(int argc, char **argv) +{ + yage::Window window; + window.create("Shooter example", 800, 600); + + std::vector<std::unique_ptr<Bullet>> bullets; + + yage::Shader shader("examples/resources/textureshader.vert", + "examples/resources/textureshader.frag"); + + std::vector<yage::Texture> male_l = { + yage::ResourceManager::getTexture("examples/resources/fighter_ml.png", + 3, 4), + yage::ResourceManager::getTexture("examples/resources/ranger_ml.png", 3, + 4), + yage::ResourceManager::getTexture("examples/resources/mage_ml.png", 3, + 4), + yage::ResourceManager::getTexture("examples/resources/healer_ml.png", 3, + 4)}; + std::vector<yage::Texture> female_l = { + yage::ResourceManager::getTexture("examples/resources/fighter_fl.png", + 3, 4), + yage::ResourceManager::getTexture("examples/resources/ranger_fl.png", 3, + 4), + yage::ResourceManager::getTexture("examples/resources/mage_fl.png", 3, + 4), + yage::ResourceManager::getTexture("examples/resources/healer_fl.png", 3, + 4)}; + std::vector<yage::Texture> male_d = { + yage::ResourceManager::getTexture("examples/resources/fighter_md.png", + 3, 4), + yage::ResourceManager::getTexture("examples/resources/ranger_md.png", 3, + 4), + yage::ResourceManager::getTexture("examples/resources/mage_md.png", 3, + 4), + yage::ResourceManager::getTexture("examples/resources/healer_md.png", 3, + 4)}; + std::vector<yage::Texture> female_d = { + yage::ResourceManager::getTexture("examples/resources/fighter_fd.png", + 3, 4), + yage::ResourceManager::getTexture("examples/resources/ranger_fd.png", 3, + 4), + yage::ResourceManager::getTexture("examples/resources/mage_fd.png", 3, + 4), + yage::ResourceManager::getTexture("examples/resources/healer_fd.png", 3, + 4)}; + + yage::SpriteBatch sp; + yage::Camera camera(800, 600); + + int i = 0; + int j = 0; + bool space_pressed = false; + bool c_pressed = false; + + shader.use(); + shader.setUniform("texture_sampler", 0); + + auto textures = male_l; + + Player player({400, 300, 48 * 2, 64 * 2}, textures.front()); + + while (!window.shouldClose()) { + window.pollEvents(); + + if (window.keyPressed(yage::key::D)) { + player.move(Direction::RIGHT); + } + if (window.keyPressed(yage::key::S)) { + player.move(Direction::DOWN); + } + if (window.keyPressed(yage::key::A)) { + player.move(Direction::LEFT); + } + if (window.keyPressed(yage::key::W)) { + player.move(Direction::UP); + } + if (!window.keyPressed(yage::key::D) && + !window.keyPressed(yage::key::S) && + !window.keyPressed(yage::key::A) && + !window.keyPressed(yage::key::W)) { + player.idle(); + } + if (window.keyPressed(yage::key::SPACE) && !space_pressed) { + space_pressed = true; + i = (i + 1) % textures.size(); + } + if (!window.keyPressed(yage::key::SPACE)) { + space_pressed = false; + } + if (window.keyPressed(yage::key::C) && !c_pressed) { + c_pressed = true; + j = (j + 1) % 4; + switch (j) { + case 0: + textures = male_l; + break; + case 1: + textures = male_d; + break; + case 2: + textures = female_l; + break; + case 3: + textures = female_d; + break; + } + } + if (!window.keyPressed(yage::key::C)) { + c_pressed = false; + } + + if (window.keyPressed(yage::key::RIGHT)) { + bullets.push_back(std::make_unique<Bullet>( + glm::vec4(player.position().x + player.position().z / 2.f, + player.position().y + player.position().w / 2.f, 25, + 25), + Direction::RIGHT, 10.f)); + player.look(Direction::RIGHT); + } else if (window.keyPressed(yage::key::DOWN)) { + bullets.push_back(std::make_unique<Bullet>( + glm::vec4(player.position().x + player.position().z / 2.f, + player.position().y + player.position().w / 2.f, 25, + 25), + Direction::DOWN, 10.f, 2)); + player.look(Direction::DOWN); + } else if (window.keyPressed(yage::key::LEFT)) { + bullets.push_back(std::make_unique<Bullet>( + glm::vec4(player.position().x + player.position().z / 2.f, + player.position().y + player.position().w / 2.f, 25, + 25), + Direction::LEFT, 10.f, 2)); + player.look(Direction::LEFT); + } else if (window.keyPressed(yage::key::UP)) { + bullets.push_back(std::make_unique<Bullet>( + glm::vec4(player.position().x + player.position().z / 2.f, + player.position().y + player.position().w / 2.f, 25, + 25), + Direction::UP, 10.f)); + player.look(Direction::UP); + } + + player.setTexture(textures[i]); + + camera.update(shader); + + window.clearBuffer(); + player.draw(sp); + + for (auto &&bullet : bullets) { + bullet->draw(sp); + } + + sp.render(); + + window.swapBuffer(); + } +} diff --git a/examples/shooter/player.cpp b/examples/shooter/player.cpp new file mode 100644 index 00000000..dab743a9 --- /dev/null +++ b/examples/shooter/player.cpp @@ -0,0 +1,72 @@ +#include "player.h" + +Player::Player(const glm::vec4 &bound, const yage::Texture &texture) + : bound_(bound), texture_(texture), direction_(Direction::DOWN), + action_(Action::IDLE), speed_(4) +{ +} + +void Player::setTexture(const yage::Texture &texture) { + texture_ = texture; +} + +void Player::draw(yage::SpriteBatch &sp) +{ + static int time = 0; + static int iteration = 0; + float width = 1.f / static_cast<float>(texture_.x); + float height = 1.f / static_cast<float>(texture_.y); + + switch (action_) { + case Action::IDLE: + sp.draw(bound_, + {width, static_cast<int>(direction_) * height, width, height}, + texture_.id, yage::Colour(255, 255, 255, 255), 1); + break; + case Action::MOVING: + if(time % 15 == 0) { + iteration = (iteration + 1) % 2; + } + sp.draw(bound_, + {iteration * 2 * width, static_cast<int>(direction_) * height, width, height}, + texture_.id, yage::Colour(255, 255, 255, 255), 1); + time = (time + 1) % 59; + break; + } +} + +void Player::move(Direction direction) +{ + direction_ = direction; + action_ = Action::MOVING; + + switch (direction_) { + case Direction::LEFT: + bound_.x -= speed_; + break; + case Direction::DOWN: + bound_.y -= speed_; + break; + case Direction::RIGHT: + bound_.x += speed_; + break; + case Direction::UP: + bound_.y += speed_; + break; + } +} + +void Player::idle() +{ + action_ = Action::IDLE; +} + +void Player::look(Direction direction) +{ + direction_ = direction; +} + +glm::vec4 Player::position() const +{ + return bound_; +} diff --git a/examples/shooter/player.h b/examples/shooter/player.h new file mode 100644 index 00000000..8b5121c5 --- /dev/null +++ b/examples/shooter/player.h @@ -0,0 +1,36 @@ +#ifndef EXAMPLE_SHOOTER_PLAYER_H +#define EXAMPLE_SHOOTER_PLAYER_H + +#include <yage/yage.h> + +#include "direction.h" + +enum class Action { + IDLE, + MOVING, +}; + +class Player : public yage::Drawable +{ +public: + Player(const glm::vec4 &bound, const yage::Texture &texture); + + void setTexture(const yage::Texture &texture); + + void draw(yage::SpriteBatch &sp); + + void move(Direction direction); + void idle(); + void look(Direction direction); + + // simple getters + glm::vec4 position() const; +private: + glm::vec4 bound_; + yage::Texture texture_; + Direction direction_; + Action action_; + int speed_; +}; + +#endif |