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;
}
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;
}