Initial commit
This commit is contained in:
parent
bbee35624e
commit
0a2943c6bf
|
@ -0,0 +1,18 @@
|
||||||
|
CC=g++
|
||||||
|
CFLAGS=-Wall -std=c++11
|
||||||
|
TARGET=ptf
|
||||||
|
|
||||||
|
$(TARGET): main.o ball.o engine.o
|
||||||
|
$(CC) $(CFLAGS) -o build/$(TARGET) build/engine.o build/main.o build/ball.o -lsfml-graphics -lsfml-window -lsfml-system -lpthread
|
||||||
|
|
||||||
|
ball.o: ball.cpp
|
||||||
|
$(CC) $(CFLAGS) -o build/ball.o -c ball.cpp
|
||||||
|
|
||||||
|
engine.o: engine.cpp
|
||||||
|
$(CC) $(CFLAGS) -o build/engine.o -c engine.cpp
|
||||||
|
|
||||||
|
main.o: main.cpp
|
||||||
|
$(CC) $(CFLAGS) -o build/main.o -c main.cpp
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm build/*
|
|
@ -0,0 +1,52 @@
|
||||||
|
#include "ball.hpp"
|
||||||
|
#include "engine.hpp"
|
||||||
|
|
||||||
|
// TODO réécrire cette classe
|
||||||
|
|
||||||
|
Ball::Ball() {
|
||||||
|
if (!texture.loadFromFile("res/balle.png")) {
|
||||||
|
std::cerr << "Failed to load texture" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
velocity.x = velocity.y = 0;
|
||||||
|
position.x = 150; position.y = 150;
|
||||||
|
|
||||||
|
sprite.setOrigin(12, 12);
|
||||||
|
sprite.setTexture(texture);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Ball::update(float delta) {
|
||||||
|
int verticalPos = std::ceil(position.y);
|
||||||
|
|
||||||
|
// gravity
|
||||||
|
velocity.y += Engine::GRAVITY * delta;
|
||||||
|
|
||||||
|
// jump
|
||||||
|
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up) && verticalPos >= 150) {
|
||||||
|
velocity.y = -Engine::JUMP;
|
||||||
|
}
|
||||||
|
|
||||||
|
// go left/right
|
||||||
|
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) {
|
||||||
|
velocity.x -= Engine::MOVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) {
|
||||||
|
velocity.x += Engine::MOVE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (verticalPos > 150) {
|
||||||
|
position.y = 150;
|
||||||
|
velocity.y = -.3f * std::abs(velocity.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
velocity.x *= .95f;
|
||||||
|
position += velocity * delta;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Ball::draw(sf::RenderWindow& window) {
|
||||||
|
sprite.setPosition(position + sf::Vector2f(0, -12));
|
||||||
|
sprite.rotate(velocity.x / 10);
|
||||||
|
|
||||||
|
window.draw(sprite);
|
||||||
|
}
|
|
@ -0,0 +1,38 @@
|
||||||
|
#ifndef PTF_BALL_HPP
|
||||||
|
#define PTF_BALL_HPP
|
||||||
|
|
||||||
|
#include <SFML/Graphics.hpp>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
class Ball {
|
||||||
|
protected:
|
||||||
|
sf::Vector2f position;
|
||||||
|
sf::Vector2f velocity;
|
||||||
|
float mass;
|
||||||
|
int charge;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Ball();
|
||||||
|
|
||||||
|
void update(float delta);
|
||||||
|
void draw(sf::RenderWindow& window);
|
||||||
|
|
||||||
|
// getters et setters
|
||||||
|
sf::Vector2f getPosition() {
|
||||||
|
return position;
|
||||||
|
}
|
||||||
|
|
||||||
|
sf::Vector2f getVelocity() {
|
||||||
|
return velocity;
|
||||||
|
}
|
||||||
|
|
||||||
|
float getMass() {
|
||||||
|
return mass;
|
||||||
|
}
|
||||||
|
|
||||||
|
int getCharge() {
|
||||||
|
return charge;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,117 @@
|
||||||
|
#include "engine.hpp"
|
||||||
|
#include <cmath>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fonction d'initialisation de la classe Engine
|
||||||
|
*/
|
||||||
|
Engine::Engine() {
|
||||||
|
// initialise et ouvre la fenêtre
|
||||||
|
window.create(
|
||||||
|
sf::VideoMode(300, 150), "La cage de Jacob",
|
||||||
|
sf::Style::Default & ~sf::Style::Resize,
|
||||||
|
sf::ContextSettings(0, 0, 2)
|
||||||
|
);
|
||||||
|
|
||||||
|
window.setVerticalSyncEnabled(true);
|
||||||
|
|
||||||
|
// au démarrage, aucune touche n'est enfoncée
|
||||||
|
goLeftKey = false;
|
||||||
|
goRightKey = false;
|
||||||
|
|
||||||
|
// boucle d'événements sur la fenêtre
|
||||||
|
while (window.isOpen()) {
|
||||||
|
sf::Event event;
|
||||||
|
|
||||||
|
// traitement des évènements reçus
|
||||||
|
while (window.pollEvent(event)) {
|
||||||
|
// fermeture de la fenêtre
|
||||||
|
if (event.type == sf::Event::Closed) {
|
||||||
|
window.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// une touche a été enfoncée
|
||||||
|
if (event.type == sf::Event::KeyPressed) {
|
||||||
|
if (event.key.code == sf::Keyboard::Left) {
|
||||||
|
goLeftKey = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.key.code == sf::Keyboard::Right) {
|
||||||
|
goRightKey = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// une touche a été relâchée
|
||||||
|
if (event.type == sf::Event::KeyReleased) {
|
||||||
|
if (event.key.code == sf::Keyboard::Left) {
|
||||||
|
goLeftKey = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (event.key.code == sf::Keyboard::Right) {
|
||||||
|
goRightKey = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// réinitialise l'horloge à zéro
|
||||||
|
// et stocke la différence de temps dans delta
|
||||||
|
float delta = clock.restart().asSeconds();
|
||||||
|
update(delta);
|
||||||
|
draw();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mise à jour de la physique du jeu
|
||||||
|
*/
|
||||||
|
void Engine::update(float delta) {
|
||||||
|
for (int i = 0; i < balls.size(); i++) {
|
||||||
|
sf::Vector2f forces(0, 0);
|
||||||
|
|
||||||
|
// ajout de la force de gravité
|
||||||
|
forces += sf::Vector2f(0, Engine::GRAVITY);
|
||||||
|
|
||||||
|
// déplacement de la balle
|
||||||
|
if (goLeftKey) {
|
||||||
|
forces += sf::Vector2f(-Engine::MOVE, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (goRightKey) {
|
||||||
|
forces += sf::Vector2f(Engine::MOVE, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// force d'attraction
|
||||||
|
for (int j = 0; j < balls.size(); j++) {
|
||||||
|
if (i != j) {
|
||||||
|
sf::Vector2f attraction(balls[i].getPosition() - balls[j].getPosition());
|
||||||
|
float distanceSquared = attraction.x * attraction.x + attraction.y * attraction.y;
|
||||||
|
|
||||||
|
attraction /= std::sqrt(distanceSquared);
|
||||||
|
attraction *= Engine::ATTRACTION * ((balls[i].getCharge() * balls[j].getCharge()) / distanceSquared);
|
||||||
|
|
||||||
|
forces += attraction;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: COLLISIONS
|
||||||
|
|
||||||
|
balls[i].update(forces, delta);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dessine la scène du jeu couche par couche
|
||||||
|
*/
|
||||||
|
void Engine::draw() {
|
||||||
|
// couche de fond
|
||||||
|
window.clear(sf::Color(66, 165, 245));
|
||||||
|
|
||||||
|
// grille de blocs
|
||||||
|
for (int i = 0; i < blocks.size(); i++) {
|
||||||
|
blocks[i].draw();
|
||||||
|
}
|
||||||
|
|
||||||
|
// dessin des balles
|
||||||
|
for (int i = 0; i < balls.size(); i++) {
|
||||||
|
balls[i].draw();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
#ifndef PTF_ENGINE_HPP
|
||||||
|
#define PTF_ENGINE_HPP
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <SFML/Graphics.hpp>
|
||||||
|
#include "ball.hpp"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* La classe principale Engine coordonne les éléments
|
||||||
|
* du jeu et organise le dessin des frames
|
||||||
|
*/
|
||||||
|
class Engine {
|
||||||
|
private:
|
||||||
|
sf::Clock clock;
|
||||||
|
sf::RenderWindow window;
|
||||||
|
|
||||||
|
bool goLeftKey;
|
||||||
|
bool goRightKey;
|
||||||
|
|
||||||
|
public:
|
||||||
|
static constexpr float GRAVITY = 10;
|
||||||
|
static constexpr float ATTRACTION = 10;
|
||||||
|
static constexpr float MOVE = 10;
|
||||||
|
|
||||||
|
std::vector<Ball> balls;
|
||||||
|
std::vector<std::vector<Block>> blocks;
|
||||||
|
|
||||||
|
Engine();
|
||||||
|
void draw();
|
||||||
|
void update(float delta);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,12 @@
|
||||||
|
#include "ball.hpp"
|
||||||
|
#include "engine.hpp"
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
Engine engine;
|
||||||
|
Ball ball;
|
||||||
|
|
||||||
|
engine.balls.push_back(ball);
|
||||||
|
engine.start();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Binary file not shown.
After Width: | Height: | Size: 1.6 KiB |
File diff suppressed because it is too large
Load Diff
After Width: | Height: | Size: 6.2 MiB |
Loading…
Reference in New Issue