Otoz mam taki dziwny problem, program losowo sie uruchamia, raz nie, a raz tak. Nie raz u mnie jest wszystko ok, dziala tryb Debug i Release, lecz na innych komputerach juz nie.
Wydaje mi sie ze problem lezy tu po stronie wskaznika i klas wirtualnych.
kod:
Balwan.cpp
#include <SFML/Graphics.hpp>
#include <cmath>
#include <vector>
#include "Przyciski.h"
#include "Kategorie.h"
int main()
{
sf::Font czcionka;
sf::Texture t;sf::Sprite tlo;
button przycisk;
sniezka s[8];
kostka kosc;
kursor k; // mysz
kategorie *wsk;
cialo c;
//na_glowe ng;oczy o;nos n;usta u;na_szyje ns;do_reki dr;
//std::vector <int> adresy;
//adresy.push_back((int)&c);
sf::Sprite balwan[7];
ladowanie(czcionka,t,tlo);
przycisk.zaladuj(); // ladowanie zmiennych
wsk=&c;
sf::Clock zegar;
sf::Time czas;
sf::RenderWindow okno( sf::VideoMode( 860, 640 ), "Rysuj balwana" );
okno.setMouseCursorVisible(false);
while( okno.isOpen() )
{
przycisk.zmien(przycisk.najechany);
sf::Vector2f mysz = okno.mapPixelToCoords(sf::Mouse::getPosition(okno));
sf::Event zdarzenie;
while( okno.pollEvent( zdarzenie ) )
{
if( zdarzenie.type == sf::Event::Closed )okno.close();
if( zdarzenie.type == sf::Event::Resized )okno.setSize( sf::Vector2u( 860, 640 ) );
if( zdarzenie.type == sf::Event::MouseButtonPressed && zdarzenie.mouseButton.button == sf::Mouse::Left ) // klikniecie lewym przyciskiem myszy
{
przycisk.klik(mysz);
kosc.klik(mysz);
// wsk=(kategorie*)adresy[przycisk.aktywny];
kosc.los=10;
}
} //while
wsk->ustaw(kosc.los);
// if(kosc.rysowanie==true)balwan[0]=wsk->rysuj();
kosc.na_kosci(mysz);
//animacja kostki
if(czas.asMilliseconds()>=90 && kosc.anime==true && kosc.wylosowano==false){kosc.animacja();zegar.restart();}
if(kosc.wylosowano==true)kosc.losowanie();
for(int i=0;i<8;i++)s[i].przejechano(mysz,przycisk.najechany,przycisk.image);
// najechanie na image
przycisk.najechanie(mysz);
for(int i=0;i<8;i++){if(s[i].pierwszy==true || s[i].poza==true){s[i].losuj(przycisk.najechany,przycisk.image);}}
okno.clear();
okno.draw(tlo);
przycisk.rysuj(okno);
kosc.rysuj(okno);
if(przycisk.anime==true){for(int i=0;i<8;i++){s[i].ruch(przycisk.najechany,przycisk.image);s[i].rysuj(okno);}}
else {for (int i=0;i<8;i++)s[i].pierwszy=true;}
k.rysuj(okno,mysz);
wsk->rysuj(okno);
//okno.draw(balwan[0]);
okno.display();
czas=zegar.getElapsedTime();
} //while
return 0;
}
Kategorie.h
#ifndef KATEGORIE_H_INCLUDED
#define KATEGORIE_H_INCLUDED
#include <SFML/Graphics.hpp>
class kategorie
{
public:
sf::Sprite o; //obraz
sf::Texture *t; // textura
int posx,posy;
virtual void ustaw(int &los)=0;
virtual void rysuj(sf::RenderWindow &okno)=0;
};
class cialo:public kategorie
{
public:
cialo();
~cialo();
virtual void ustaw(int &los);
virtual void rysuj(sf::RenderWindow &okno);
};
#endif // KATEGORIE_H_INCLUDED
Kategorie.cpp
#include <SFML/Graphics.hpp>
#include <iostream>
#include <windows.h>
#include <time.h>
#include "Kategorie.h"
cialo::cialo()
{
t=new sf::Texture [6];
t[0].loadFromFile("img/cialo/balwan1.png");
t[1].loadFromFile("img/cialo/balwan2.png");
t[2].loadFromFile("img/cialo/balwan3.png");
t[3].loadFromFile("img/cialo/balwan4.png");
t[4].loadFromFile("img/cialo/balwan5.png");
t[5].loadFromFile("img/cialo/balwan6.png");
}
cialo::~cialo()
{
delete t;
}
void cialo::ustaw(int &los)
{
if(los<7)
{
o.setTexture(t[los-1]);
if(los==1)o.setPosition(200,-100);
else if(los==2)o.setPosition(200,0);
else o.setPosition(200,-50);
}
}
void cialo::rysuj(sf::RenderWindow &okno)
{
okno.draw(o);
}
Zauwazylem tez ze gdy dam:
//std::vector <int> adresy;
//adresy.push_back((int)&c);
//---bez komentarzy--------
std::vector <int> adresy;
adresy.push_back((int)&c);
To juz nie dziala lub nie zawsze ;/
O co tu wgl chodzi ?! Mam wzywac egzorcyste czy jak ? :D
Pozdrawiam