Afin de mieux comprendre le soucis, voici le application.hpp
#ifndef APPLICATION_HPP
#define APPLICATION_HPP
#include <iostream>
#include <fstream>
#include <SFML/Graphics.hpp>
#include "scene.hpp"
#include "map.hpp"
#include "personnage.hpp"
class Application
{
// Graphique
sf::RenderWindow _window;
sf::Texture _background;
sf::Sprite _spriteBackground;
sf::FloatRect _headboxPerso;
sf::RectangleShape _rectangle[19][26];
sf::FloatRect _headboxRect;
// Logique
Scene _scene;
TileMap _map;
Personnage _perso;
public:
Application():
_window(sf::VideoMode(800, 600), sf::String(L"Projet Mario")),
_scene(_window)
{
if(!_background.loadFromFile("./src/graphics/background.jpg"))
cout << ">> Erreur lors du chargement background.jpg"<<endl;
_spriteBackground.setTexture(_background);
int level_string[19][26] = { 0 };
int level[19][26] = { 0 };
fstream fichier("./src/graphics/map.txt");
if (!fichier)
cout << "niveau inexistant" << endl;
else
{
int y = 0;
string ligne;
while (!fichier.eof())
{
getline(fichier, ligne); // On recupere une ligne dans le fichier sous la forme d'une string
for (int x = 0; x<(signed)ligne.length(); x++)
{
//ligne[i] renvoit le caractère placer a la i ème position.
level_string[y][x] = ligne[x];
}
y++;
}
}
for (int y = 0; y < 19; y++) {
for (int x = 0; x < 26; x++) {
switch (level_string[y][x]) {
case 'X':
_rectangle[y][x].setSize(sf::Vector2f(32,32));
_rectangle[y][x].setPosition(x*32,y*32);
level[y][x] = 0;
break;
case 'P':
_rectangle[y][x].setSize((sf::Vector2f(32,32)));
_rectangle[y][x].setPosition(x*32,y*32);
level[y][x] = 2;
break;
default :
level[y][x] = 30;
}
}
}
// on crée la tilemap avec le niveau précédemment défini
if (!_map.load("./src/graphics/tileset.png", sf::Vector2u(32, 32), level, 26, 19))
cout<<"erreur chargement tileset"<<endl;
}
void run()
{
sf::Clock clock;
while (_window.isOpen())
{
processEvents();
update();
render();
}
}
protected:
// Boucle événementielle
void processEvents()
{
sf::Event event;
while (_window.pollEvent(event))
{
_scene.handleEvent(event);
if (event.type == (sf::Event::Closed) || (sf::Keyboard::isKeyPressed(sf::Keyboard::Escape)))
_window.close();
}
}
void update()
{
_headboxPerso=_perso.Headbox();
for(int y=0;y<19;y++){
for(int x=0;x<25;x++){
_headboxRect=_rectangle[y][x].getGlobalBounds();
if(_headboxPerso.intersects(_headboxRect)){
_rectangle[y][x].setFillColor(sf::Color(0,255,0,128)); // Filtre si le personnage rentre en collision
_perso.Reposition();
}
else
{
_rectangle[y][x].setFillColor(sf::Color(255,0,0,128)); // Filtre par defaut
}
}
}
_scene.update();
}
void render()
{
_window.clear();
_window.draw(_spriteBackground);
_map.draw(_window);
for(int y=0;y<19;y++){
for(int x=0;x<25;x++){
_window.draw(_rectangle[y][x]); // Visualiser les collisions avec le systeme de filtre
}
}
_scene.draw();
_window.display();
}
};
#endif