Dzięki za tak wyczerpujaca odp. choc i tak nic mi na razie nie pomogła. Jest to aplet gry memory.
Aplet działa, nie sypią się żadne błędy. Warunki tak jak pisałem są dobre. Tablica Talia[] przechowuje obiekty typu Image. Nawet podwojne buforowanie nie pomogło. zmienna wybrano i wybrano2 są zmieniane w trakcie klikniecia klawisza myszy na odpowiedni obraz.
Problem dotyczy następujących linii:
if(wybrano2>=0){
// Buffer.drawImage( Talia[wybrano] , 0,0 ,100 ,100, this );
Buffer.drawImage( Talia[wybrano2] , 0, 0 ,100 ,100, this );
Buffer.drawString("Wybrano karte nr." + wybrano2, 10, 350);
Gdy odkomentuje Buffer.drawImage( Talia[wybrano] , 0,0 ,100 ,100, this ); to grafika zawsze sie zaladuje, ale nie ta ktora bym chcial.
Buffer.drawString("Wybrano karte nr." + wybrano2, 10, 350); zawsze pokazuje prawidlowy indeks tablicy. Uwaga i co dziwne zawsze sie prawidlowo wykona ta funkcja! Dzwieki ktore są wewnatrz tez prawidlowo sa odtwarzane.
Zrobiłem wiele testów i wynika z nich mianowicie cos takiego:
Gdy wybrano2==wybrano Grafika zawsze sie wyswietli, natomiast gdy wybrano2=!wybrano juz nie zawsze i nie wiem od czego to zalezy. Tak jakby nie zdarzyl zaladować do Buffor'a (Graphics) grafiki i przeszedl do wykonywania kolejnej funkcji. Dziwi mnie takie zachowanie i po klikaniu w karty i odkrywaniu karty odslaniaja sie w 90% prawidlowo, ale nie zawsze laduje sie jedna z kart. Błąd wynikający z ładowania 2 karty pojawia się w róznych chwilach i nie zalezy od żadnej ze zmiennych (tak przynajmniej mi się wydaje). Zawsze Od razu po uruchomieniu programu problem sie pojawia (przy pierwszym odslonieciu kart), natomiast pozniej juz mozna grac dalej az do napotkania ponownie tego bledu.
Funkcja rysująca:
public void update(Graphics arg0) {
paint(arg0);
for (int i=0;i<ilosckart;i++){
if (i==wybrano2)continue;
if (i==wybrano)continue;
Buffer.drawImage( karta , rect[i].x ,rect[i].y ,rect[i].width ,rect[i].height, this);
}
if(wybrano>=0){
Buffer.drawImage( Talia[wybrano] , rect[wybrano].x ,rect[wybrano].y ,rect[wybrano].width ,rect[wybrano].height,this);
//arg0.drawString("Wybrano karte nr." + wybrano, 10, 350);
}
if(wybrano2>=0){
// Buffer.drawImage( Talia[wybrano] , 0,0 ,100 ,100, this );
Buffer.drawImage( Talia[wybrano2] , 0, 0 ,100 ,100, this );
Buffer.drawString("Wybrano karte nr." + wybrano2, 10, 350);
int i,j;
for (i=0;i<ilosckart;i++){
if(wybrano==pary[i])break;
}
for (j=0;j<ilosckart;j++){
if(wybrano2==pary[j])break;
}
if(wybrano!=wybrano2){
if((i%(ilosckart/2))==(j%(ilosckart/2))){
rect[wybrano].setSize(0, 0);
rect[wybrano2].setSize(0, 0);
trafienia++;
audiohorn.play();
}
else{
pudla++;
audiocrash.play();
}
wybrano=-1;
wybrano2=-1;
}
uspij=true;
}
if(trafienia>=ilosckart/2){ koniec=true;
Buffer.drawString("KONIEC GRY", 150, 200 );
repaint();
try
{
Thread.sleep(200); // metoda powoduje że program "śpi" przez sekundę (1000milisekund)
} catch (InterruptedException e) {}
}
arg0.drawImage(Offscreen,0,0,this);
if(uspij==true){
try
{
Thread.sleep(1000); // metoda powoduje że program "śpi" przez sekundę (1000milisekund)
repaint();
} catch (InterruptedException e) {}
uspij=false;
}
}
Obsluga myszy:
public void mousePressed(MouseEvent arg0) {
myszx = arg0.getX();
myszy = arg0.getY();
for(int i=0;i<ilosckart;i++){
if (rect[i].contains(myszx, myszy))
{
if(wybrano<0){
wybrano= i;
repaint();
}
if(wybrano!=i){ //wybrano!=i
wybrano2=i;
repaint();
}
break;
}
}