main.cpp
#include "Globals.hpp"
#include "Player.hpp"
float updateClock(sf::Clock*);
int main(int argc, char* argv[]) {
sf::RenderWindow window(sf::VideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, BPP),
"Shooter");
sf::Clock clock;
Player player(sf::Vector2f(400.f, 300.f), sf::Vector2f(25.f, 25.f),
&window);
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed)
window.close();
}
float timeStep = updateClock(&clock);
player.update(timeStep);
window.clear();
player.render();
window.display();
}
cin.get();
return 0;
}
float updateClock(sf::Clock* clock) {
sf::Time time = clock->restart();
long delta = time.asMilliseconds();
float timeStep = delta / 1000.f;
return timeStep;
}
Player.hpp
#ifndef PLAYER_HPP
#define PLAYER_HPP
#include "Globals.hpp"
#include "Bullet.hpp"
class Player {
public:
Player(sf::Vector2f, sf::Vector2f, sf::RenderWindow*);
~Player();
sf::RenderWindow* getWindow();
sf::Vector2f getPosition();
sf::Vector2f getSize();
float getAngle();
void render();
void update(float);
private:
float m_speed;
float m_angle;
Bullet* m_bullet;
sf::RenderWindow* m_window;
sf::Vector2f m_position;
sf::Vector2f m_size;
sf::Vector2f m_velocity;
sf::RectangleShape m_rect;
};
#endif
Player.cpp
#include "Player.hpp"
Player::Player(sf::Vector2f position, sf::Vector2f size,
sf::RenderWindow* window) {
m_speed = 150.f;
m_angle = 0.f;
m_position = position;
m_size = size;
m_velocity = sf::Vector2f(0.f, 0.f);
m_window = window;
m_rect = sf::RectangleShape();
m_rect.setPosition(m_position);
m_rect.setSize(m_size);
m_rect.setFillColor(sf::Color::Blue);
m_rect.setOrigin(m_size.x / 2, m_size.y / 2);
m_rect.setRotation(m_angle);
m_bullet = NULL;
}
Player::~Player() {
cout << "Player Destructor starting..." << endl;
if (m_window)
m_window = NULL;
if (m_bullet) {
delete m_bullet;
m_bullet = NULL;
}
cout << "Player destructor ending." << endl;
}
sf::RenderWindow* Player::getWindow() {
return m_window;
}
sf::Vector2f Player::getPosition() {
return m_position;
}
sf::Vector2f Player::getSize() {
return m_size;
}
float Player::getAngle() {
return m_angle;
}
void Player::render() {
if (m_window) {
m_window->draw(m_rect);
if (m_bullet) {
cout << "bullet render" << endl;
sf::Sprite sprite;
sprite.setTexture(m_bullet->getTexture());
sprite.setPosition(m_bullet->getPosition());
sprite.setRotation(m_angle);
m_window->draw(sprite);
cout << "bullet render done" << endl;
}
}
}
void Player::update(float timeStep) {
if (m_window) {
sf::Vector2f velocity = sf::Vector2f(0.f, 0.f);
if (sf::Keyboard::isKeyPressed(sf::Keyboard::W))
velocity.y = -m_speed;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::S))
velocity.y = m_speed;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::D/>))
velocity.x = m_speed;
if (sf::Keyboard::isKeyPressed(sf::Keyboard::A))
velocity.x = -m_speed;
if (sf::Mouse::isButtonPressed(sf::Mouse::Left)) {
if (m_bullet == NULL) {
m_bullet = new Bullet(m_position, m_angle, 100);
}
}
m_position.x += velocity.x * timeStep;
m_position.y += velocity.y * timeStep;
m_rect.setPosition(m_position);
sf::Vector2i mouse = sf::Mouse::getPosition(*m_window);
sf::Vector2f mouse_position = m_window->convertCoords(mouse);
sf::Vector2f angle = mouse_position - m_position;
m_angle = atan2(angle.y, angle.x);
m_angle *= 180.f / PI;
//cout << m_angle << endl;
m_rect.setRotation(m_angle);
if (m_bullet) {
if (!m_bullet->update(timeStep)) {
delete m_bullet;
m_bullet = NULL;
}
}
}
}
Bullet.hpp
#ifndef BULLET_HPP
#define BULLET_HPP
#include "Globals.hpp"
class Bullet {
public:
Bullet(sf::Vector2f, float, int);
~Bullet();
bool update(float);
sf::Texture getTexture();
sf::Vector2f getPosition();
private:
float m_angle;
float m_speed;
int m_life;
sf::Texture m_texture;
sf::Vector2f m_position;
};
#endif
Bullet.cpp
#include "Bullet.hpp"
Bullet::Bullet(sf::Vector2f position, float angle, int life) {
m_position = position;
m_angle = angle;
m_speed = 200.f;
m_life = life;
cout << "loading bullet image..." << endl;
m_texture.loadFromFile("bullet.png");
cout << "loaded bullet image..." << endl;
}
Bullet::~Bullet() {
cout << "Bullet Destructor" << endl;
}
bool Bullet::update(float timeStep) {
float angle = m_angle * PI / 180.f;
m_position.x += (m_speed * cos(angle)) * timeStep;
m_position.y += (m_speed * sin(angle)) * timeStep;
if (--m_life <= 0) return false;
return true;
}
sf::Texture Bullet::getTexture() {
return m_texture;
}
sf::Vector2f Bullet::getPosition() {
return m_position;
}
Globals.hpp
#ifndef GLOBALS_HPP #define GLOBALS_HPP #include <SFML/Graphics.hpp> #include <iostream> #include <cmath> #define PI 3.14159265f #define SCREEN_WIDTH 800 #define SCREEN_HEIGHT 600 #define BPP 32 using namespace std; #endif

New Topic/Question
Reply




MultiQuote





|