Welcome, Guest. Please login or register. Did you miss your activation email?

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - MrJBRPG

Pages: [1]
1
Graphics / Help with drawing a movable sprite in game states
« on: January 22, 2015, 07:51:50 pm »
Using: Windows Visual Studio 2013 C++ on Windows 8.1 SFML version 2.1

Right now I am working on a solo project, and I am nearly finished with getting a small ship to show up on screen. I understood some of the coding structures from Project Shmup and City Builder Tutorial. However, I am having a pointer-based problem to get the player sprite to show up on screen.



Here are some code snippets relevant to how I am treating the player sprite.


Game.cpp



#include <stack>


#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>


#include "game.hpp"
#include "state.hpp"
#include "textureManager.hpp"


void Game::loadTextures(){


   texmgr.loadTexture("playerSprite", "media/images/player.png");
   texmgr.loadTexture("background", "media/images/background.png");
}


void Game::pushState(State* state)
{
   this->states.push(state);


   return;
}


void Game::popState()
{
   delete this->states.top();
   this->states.pop();


   return;
}


void Game::changeState(State* state)
{
   if (!this->states.empty())
      popState();
   pushState(state);


   return;
}


State* Game::peekState()
{
   if (this->states.empty()) return nullptr;
   return this->states.top();
}


void Game::gameLoop()
{
   sf::Clock clock;


   while (this->window.isOpen())
   {
      sf::Time elapsed = clock.restart();
      float dt = elapsed.asSeconds();


      if (peekState() == nullptr) continue;
      peekState()->handleInput();
      peekState()->update(dt);
      this->window.clear(sf::Color::Black);
      peekState()->draw(dt);
      this->window.display();
   }
}


Game::Game()
{
   this->loadTextures();


   this->window.create(sf::VideoMode(800, 600), "Solo Project Ver 0.0");
   this->window.setFramerateLimit(60);


   this->background.setTexture(this->texmgr.getRef("background"));
}


Game::~Game()
{
   while (!this->states.empty()) popState();
}




stateGame.cpp


#include <SFML\Graphics.hpp>


#include "state_game.hpp"
#include "game.hpp"
#include "player.hpp"


StateGame::StateGame(Game* game){
   
   this->game = game;
   sf::Vector2f pos = sf::Vector2f(this->game->window.getSize());
   this->hudView.setSize(pos);
   this->gameView.setSize(pos);
   pos *= 0.5f;
   this->hudView.setCenter(pos);
   this->gameView.setCenter(pos);


}


void StateGame::draw(const float dt){


   this->game->window.setView(this->gameView);


   this->game->window.clear(sf::Color::Black);
   this->game->window.draw(this->game->background);
   this-> game->window.draw(this->game->playerSprite);
}


void StateGame::update(const float dt){


}


void StateGame::handleInput(){
   sf::Event event;


   while (this->game->window.pollEvent(event)){


      if (event.type == sf::Event::Closed){
         game->window.close();
      }


      bool dirButtons[4] = {false, false, false, false};
      if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)){
         dirButtons[0] = true;
      }
      if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)){
         dirButtons[1] = true;
      }
      if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)){
         dirButtons[2] = true;
      }
      if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)){
         dirButtons[3] = true;
      }
      gamePlayer->move(dirButtons);
   }
}


player.cpp



#include "player.hpp"
#include "textureManager.hpp"


Player::Player(){
   this->playerSprite.setTexture(this->texmgr.getRef("playerSPrite"));


   this->lives = 3;
   this->speed = 200;
   this->firepower = 1;


}


void Player::move(bool* dirButtons){
   // move ship based on arrow keys pressed


   double vel_x = 0;
   double vel_y = 0;


   vel_x = -speed * double(dirButtons[0]); // left
   vel_x += speed * double(dirButtons[2]); // right


   vel_y = -speed * double(dirButtons[1]); // up
   vel_y += speed * double(dirButtons[3]); // down


   double sqrt2 = 1.41; // square root of 2


   if ((dirButtons[0] || dirButtons[2]) && (dirButtons[1] || dirButtons[3])){
      vel_x /= sqrt2;
      vel_y /= sqrt2;
   }
   this->playerSprite.move(vel_x, vel_y);
}


double Player::getSpeed(){
   return this->speed;
}




Pages: [1]