Salut à tous!
J'ai décidé de faire un jeu de plateforme en SFML.
Au début, je faisait tout mon programme dans mon main (oui, c'est crade, je sais
), et il marchais très bien!
Mais j'ai décidé de découper mon programme en plusieurs fonctions ou classes, et je rencontre un problème à l'affichage de mon décor:
toute la ligne des premiers blocs est remplacé par une barre de la couleur du raffraichissement de l'écran.
capture d'écran:
Comme vous vous en doutez, j'aimerai bien que quelqu'un m'explique pourquoi, ou, au mieux, me donne une solution
.
Je remercie d'avance tout ceux qui vont faire un post sur ce sujet
.
Et, bien sur, je vous met les fichier concernés par ce problème(vous allez surement trouver que le code est peu synthétique, mais je code depuis peu, et c'est mon premier "gros" projet, sans l'appuie d'un tuto):
main.cpp:
#include "Screen.h"
#include "Personnage.h"
using namespace sf;
int main()
{
RenderWindow prog(VideoMode(1216, 684), "Test.exe");
int yScreen(prog.GetHeight()/38), ind(38), indR(38), finX(0);
double indT(0), constt(0.027);
char pos('d');
bool droite(false), gauche(false), haut(false), bas(false);
Clock timer, timerMarche;
Event event;
Screen screen(yScreen);
screen.chargementLvl(1);
finX=(screen.getfichierLvlsize()-prog.GetWidth()/38)*38;
prog.UseVerticalSync(true);
while(prog.IsOpened())
{
while(prog.GetEvent(event))
{
switch (event.Type)
{
case Event::Closed :
prog.Close();
break;
case Event::KeyPressed :
{
switch (event.Key.Code)
{
case Key::Escape :
prog.Close();
break;
case Key::Right :
droite=true;
pos='d';
ind=0;
timerMarche.Reset();
break;
case Key::Left :
gauche=true;
pos='g';
indR=0;
timerMarche.Reset();
break;
case Key::Down :
bas=true;
haut=false;
break;
case Key::Up :
haut=true;
bas=false;
break;
default :
break;
}
}
break;
case Event::KeyReleased :
{
switch (event.Key.Code)
{
case Key::Right :
droite=false;
break;
case Key::Left :
gauche=false;
break;
case Key::Down :
bas=false;
break;
case Key::Up :
haut=false;
break;
default :
break;
}
}
break;
default :
break;
}
}
prog.Clear(Color(2, 255, 255));
screen.scroling(ind, indR, prog.GetWidth(), gauche, droite);
for (int i(0); i<yScreen; i++)
{
for (int j(0); j<screen.getfichierLvlsize(); j++)
{
prog.Draw(screen.getSprite(j, i));
}
}
prog.Display();
}
return EXIT_SUCCESS;
}
Screen.h:
#ifndef SCREEN_H_INCLUDED
#define SCREEN_H_INCLUDED
#include <SFML/Graphics.hpp>
#include <fstream>
#include <string>
#include <iostream>
#include <vector>
using namespace sf;
class Screen
{
public:
Screen(int yS);
~Screen();
void chargementLvl(int nomLvl);
int getfichierLvlsize() const;
Sprite getSprite(int j, int i);
void scroling(int indt, int indtR, int w, bool gauche=false, bool droite=false);
private:
Image *Zero, *Un, *Deux, *Trois, *Quatre, *Cinq, *Six, *Sept;
int y, x, yScreen, finX, ind, indR, indDX;
Sprite **screen;
int **xScreen;
std::ifstream *fluxFichierLvl;
std::string ligne;
std::vector<std::string> fichierLvl;
double indT, constt;
Clock timer;
};
#endif // SCREEN_H_INCLUDED
Screen.cpp:
#include "Screen.h"
Screen::Screen(int yS)
{
int y(0), x(0);
Zero= new Image;
Un= new Image;
Deux= new Image;
Trois= new Image;
Quatre= new Image;
Cinq= new Image;
Six= new Image;
Sept= new Image;
Zero->LoadFromFile("fond.png");
Un->LoadFromFile("bloc.png");
Deux->LoadFromFile("sol.png");
Trois->LoadFromFile("bloqueBonus.png");
Quatre->LoadFromFile("murCassable.png");
Cinq->LoadFromFile("pics.png");
Six->LoadFromFile("plateformeTraversableBas.png");
Sept->LoadFromFile("plateformeTraversableHaut.png");
constt=0.027;
ind=38;
indR=38;
finX=0;
indDX=0;
yScreen=yS;
}
Screen::~Screen()
{
for (int i(0); i<fichierLvl[0].size(); i++)
{
delete screen[i];
delete xScreen[i];
}
delete screen;
delete fluxFichierLvl;
delete xScreen;
delete Zero;
delete Un;
delete Deux;
delete Trois;
delete Quatre;
delete Cinq;
delete Six;
delete Sept;
}
int Screen::getfichierLvlsize() const
{
return fichierLvl[0].size();
}
void Screen::chargementLvl(int nomLvl)
{
if (nomLvl==1)
{
fluxFichierLvl= new std::ifstream("lvl.txt");
}
else if(nomLvl==2)
{
}
else if(nomLvl==3)
{
}
else if(nomLvl==4)
{
}
else if(nomLvl==5)
{
}
else if(nomLvl==6)
{
}
else if(nomLvl==7)
{
}
else if(nomLvl==8)
{
}
else if(nomLvl==9)
{
}
else if(nomLvl==10)
{
}
while(getline(*fluxFichierLvl, ligne))
{
fichierLvl.push_back(ligne);
}
screen= new Sprite*[fichierLvl[0].size()];
xScreen= new int*[fichierLvl[0].size()];
for (int i(0); i<fichierLvl[0].size(); i++)
{
screen[i]=new Sprite[yScreen];
xScreen[i]=new int[yScreen];
}
for (int i(0); i<yScreen; i++)
{
for (int j(0); j<fichierLvl[0].size(); j++)
{
screen[j][i].SetPosition(x,y);
xScreen[j][i]=x;
if (fichierLvl[i][j]=='0')
{
screen[j][i].SetImage(*Zero);
}
else if (fichierLvl[i][j]=='1')
{
screen[j][i].SetImage(*Un);
}
else if (fichierLvl[i][j]=='2')
{
screen[j][i].SetImage(*Deux);
}
else if (fichierLvl[i][j]=='3')
{
screen[j][i].SetImage(*Trois);
}
else if (fichierLvl[i][j]=='4')
{
screen[j][i].SetImage(*Quatre);
}
else if (fichierLvl[i][j]=='5')
{
screen[j][i].SetImage(*Cinq);
}
else if (fichierLvl[i][j]=='6')
{
screen[j][i].SetImage(*Six);
}
else if (fichierLvl[i][j]=='7')
{
screen[j][i].SetImage(*Sept);
}
x+=38;
}
y+=38;
x=0;
}
for (int j(0); j<fichierLvl[0].size(); j++)
{
screen[j][0].SetPosition(x,y);
xScreen[j][0]=x;
x+=38;
}
}
void Screen::scroling(int indt, int indtR, int w, bool gauche, bool droite)
{
if (indDX==0)
{
finX=(fichierLvl[0].size()-w/38)*38;
indDX=1;
}
timer.Reset();
if (droite)
{
ind=indt;
if(finX>0)
{
if (ind<38)
{
indT=timer.GetElapsedTime();
if(indT<constt)
{
for (int i(0); i<yScreen; i++)
{
for (int j(0); j<fichierLvl[0].size(); j++)
{
xScreen[j][i]-=1;
screen[j][i].SetX(xScreen[j][i]);
}
}
finX--;
ind++;
timer.Reset();
}
}
}
}
else if(gauche)
{
indR=indtR;
if(xScreen[0][0]<0)
{
if (indR<38)
{
indT=timer.GetElapsedTime();
if(indT<constt)
{
for (int i(0); i<yScreen; i++)
{
for (int j(0); j<fichierLvl[0].size(); j++)
{
xScreen[j][i]+=1;
screen[j][i].SetX(xScreen[j][i]);
}
}
finX++;
indR++;
timer.Reset();
}
}
}
}
}
Sprite Screen::getSprite(int j, int i)
{
return screen[j][i];
}
Matoux
Ps: Je tien à préciser que le programme compile