From bc92bb8b2c03fd67cb7e38bd220ebeb7957244c4 Mon Sep 17 00:00:00 2001 From: Nadina Date: Wed, 22 Aug 2018 23:17:45 +0200 Subject: [PATCH] Snake basic version --- project01/nadina/application.cc | 114 ++++++++++++++++++++++++++++++++ project01/nadina/application.h | 35 ++++++++++ 2 files changed, 149 insertions(+) create mode 100644 project01/nadina/application.cc create mode 100644 project01/nadina/application.h diff --git a/project01/nadina/application.cc b/project01/nadina/application.cc new file mode 100644 index 0000000..eff5e7a --- /dev/null +++ b/project01/nadina/application.cc @@ -0,0 +1,114 @@ +#include "application.h" +#include +#include +#include + +static const cinder::ivec2 WindowSize{640, 480}; + +Application::Application() +{} + +void Application::prepareSettings(Settings* settings) +{ + settings->setWindowSize(WindowSize); + settings->setFrameRate(35.0f); + settings->setResizable(false); + settings->setFullScreen(false); +} + +void Application::keyDown(ci::app::KeyEvent keyEvent) +{ + if (keyEvent.getCode() == ci::app::KeyEvent::KEY_DOWN) + { + mVerticalDirection = 1; + mHorizontalDirection = 0; + } + else if (keyEvent.getCode() == ci::app::KeyEvent::KEY_UP) + { + mVerticalDirection = -1; + mHorizontalDirection = 0; + } + else if (keyEvent.getCode() == ci::app::KeyEvent::KEY_RIGHT) + { + mVerticalDirection = 0; + mHorizontalDirection = 1; + } + else if (keyEvent.getCode() == ci::app::KeyEvent::KEY_LEFT) + { + mVerticalDirection = 0; + mHorizontalDirection = -1; + } +} + +void Application::setup() +{ + mSnake.push_back(getWindowCenter()); + updateFoodPos(); +} + +void Application::draw() +{ + ci::gl::clear(); + + //Draw food + ci::gl::color(cinder::Color(1, 1, 1)); + ci::gl::drawSolidCircle(mFood, mFoodSize); + + //Draw snake + ci::gl::color(cinder::Color(0, 1, 0)); + for (auto const& item : mSnake) + { + ci::gl::drawSolidCircle(item, mSnakeSize, mSnakeSize); + } + + if (collisionDetected()) + { + updateFoodPos(); + increaseSnake(); + mSpeed += 0.5f; + } +} + +void Application::increaseSnake() +{ + mSnake.push_back(glm::vec2()); +} + +void Application::updateFoodPos() +{ + int x = rand() % 640 + 1; + int y = rand() % 480 + 1; + mFood = glm::vec2(x, y); +} + +void Application::resetBoundaries(glm::vec2& pos) +{ + if (pos.x < getWindowBounds().x1) + pos.x = getWindowBounds().x2; + else if (pos.x > getWindowBounds().x2) + pos.x = getWindowBounds().x1; + else if (pos.y < getWindowBounds().y1) + pos.y = getWindowBounds().y2; + else if (pos.y > getWindowBounds().y2) + pos.y = getWindowBounds().y1; +} + +void Application::update() +{ + for (std::vector::size_type i = mSnake.size() - 1; i >= 1; i --) + { + mSnake[i] = mSnake[i-1]; + } + mSnake[0] += glm::vec2(mHorizontalDirection * mSpeed, mVerticalDirection * mSpeed); + resetBoundaries(mSnake[0]); +} + +bool Application::collisionDetected() +{ + float headSnakeX = mSnake[0].x; + float headSnakeY = mSnake[0].y; + return abs(headSnakeX - mFood.x) < 20.0 && abs(headSnakeY - mFood.y) < 20.0; +} + +CINDER_APP(Application, ci::app::RendererGl(ci::app::RendererGl::Options().msaa(16)), &Application::prepareSettings) + diff --git a/project01/nadina/application.h b/project01/nadina/application.h new file mode 100644 index 0000000..fc24a64 --- /dev/null +++ b/project01/nadina/application.h @@ -0,0 +1,35 @@ +#pragma once + +#include +#include +#include +#include + +class Application : public ci::app::App +{ +public: + Application(); + + void keyDown(ci::app::KeyEvent) override; + void setup() override; + void draw() override; + void update() override; + + static void prepareSettings(Settings*); + + bool collisionDetected(); + void updateFoodPos(); + void increaseSnake(); + void resetBoundaries(glm::vec2& pos); + +private: + std::vector mSnake; + glm::vec2 mFood; + + int mHorizontalDirection = 1; + int mVerticalDirection = 0; + float mSpeed = 5.0f; + int mSnakeSize = 40; + int mFoodSize = 40; + +};