pomoc przy pisaniu gry

0

Witajcie! Od jakiegoś roku uczę się programowania, miałem trochę przerwy ale ostatnio znów wziąłem się za to. Chciałbym napisać jakąś prostą grę aby się nauczyć czegoś nowego. Aktualnie napisałem kawałek kodu (nie wiem czy mogę wam tu mój projekt podesłać??). W załączniku macie te gierkę. Prosiłbym o podesłanie jakiś linków które mogłyby mi pomóc lub jakieś sugestie jak mógłbym polepszyć ją. Mam mały problem z płynnością na wyższych lvl i wiem że jest to błąd związany ze sprawdzaniem kolizji;/ gra działa mniej więcej tak:
1.pojawia się okno z tłem,
2.pojawia się ludzik,
3.(początek pętli odpowiadającej za poziomy) tworzy potworki,
4. i w kolejnej pętli, dla każdego potworka: zmienia się pozycja, i sprawdzane jest czy "dotyka" on gracza,
5. jesli wszystkie potworki są martwe to każdego potworka ustawiam na null i wychodzę do pierwszej pętli generując kolejny poziom.

kolejna sprawa to jak rozwiązać problem z ruchem gracza? chciałbym żeby chodził w 8 kierunkach i żeby ruszał się od razu po wciśnięciu i przytrzymaniu jakiegoś klawisza. aktualnie jak wcisnę strzałkę to zrobi krok poczeka chwile i dopiero idzie dalej;/

z góry dziękuje za pomoc i pozdrawiam!

1

Chodzenie na pewno robisz w ten sposób?:
Jeśli klawisz został naciśnięty to idź i dopiero "odciśnięcie" klawisza (czyli inne zdarzenie całkiem) zmienia stan obiektu player by np. stał.
Wygląda to tak jakbyś type używał. Czyli tak jak przyciśniesz klawisz przy pisaniu.

0

To jest ciekawa podpowiedź. Nie myślałem w ten sposób. Zrobiłem to tak że jeśli jest wciśnięty przycisk to zmienia się jego położenie a nie stan obiektu. dziękuje.

0

hmm nie łapię jak to wykorzystać ;/ poczytam jeszcze i pobawię się jakimiś przykładami. Dziękuje za link! jak macie jeszcze coś czym mógłbym się zainteresować przy pisaniu gierki to dajcie mi tu znak.
jak dodam to do swojego kodu i próbuje wywołać metodę game() to mi sie wyświetla czarny ekran i apka sie wiesza;/

0

Wiele linków nie dostaniesz, ze względu na to, że tworzenie gier to sztuka!
Oczywiście, możesz poczytać o "zasadach działania", typu jak działa mapa, czemu blok nie musi mieć położenia, dlaczego używać matryce etc
Jednakże większość to tylko i wyłącznie twój pomysł.

Pozdrawiam, spartanPAGE

0

ok dziękuje ;/ hmm będę musiał jeszcze popracować nad tym;/

właściwie to już jakoś to wklepałem w kod;D i działa jednak pokazuje mi się wyjątek NullPointerException, dałem to w blok try catch... teraz wszystkie potworki chodzą z taką samą prędkością jednak apka ma chwilowe zawiechy, co jakiś czas widać taki przeskok jedno sekundowy

0

powinieneś wiedzieć skąd leci ten wyjątek i to naprawić zamiast łapać go tylko

0

Z mojego skromnego doświadczenia:
stwórz tablicę boolean w której będziesz trzymać stan klawiszy (np. WASD) i zmieniaj wartości kiedy klawisz zostanie wciśnięty (na true), ale TEŻ kiedy zostanie puszczony (na false).
Zainteresuj się też biblioteką LibGDX.

Powodzenia! :)

0

libGDX będę musiał sobie lepiej przejrzeć jak będzie czas. Z tym sterowaniem już mam pomysł.
Muszę jeszcze pomyśleć nad tym jak robić animacje. Kiedyś za dzieciaka bawiłem się the games factory, tam robiłem żeby ekran się przesuwał razem z postaciom, nie mam pomysłu jak to rozwiązać;/
I jeszcze jedno... Widziałem że niektórzy robią tak że mają zrobione w np paincie jakąś mapkę różnokolorową a potem to im się jakoś zmienia w tło. Ciekaw jestem jak to zrobić. Domyślam się że to wrzuca na konkretny kolor jakieś obrazki (np na czerwony prostokąt daje obrazek kamienia) tylko jak to zrobić? Ciekawi mnie sam pomysł bo aktualnie wolałbym raczej samemu ustawiac pozycje elementów

0

Ok sama mapka to nie jest trudna rzecz. Zakładam że wiesz jak wczytać obraz do BufferedImage :)

BufferedImage ma piękną metodę:

BufferedImage src; //wczytany plik z mapką
int color = src.getRGB(x, y);

Ta metoda zwróci Ci kolor RGB danego pixela (koordynaty x, y) z wczytanego pliku graficznego.
Teraz musisz napisać kilka if-ów (albo nawet lepiej switch'a jeżeli iterujesz przez wszystkie pixele ;) ), ustalasz jeden kolor na jeden typ podłoża i zrobione.

Pisz jak masz pytania, bo mogłem niezbyt jasno to wytłumaczyć.

0

no wiem jak wczytac do bufferedimage nawet w mojej gierce (na samej górze) z tego korzystam. mhmm no mniej więcej wiem o co chodzi. tylko to bym musiał jakoś najpierw zmieniać y, potem jak dojade do konca to zmienic x i znowu y zmieniac i tak kazda linie? czy moze jakoś co 5 pikseli skakać? aa i jak dajmy na to będzie gdzieś kwadrat 50pikseli na 50pikseli to trzeba będzie jakoś się zabezpieczyć żeby nie nakładał kilku obrazków na siebie. hmm ciekawe.

0

BufferedImage używaj naprawdę z rozwagą, bo niesamowicie spowalnia jego używanie grę, A używanie go co klatkę jest już bardzo złe.

0

czyli lepiej do wyświetlania większości obrazków korzystać z java.awt.Image? czy jest jakieś lepsze rozwiązanie?

0

Pokuszę się powiedzenie, że dobrze jest używać "bardziej natywnego" Toolkit.createImage

1
shusty napisał(a):

BufferedImage używaj naprawdę z rozwagą, bo niesamowicie spowalnia jego używanie grę, A używanie go co klatkę jest już bardzo złe.

shusty napisał(a):

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

0

Dziękuje! Miałem tak jak mówisz. No tak ten pomysł z ruchem już sprawdziłem i to mi rozwiązuje też problem z kierunkami. Mogę w ten sposób zrobić żeby gracz chodził nie tylko w prawo czy inną stronę ale może iść po skosie. Nie ukrywam że pisanie gier jest dla mnie czymś nowym dopiero od niedawna uczę się programować a tak za pisanie programów z GUI zacząłem od jakiś 2 miesięcy. Tę grę piszę aby się czegoś nauczyć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1