Dodanie płynnego ruchu ujawniło problem, który wcześniej nie występował - przy planszy o rozmiarze 43x25 wydajność znacznie spadała (w okolice 20fps). Nie spodziewałem się, że w dzisiejszych czasach trzeba myśleć o optymalizacji jakiegoś dwuwymiarowego shitu rodem z lat osiemdziesiątych. Dłubałem, dłubałem i chyba się dodłubałem - największy problem sprawia chyba iteracja przez listę klocków (miałem tam listę wszystkich elementów budujących labirynt i wędrowałem przez nią przy rysowaniu i liczeniu "fizyki"). Zamiana tego na słownik (gdzie kluczem jest tuple z pozycją) daje solidnego kopa.
W sumie to dziwne. Sądziłem, że najkosztowniejsze jest rysowanie (a i tak nie rysowałem niewidocznych elementów), a nie jakaś głupia iteracja przez 1000 elementów. Jak widać nie dla Pythona. A może to powtarzanie testów widoczności było zbyt kosztowne? Zobaczę, jak się to sprawdzi (chwilowo mam to wygrzebane poza główny program). Jak się nie sprawdzi, to przesiadam się na C++. Bua cha cha cha.
Domyślam się, że część winy leży w tym, że uruchamiałem to na VirtualBoksie pod Ubuntu, z wyłączoną akceleracją 2D, na karcie Intela i w trybie "wydajnym" lapka. Ale celuję w to, aby działało to nawet na ciut słabszym sprzęcie (przykładowo moim stacjonarnym staruszku).
Za to fizyka i przeciwnicy działają już jak należy (no a w każdym razie tak, aby nie dawać mi powodów do narzekań).
W ramach testów wklepałem parę plansz z Heartlight ((c) Janusz Pelc). Efekt nie jest taki jak w oryginale, a zatem nie mogę pochwalić się w pełni funkcjonalną podróbką, ale chyba nie będę dopasowywać się na siłę. Podoba mi się, jak to działa teraz. No, chyba że skończę już wszystko inne.
wtorek, 17 maja 2011
niedziela, 15 maja 2011
Bowlder nadal żyje!
Wcale się nie obijałem przez ostatni tydzień. To znaczy oczywiście, że się obijałem - dlaczegóż by nie? Ale nie tylko obijałem. Parę chwil poświęciłem na pieszczenie Bowldera. Bo tak to chyba można już tylko nazwać. Niby ma wszystko, co mieć powinien, ale jest brzydki, w paru miejscach mógłby zachowywać się lepiej niż zachowuje, kod jest popstrzony starymi rzeczami schowanymi w komentarzach, ale... działa. Co dalej? Trochę sprzątania, drobne poprawki, może parę godzin w GIMPie, aby wreszcie dać jakieś przytomne ikony przeciwników.
Tego jeszcze nie zrobiłem. Ale już mam "płynny ruch". Wygląda całkiem fajnie. Posiedziałem też nad wydajnością (na większej planszy spadała w okolice 20 ramek - fatalnie, fatalnie). To zupełnie zmieniło koncepcję "renderera" (i dobrze, tamta była słaba). Upłynniając ruch, rozsynchronizowałem fizykę - teraz każdy kamień (i przeciwnik) może sobie działać we własnych fazach. Rodzi to jeszcze pewne problemy, ale do opanowania.
Nim umieszczę nową wersję, chcę jeszcze dodać parę elementów (bomby, działka, może klucze lub teleporty).
Tego jeszcze nie zrobiłem. Ale już mam "płynny ruch". Wygląda całkiem fajnie. Posiedziałem też nad wydajnością (na większej planszy spadała w okolice 20 ramek - fatalnie, fatalnie). To zupełnie zmieniło koncepcję "renderera" (i dobrze, tamta była słaba). Upłynniając ruch, rozsynchronizowałem fizykę - teraz każdy kamień (i przeciwnik) może sobie działać we własnych fazach. Rodzi to jeszcze pewne problemy, ale do opanowania.
Nim umieszczę nową wersję, chcę jeszcze dodać parę elementów (bomby, działka, może klucze lub teleporty).
sobota, 7 maja 2011
Bowlder Smash video
Wrzuciłem filmik z rozgrywki na youtuba. Nie wiem skąd problemy z nagraniem dźwięku - tak pod Windą jak i Ubuntu. Spróbuję z innym programem.
Bowlder Smash
No, jest już wersja z większością funkcjonalności, jaką zamierzałem zrobić. Porzuciłem pomysły na nowe rodzaje elementów, poprzestając na najprostszych. Ale można już zginąć od wszystkiego, od czego powinno się móc zginąć, gra ma początek i koniec (no, prawie), można kończyć kolejne mapy, jest trochę dźwięków i trochę animacji (dodanie większej ich liczby to kwestia przygotowania zasobów).
Jako poziomy używane są mapy zapisane w bieżącym katalogu (pliki map*.txt - w kolejności alfabetycznej). Z nowych znaków: 'X' oznacza wyjście (dostępne tylko po zebraniu wszystkich klejnotów). Jeśli gdzieś się zablokujemy, ważnym klawiszem może okazać się "R" - resetuje on dany poziom.
Kod w wielu miejscach wygląda całkiem porządnie, choć w paru nadal mam chaos, który będę musiał opanować (renderer przestał mi się podobać, wczytywanie mapy też wymaga przemyślenia, może jeszcze kwestia ładowania nowych leveli).
Zaobserwowane problemy: pod Win7 po pewnym czasie muzyka zaczyna pierdzieć, nie wiem czy to wina pliku, czy moja.
TODO: poza przygotowaniem bogatszego zestawu grafik i dźwięków i wprowadzeniem kolejnych typów elementów gry będę musiał posiedzieć nad zaimplementowaniem płynnego ruchu.
Muzyka w tle: Royalty free production music by JewelBeat.
Efekty dźwiękowe: Freesound.
Źródła: https://rapidshare.com/files/461080079/Bowlder_04_src.zip
Exe: https://rapidshare.com/files/461080481/Bowlder_04.zip
Jako poziomy używane są mapy zapisane w bieżącym katalogu (pliki map*.txt - w kolejności alfabetycznej). Z nowych znaków: 'X' oznacza wyjście (dostępne tylko po zebraniu wszystkich klejnotów). Jeśli gdzieś się zablokujemy, ważnym klawiszem może okazać się "R" - resetuje on dany poziom.
Kod w wielu miejscach wygląda całkiem porządnie, choć w paru nadal mam chaos, który będę musiał opanować (renderer przestał mi się podobać, wczytywanie mapy też wymaga przemyślenia, może jeszcze kwestia ładowania nowych leveli).
Zaobserwowane problemy: pod Win7 po pewnym czasie muzyka zaczyna pierdzieć, nie wiem czy to wina pliku, czy moja.
TODO: poza przygotowaniem bogatszego zestawu grafik i dźwięków i wprowadzeniem kolejnych typów elementów gry będę musiał posiedzieć nad zaimplementowaniem płynnego ruchu.
Muzyka w tle: Royalty free production music by JewelBeat.
Efekty dźwiękowe: Freesound.
Źródła: https://rapidshare.com/files/461080079/Bowlder_04_src.zip
Exe: https://rapidshare.com/files/461080481/Bowlder_04.zip
czwartek, 5 maja 2011
Boulder Robbo
Ufff... sporo zmian w kodzie, choć niewiele w samym wyglądzie i działaniu aplikacji. Wreszcie wyrzuciłem starą procedurę fizyczną i zastąpiłem reprezentacją obiektową. Od razu projekt nabrał wyrazu i od razu wysypał się szereg możliwości rozbudowy: przeciwnicy innych typów, inne zasady ruchu, bomby, miny, teleporty. Najchętniej zaimplementowałbym wszystko, co było dostępne w Boulder dashu, Robbo, Supapleksie i może jeszcze Saperze (tym z małego Atari, a nie windowsowym). Lista pożądanych ficzerów rośnie. Ale to raczej oddala projekt od wersji finalnej.
Z poważnych zmian - eksplozje (gdy gracz zetknie się z potworem lub złapie kamień na głowę). Jest to pierwszy animowany sprite, na jego wzór dodam inne - chciałbym animować przynajmniej przeciwnika (myślałem o obracających się ostrzach) i kryształy (jakieś błyski, odblaski). Widzę też, że z obecnej postaci nie będzie tak ciężko przejść na płynny ruch. To może być fajny dodatek, bo ruch skokowy (dotyczy to zwłaszcza bohatera) bywa męczący.
Lista "TODO" się rozszerza, zamiast kurczyć: rzeczy, które wybuchają po upadku, rzeczy które wybuchają po wejściu, rzeczy które wybuchają po pchnięciu, rzeczy, które wybuchają gdy zrzucić na nie kamień, strzelanie, działka, lasery, ruchome bramy, teleporty, lód, zmiana grawitacji, pola siłowe, magnesy, ...
Kod wrzucę później, póki co - obrazek ze złapaną eksplozją:
Z poważnych zmian - eksplozje (gdy gracz zetknie się z potworem lub złapie kamień na głowę). Jest to pierwszy animowany sprite, na jego wzór dodam inne - chciałbym animować przynajmniej przeciwnika (myślałem o obracających się ostrzach) i kryształy (jakieś błyski, odblaski). Widzę też, że z obecnej postaci nie będzie tak ciężko przejść na płynny ruch. To może być fajny dodatek, bo ruch skokowy (dotyczy to zwłaszcza bohatera) bywa męczący.
Lista "TODO" się rozszerza, zamiast kurczyć: rzeczy, które wybuchają po upadku, rzeczy które wybuchają po wejściu, rzeczy które wybuchają po pchnięciu, rzeczy, które wybuchają gdy zrzucić na nie kamień, strzelanie, działka, lasery, ruchome bramy, teleporty, lód, zmiana grawitacji, pola siłowe, magnesy, ...
Kod wrzucę później, póki co - obrazek ze złapaną eksplozją:
poniedziałek, 2 maja 2011
Boulder Dash - jeszcze trochę
Niewiele nowości, bo sporo dłubałem przy porządkowaniu kodu, bawiłem się różnymi koncepcjami, dodałem parę klas do rzeczy które dotąd działały i bez tego. Ale jakaś tam nowa funkcjonalność jest. Jest ekran startowy i końcowy (bo wreszcie można zginąć lub wygrać). Śmierć mogą nam zadać, póki co, jedynie wrogowie-przeszkadzajki. Z kamieniami trochę próbowałem, niekiedy udaje im się zabić przeszkadzajkę. Zidentyfikowałem problem, ale wykonanie zostawiam sobie na "następny raz".
Podobają mi się klasy GameIntro, Game, GameOver, choć trochę jeszcze je wygładzę, kamienie będą zrobione jak przeciwnicy lub wyjście, postaram się też jeszcze zrobić coś sensownego z mapą. A tak poza tym jest OK.
Do zrobienia: zapomniałem o odczytywaniu wyjścia z mapy (teraz ma lokację wpisaną na stałe w kodzie). W przyszłości będzie tez trzeba odczytywać liczbę kamieni koniecznych do skończenia mapy (teraz konieczne są wszystkie). No i gra kończy się gratulacjami po przejściu jednego (jedynego) poziomu - trzeba dodać wczytywanie kolejnych z plików.
Wywaliłem też zmianę rozmiaru okna, aby nie walczyć z błędami w Windowsie. No i spróbowałem namalować ładniejsze kafelki (do ściany). Nie wiem, czy warto na to tracić czas (nie licząc niewątpliwego waloru edukacyjnego, lol).
Fizyka czasem ma problemy, ale wiem co jest nie tak - naprawię wszystko przy zabawie z kamieniami. To będzie kolejny krok. Potem już tylko upiększanie.
Źródła: https://rapidshare.com/files/460169323/Boulder_03_src.zip
Exe: https://rapidshare.com/files/460169371/Boulder_03.zip
Podobają mi się klasy GameIntro, Game, GameOver, choć trochę jeszcze je wygładzę, kamienie będą zrobione jak przeciwnicy lub wyjście, postaram się też jeszcze zrobić coś sensownego z mapą. A tak poza tym jest OK.
Do zrobienia: zapomniałem o odczytywaniu wyjścia z mapy (teraz ma lokację wpisaną na stałe w kodzie). W przyszłości będzie tez trzeba odczytywać liczbę kamieni koniecznych do skończenia mapy (teraz konieczne są wszystkie). No i gra kończy się gratulacjami po przejściu jednego (jedynego) poziomu - trzeba dodać wczytywanie kolejnych z plików.
Wywaliłem też zmianę rozmiaru okna, aby nie walczyć z błędami w Windowsie. No i spróbowałem namalować ładniejsze kafelki (do ściany). Nie wiem, czy warto na to tracić czas (nie licząc niewątpliwego waloru edukacyjnego, lol).
Fizyka czasem ma problemy, ale wiem co jest nie tak - naprawię wszystko przy zabawie z kamieniami. To będzie kolejny krok. Potem już tylko upiększanie.
Źródła: https://rapidshare.com/files/460169323/Boulder_03_src.zip
Exe: https://rapidshare.com/files/460169371/Boulder_03.zip
piątek, 29 kwietnia 2011
Boulder Dash - ciąg dalszy
Trochę się ociągałem z kolejnym etapem (brak czasu, a mówiąc dokładniej: Might and Magic 4, Borderlands, Savage Worlds), ale parę rzeczy udało mi się dodać.
Przede wszystkim - ruch "przeciwników". Było z tym więcej roboty, niż z kamieniami, choć wcześniej zdawało mi się, że będzie na odwrót. Przeciwnicy mogą być prawo- lub leworęczni (gdy napotkają ścianę, idą przy niej trzymając jej prawą lub lewą ręką). Jeszcze nie mogą zabić gracza, ani zginąć od kamienia, ale reagują na elementy otoczenia. Przeciwnicy są obiektami, zastanawiałem się, czy kamieni nie zrobić tak samo, ale nie widzę korzyści, które usprawiedliwiałyby poświęcanie na to dodatkowego czasu. I tak taki obiekt nie będzie zawierał wiele więcej ponad informację, że jest kamieniem, fizyka będzie wyglądać tak samo, a że powinna odbywać się "z dołu do góry" (przynajmniej na razie nie widzę innych możliwości), to będą musiały siedzieć w mapie zamiast znaków. Zobaczymy.
Kolejna zmiana to grafika. Wywaliłem te nieszczęsne procedury rysujące i zastąpiłem je obrazkami z pliku PNG. Na razie są niezbyt urodziwe (5 minut w GIMPie), ale mogą wypięknieć (w przypadku procedur byłoby to bolesne). Dałem też możliwość zmiany rozmiaru okna i parę skomplikowanych rachunków, które upewniają się, że zawsze widać tę część planszy, którą trzeba (jestem z tego szczególnie zadowolony - no a przynajmniej z tego jak to działa, bo co do wykonania, to żałuję że nie wpadłem na jakieś bardziej eleganckie rozwiązanie).
Doszła też interakcja gracza z kamieniami i klejnotami - zatrzymują mu się na głowie, kamienie może przesuwać (tylko w poziomie), a klejnoty zbierać. Ale jeszcze nie może zginąć. ;)
W związku z dodanymi elementami otoczenia, pojawiło się parę nowych literek w pliku mapy:
Przede wszystkim - ruch "przeciwników". Było z tym więcej roboty, niż z kamieniami, choć wcześniej zdawało mi się, że będzie na odwrót. Przeciwnicy mogą być prawo- lub leworęczni (gdy napotkają ścianę, idą przy niej trzymając jej prawą lub lewą ręką). Jeszcze nie mogą zabić gracza, ani zginąć od kamienia, ale reagują na elementy otoczenia. Przeciwnicy są obiektami, zastanawiałem się, czy kamieni nie zrobić tak samo, ale nie widzę korzyści, które usprawiedliwiałyby poświęcanie na to dodatkowego czasu. I tak taki obiekt nie będzie zawierał wiele więcej ponad informację, że jest kamieniem, fizyka będzie wyglądać tak samo, a że powinna odbywać się "z dołu do góry" (przynajmniej na razie nie widzę innych możliwości), to będą musiały siedzieć w mapie zamiast znaków. Zobaczymy.
Kolejna zmiana to grafika. Wywaliłem te nieszczęsne procedury rysujące i zastąpiłem je obrazkami z pliku PNG. Na razie są niezbyt urodziwe (5 minut w GIMPie), ale mogą wypięknieć (w przypadku procedur byłoby to bolesne). Dałem też możliwość zmiany rozmiaru okna i parę skomplikowanych rachunków, które upewniają się, że zawsze widać tę część planszy, którą trzeba (jestem z tego szczególnie zadowolony - no a przynajmniej z tego jak to działa, bo co do wykonania, to żałuję że nie wpadłem na jakieś bardziej eleganckie rozwiązanie).
Doszła też interakcja gracza z kamieniami i klejnotami - zatrzymują mu się na głowie, kamienie może przesuwać (tylko w poziomie), a klejnoty zbierać. Ale jeszcze nie może zginąć. ;)
W związku z dodanymi elementami otoczenia, pojawiło się parę nowych literek w pliku mapy:
- '$' to klejnot do zebrania
- '@' to początkowa pozycja gracza
- 'n', 'e', 's', 'w' - to przeciwnicy. Litera oznacza początkowy kierunek ruchu. Duży znak to stwor praworęczny, mały - leworęczny. Potwory w grze są reprezentowani przez te paskudne strzałki, aby było widać który gdzie jest zwrócony i której ściany się trzyma - ale pewnie zastąpię te wszystkie warianty jedną ikoną, tak samo jak u bohatera.
Do zrobienia: najważniejsze, co przychodzi mi do głowy, to punkty (za klejnoty), wyjście (czyli możliwość skończenia poziomu) no i oczywiście: "życia" (a zatem i możliwość zgonu). To chyba uczyni tę grę umiarkowanie grywalną, reszta to będą ozdobniki.
Zaobserwowane błędy: pod Windows 7 próba powiększenia okienka wywala aplikację (pod Windows XP i Ubuntu jest ok) - może to jakiś problem tej wersji Pygame, z której korzystam? Powalczę z tym później.
Zaobserwowane błędy: pod Windows 7 próba powiększenia okienka wywala aplikację (pod Windows XP i Ubuntu jest ok) - może to jakiś problem tej wersji Pygame, z której korzystam? Powalczę z tym później.
Subskrybuj:
Posty (Atom)