BufferedImage używaj naprawdę z rozwagą, bo niesamowicie spowalnia jego używanie grę, A używanie go co klatkę jest już bardzo złe.
Pokuszę się powiedzenie, że dobrze jest używać "bardziej natywnego" Toolkit.createImage
Weź się w łeb jebnij.
@rezus008:
Przede wszystkim takie coś jak aktywna gra (tj te z "chodzącym ludzikiem") nie powinna być robiona na frameworku do GUI - a tym jest Swing. Taka gra też, jeśli już, nie powinna być renderowana pasywnie.
http://docs.oracle.com/javase/tutorial/extra/fullscreen/rendering.html - małe infor o renderowaniu aktywnym.
Twój początkowy problem polegał na tym, że zapewne Twój key listener, sprawdzając klawiesze, od razu robił coś w styly if(key == VK_RIGHT) player.x += 1; A powinien zamist tego ustawiać to inaczej. Ponieważ te eventy są odpalane tylko przy naciskaniu klawisza... (windows też casem odpala je cały czas póki klawisz jest wciśnięty)
Dla uproszcenia, przedstawię to tak: Na zdarzeniu keypress, załóżmy przycisk "w lewo" powinien ustawiać graczowi stan, o tym że idzie w lewo. (player.goesLeft = true) przy puszczaniu puszczaniu, że nie idzie już w lewo (player.goesLeft = fale)
Dopiero pętla gry, sprawdza za każdym razem if(player.goesLeft) player.x-=1; i podobnie.
pętla gry powinna wyglądać mniej więcej tak:
init(); // ładujesz wszelkie obrazki/textury, obiekty, ustawiasz okno gry, ustawiasz gracza na pozycji itd.
while(true) {
step(); // tutaj poruszasz światem gry - tutaj wszystkie obiekty sprawdzają swoje stany i zależnie od tych stanów się zachowują
render(); // odrysowujesz świat, wszelkie obiekty na nim, itd.
sleep(); // żeby nie spamować odrysowywaniem, musisz czasem troche poczekać, żeby mieć stabilną ilośc FPS (bo po co miałbyś mieć np. 1000 fps)
// a najlepiej, zamiast robić while(true), użyć klasy Timer i metody scheduleAtFixedRate() i nie używać żadnych sleepów
}
BufferedImage - tak, powinieneś używać tej klasy - przy wspomaganiu sprzętowym, ta klasa jest wspomagana texturą na karcie graficznej - przez co renderowanie jej na ekran (lub na inną teksturę) jest dośc szybcie. Problem w tym, że BufferedImage może mieć różne typy - zależnie od tego jak ułożone są bity kolorów w nim, i ile bitów przypada na kolor. Typ obrazka wczytanego z dysku może być niekompatybilny z tym, co oczekuje nasze środowisko graficzne. Zawsze po wczytaniu obrazka, trzeba go przekonwertować na kompatybilny, jeśli chce się go wykorzystać w grze. (konwertowanie może polegać na.. stworzeniu kompatybilnego typu o tym samym rozmiarze i przerysowaniu niekompatybilnego na kompatybilny, voila)
Nie zamierzam tutaj tłumaczyć jak i co zrobić. Odpowiadam tylko dlatego, że kurwica mnie bierze jak widzę takie idiotycznie porady jak od shustego.
I właściwie gry nie powinno się robić na frameworkach do GUI. Zainteresuj się czymś takim jak LibGDX