Skip to content

Instantly share code, notes, and snippets.

@krofna
Created May 3, 2013 17:46
Show Gist options
  • Save krofna/5511896 to your computer and use it in GitHub Desktop.
Save krofna/5511896 to your computer and use it in GitHub Desktop.
#include <SFML/Graphics.hpp>
#include <iostream>
#include <cmath>
#define PI 3.14
#define RADTODEG(x) (x * 57.29578)
#define DEGTORAD(x) (x * (PI/180))
class Bolt
{
public:
Bolt(sf::Vector2f caster, sf::Vector2i mouse, float velocity)
{
circle.setFillColor(sf::Color::Yellow);
circle.setOrigin(20, 20);
circle.setPosition(caster);
circle.setRadius(20);
mouse.x -= caster.x;
mouse.y -= caster.y;
float length = sqrt(mouse.x * mouse.x + mouse.y * mouse.y);
numsteps = length / velocity;
offset.x = mouse.x / numsteps;
offset.y = mouse.y / numsteps;
}
bool Update()
{
circle.setPosition(circle.getPosition() + offset);
}
void Draw(sf::RenderWindow& window)
{
window.draw(circle);
}
private:
sf::CircleShape circle;
sf::Vector2f offset;
float numsteps;
};
class Cone
{
public:
Cone() : triangle(sf::Triangles, 3), side(200), halfangle(DEGTORAD(30))
{
triangle[0].color = sf::Color::Red;
triangle[1].color = sf::Color::Blue;
triangle[2].color = sf::Color::Green;
}
void Update(sf::Vector2i& mouse)
{
float angle = std::atan2((float)mouse.y - triangle[1].position.y, (float)mouse.x - triangle[1].position.x);
triangle[0].position.x = triangle[1].position.x + std::cos(angle - halfangle) * side;
triangle[0].position.y = triangle[1].position.y + std::sin(angle - halfangle) * side;
triangle[2].position.x = triangle[1].position.x + std::cos(angle + halfangle) * side;
triangle[2].position.y = triangle[1].position.y + std::sin(angle + halfangle) * side;
}
void SetPosition(sf::Vector2f& player)
{
triangle[1].position = player;
}
void Draw(sf::RenderWindow& window)
{
window.draw(triangle);
}
private:
sf::VertexArray triangle;
float side;
float halfangle;
};
class Player
{
public:
Player() : pos(400.f, 400.f), radius(200)
{
cone.SetPosition(pos);
}
void Draw(sf::RenderWindow& window)
{
cone.Draw(window);
for (int i = 0; i < Bolts.size(); ++i)
Bolts[i].Draw(window);
}
void Update(sf::Vector2i mouse)
{
cone.Update(mouse);
for (int i = 0; i < Bolts.size(); ++i)
Bolts[i].Update();
}
void SetPosition(sf::Vector2i newpos)
{
pos.x = newpos.x;
pos.y = newpos.y;
cone.SetPosition(pos);
}
bool IsInAOE(sf::Vector2i mouse)
{
if (std::sqrt(double((mouse.x - pos.x) * (mouse.x - pos.x) + (mouse.y - pos.y) * (mouse.y - pos.y))) <= radius)
return true;
return false;
}
void Shoot(sf::Vector2i mouse)
{
Bolts.push_back(Bolt(pos, mouse, 0.05));
}
private:
sf::Vector2f pos;
Cone cone;
float radius; // Jacques Houdek
std::vector<Bolt> Bolts;
};
int main()
{
sf::RenderWindow window(sf::VideoMode(800, 800), "My window");
Player player;
while (window.isOpen())
{
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
if (sf::Mouse::isButtonPressed(sf::Mouse::Right))
player.SetPosition(sf::Mouse::getPosition(window));
if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
player.Shoot(sf::Mouse::getPosition(window));
std::cout << " " << (player.IsInAOE(sf::Mouse::getPosition(window)) ? "true" : "false") << std::endl;
}
player.Update(sf::Mouse::getPosition(window));
window.clear(sf::Color::Black);
player.Draw(window);
window.display();
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment