Bonsoir,
je me permet de passer sur ce forum, vis à vis d'un code pour un jeux en 2D, j'obtiens des coordonnées délirantes, j'ai des pertes, la fonction clock.restart() fait baisser considérablement les performances, bref le code me semble pourtant correct.
J'ai du louper un épisode, j'ai installé la SFML 2.0, d'ou vient ces bugs??
#include <SFML/Graphics.hpp>
#include <iostream>
#define WND_WIDTH 1024
#define WND_HEIGHT 768
#define GRID_TILES 12
const sf::Texture BuildBackgroundGrid(const float size, const sf::Color& color1, const sf::Color& color2);
int main(int argc, char** argv)
{
sf::Clock clock;
sf::RenderWindow wnd(sf::VideoMode(WND_WIDTH, WND_HEIGHT), "Chicken Run!");
// Initialise des variables qui seront utilisées dans la boucle
sf::Vector2u wndSize(0, 0); // Au départ on met 0,0 afin de provoquer la création de la texture
sf::Texture texBackgroundGrid;
sf::CircleShape circle;
sf::Rect<int> scoreArea;
sf::Rect<int> gameArea;
sf::Rect<int> gridArea;
sf::Sprite grid;
float gridSide;
float mx = 0;
float my = 0;
float eq = 0;
int pixel = 90;
while(wnd.isOpen())
{
sf::Time time = clock.getElapsedTime();
sf::Event evt;
while(wnd.pollEvent(evt))
{
if(evt.type == sf::Event::Closed)
wnd.close();
}
wnd.clear(); // Efface la fenêtre
// Si les dimensions de la fenêtre ont changés, alors on recalcule tout
sf::Vector2u wndCurrentSize = wnd.getSize();
if(wndCurrentSize != wndSize)
{
wndSize = wndCurrentSize;
scoreArea = sf::Rect<int>(0, 0, wndSize.x * 0.3, wndSize.y); // Rectangle du panneau des scores
gameArea = sf::Rect<int>(scoreArea.width, 0, wndSize.x - scoreArea.width, wndSize.y); // Rectangle de la fenêtre moins le panneau des scores
gridSide = std::min(gameArea.width, gameArea.height) * 0.8; // Côté de la grille = 80% du minimum entre la hauteur et la largeur dispo.
gridArea = sf::Rect<int>(gameArea.left + ((gameArea.width - gridSide) / 2), gameArea.top + ((gameArea.height - gridSide) / 2), gridSide, gridSide);
texBackgroundGrid = BuildBackgroundGrid(gridSide, sf::Color::Blue, sf::Color::White);
grid = sf::Sprite(texBackgroundGrid);
grid.setPosition(gridArea.left, gridArea.top);
}
float tile = gridSide / GRID_TILES;
// Affiche la grille a la bonne position
wnd.draw(grid);
// Dessine le cercle
sf::CircleShape circle;
circle.setRadius(tile/2);
circle.setFillColor(sf::Color::Red);
// déplacement du pion
//////////////////////////////////
//////////////////////////////////
// il se déplace une seule fois, avec un décallage depuis la coordonnée d'origine. plus pixel est grand et plus cet écart est conséquent
/*my += (clock.getElapsedTime().asMicroseconds() * pixel) / 1000000;
clock.restart();*/
////////////////////////////////////
// Dans ce deuxième cas, il se déplace constamment, en attendant de faire le clock.restart()
my = (clock.getElapsedTime().asMilliseconds() * pixel) / 1000;
//clock.restart();*/
if ( my > (gridArea.height - tile) ) { my = 0; clock.restart(); }
circle.setPosition(gridArea.left + mx, gridArea.top + my);
wnd.draw(circle); // Affiche le déplacement du Pion
wnd.display(); // Dessine la fenêtre
}
return 0;
}
const sf::Texture BuildBackgroundGrid(const float size, const sf::Color& color1, const sf::Color& color2)
{
// Création d'une texture aux dimensions souhaités
sf::Texture text;
sf::RenderTexture t;
t.create(size, size);
t.clear(color1);
t.resetGLStates();
// Création d'un rectangle pour dessiner les tuiles
float tileSide = size / GRID_TILES;
sf::RectangleShape tile(sf::Vector2f(tileSide, tileSide));
tile.setFillColor(color2);
tile.setOutlineColor(sf::Color::Black);
tile.setOutlineThickness(1);
int count = 0;
for(int i = 0; i < GRID_TILES; i++)
{
for(int j = 0; j < GRID_TILES; j++)
{
if(count & 1)
{
tile.setPosition(i * tileSide, j * tileSide);
t.draw(tile);
}
count++;
}
count++;
}
t.display();
text = sf::Texture(t.getTexture());
return text;
}
Merci bien.