Wpis z mikrobloga

Jestem noobem w javie, piszę tetrisa i mam problem, że czasami jakaś klatka się zawiesi i chociaż klocek spada to jego "widmo" co chwilę mruga. Chciałem to nagrać programem, ale niestety wygasła mi licencja, ale jak go odpalę i każe mi wpisać keya, to nadal mam pokazany licznik fpsów i kiedy odpalę tego mojego tetrisa i jest widoczny w nim licznik fps to problem nie występuje. Wie ktoś o co może chodzić?

Jak ktoś chce, to mogę napisać trochę o kodzie.
#java #naukaprogramowania
  • 22
@Picasso7: to nie jest przyczyna błędu, ale źle używasz generatora liczb losowych - nie twórz go za każdym razem, tylko raz i trzymaj gdzieś w klasie i pobieraj z niego kolejne liczby.

Czemu jest frame.repaint przed ifem we while, i w ifie - przez to czasem rysujesz 2 razy w jednej klatce gry. Tak ma być?

Czemu ten konstruktor nie robi nic z argumentami? Nie powinien przypadkiem ustawić pozycji (zawsze przekazujesz
@tell_me_more: repaint przed ifem jest żeby odświeżało po każdym moveDown, a w ifie tylko jeżeli klocek się zatrzyma to dodajemy nowy i go rysujemy,
mam jeszcze 7 klas które dziedziczą z figury i tam chyba się domagało konstruktora z 2 zmiennymi
@Picasso7: ok, to jeszcze widzę jeden problem - listener chodzi w innym wątku, niż rysowanie. Więc może się zdarzyć, że w trakcie rysowania z wnętrza while wciśniesz przycisk, przesuniesz figurę, i zaczniesz ją rysować drugi raz z listenera. Jak wciskasz non-stop klawisz "w dół", to w ogóle może być tak, że listener odpali się wiele razy, i zanim pierwsze odpalenie sięzakończy - to kolejne już zaczną rysować.

Jak dla mnie to
PS a w ogóle to bym też zrobił, że gra rysuje co 33 albo 16 milisekund niezależnie od tego, czy akurat klocek poszedł w dół, czy nie. Coś w tym stylu (pseudokod, ale widać, o co chodzi):

while(notEnd) {
currentTime = getTime();
if (currentTime-lastFallingTime > fallingTimeout) {
lastFallingTime = currentTime;
figure.fallDown();
}
if (currentTime-lastKeyboardTime > keyboardTimeout) {
lastKeyboardTime = currentTime;
if (down) { figure.fallDown(); }
if (left) {figure.goLeft(); }
// etc... right,