Moja przygoda tworzenia gry na konsolę 3ds

Jak to jest, że starsze konsole nadal mają nadal wsparcie od domowych twórców. Mimo że oficjalnie już nie są wspierane. Jak dać drugie życie takim konsolom, aby połączyć przyjemne z pożytecznym.

Konsole nintendo 2ds i 3ds
Górny wiersz: 3ds xl | new 2ds xl, dolny wiersz: new 3ds | 3ds

Najpierw jeden akapit historii, konsole z rodziny (new) 3ds, takie jak 3ds, 3ds xl, new 3ds xl, 2ds, new 2ds xl, już istnieją na rynku od 2010 roku. Dużą zaletą ich jest wsteczna kompatybilność z grami z jeszcze starszej generacji Nintendo DS (Dual Screen). Seria 3ds, jak sama nazwa wskazuje, charakteryzuje się efektem 3d bez okularów, trzeba go zobaczyć na własne oczy, aby uwierzyć w jego magię. W sumie sprzedano ponad 75 milionów sztuk konsoli tej serii[1]. Mimo że oficjalny sklep internetowy został zamknięty w pierwszej połowie 2023, dzięki znalezionym lukom można uruchamiać aplikacje Homebrew (jak zmodyfikować własną konsolę, aby pozwalała na uruchamianie niepodpisanych programów: https://3ds.hacks.guide/). Wraz z tą modyfikacją dostajemy do dużego zaplecza aplikacji stworzonych przez entuzjastów (kiedyś się spotkałem z określeniem “niedzielnymi programistami”), często ukazują całe możliwości konsoli. Mimo że konsola nie posiada niesamowicie dużej mocy jak ówczesna konkurencja (PS Vita) obecnie można uznać, że osiągnęła duży sukces.

Patrząc, że często konsole Nintendo (i nie tylko) są programowane w języku C/C++ stwierdziłem, że fajnie byłoby spróbować napisać własną grę. Prosty pomysł przyszedł mi na grę, kółko i krzyżyk na 2 konsole, 3ds`y mają możliwość łączenia się do sieci internet jak i możliwość gry lokalnej bezprzewodowej, a w przyszłości, aby była możliwość gry cross-platform pomiędzy 3ds i ps vita (w niedalekiej przyszłości będzie podobny wpis).

Mam już, co chcę zrobić, teraz trzeba znaleźć jak. Zaletą wykonania modyfikacji jest to, że cały kod jest open source, w tym aplikacje, które instaluje się w późniejszych etapach na konsoli. Przeglądając ich kod, zauważyłem powtarzające się dwa programy: citro2d/citro3d i devkitPro. Czytając o nich, okazało się, że drugi to program do kompilacji programów na różne konsole (będzie łatwo przenosić gry na inne konsole), a pierwszy jest biblioteką do wyświetlania grafik/tekstów. Czyli strzał w dziesiątkę w wyborze oprogramowania.

Teraz pierwsze zderzenie z rzeczywistością, mimo że kod na tradycyjne Hello World wygląda następująco w języku C:

#include <3ds.h>
#include <stdio.h>
int main(int argc, char **argv)
{
	gfxInitDefault();
	consoleInit(GFX_TOP, NULL);
	printf("\x1b[16;20HHello World");
	while (aptMainLoop())
	{
		hidScanInput();
		u32 kDown = hidKeysDown();
		if (kDown & KEY_START) break;
		gfxFlushBuffers();
		gfxSwapBuffers();
		gspWaitForVBlank();
	}
	gfxExit();
	return 0;
}

Mamy 2 biblioteki, funkcję główną jak w każdym programie C/C++ i mamy już to, co charakteryzuje programowanie na 3ds. Inicjujemy ekran górny i wypisujemy w 16 wierszu i 20 kolumnie Hello World. Następnie z dokumentacji jest to główna pętla działania programu, w której najpierw zezwalamy na odczyt przycisków i następnie czytamy czy i jaki klawisz jest naciśnięty (tutaj start), aby wyjść z programu. Później mamy wyczyszczenie pamięci podręcznej i odczekanie na kolejną pętlę. Od razu zaznaczam, że jest to pewne uproszczenie dla osób mniej technicznych, ale oddaje w większości co robi ten fragment kodu.

Mamy fragment kodu, ale teraz jak go uruchomić (dla tych, co nie mają konsoli jest bardzo dobry emulator Citra), trzeba mieć jakiś plik wykonywalny. Do tego będzie potrzebne DeviktPro w wersji devkitArm, po instrukcję jak go zainstalować polecam wpisać w google DeviktARM 3ds [System], ponieważ jest ten program jeszcze rozwijany, ponieważ nadal pozwala na najnowsze konsole tworzyć aplikacje i gry (nawet na Switch`a).

Teraz mając już devikt zainstalowany, potrzeba była utworzenia pliku Makefile, tutaj akurat było łatwiej, ponieważ wystarczył plik z przykładów, do zastosowań początkujących okazał się wystarczający (źródło pliku z github) i umieszczenie kodu w pliku source. Teraz tylko w terminalu uruchomić make i mamy pliki .3dsx, on nie jest “instalowalny”, ale już możemy uruchomić aplikację na konsoli lub emulatorze.

Pierwszy sukces, jest na górnym ekranie cudowne Hello World, ile to razy programista zobaczy, ile czasem z nim się namęczy, ale gdy pierwszy raz się wyświetli wewnętrzny sukces jest nieoceniony.

To teraz trzeba jakoś linie narysować, pierwsza rzecz jaka przyszła, to że każdy znak ma stałą szerokość, więc zrobienie coś na wzór:

X | X | X
----------
X | X | X
----------
X | X | X

Zapisywanie w pamięci pozycji też nie będzie ciężkie, bo tutaj mamy tablicę 0-8 (9 pól) i wystarczą 3 stany, brak/X/O. Tylko trzeba jakoś stwierdzić jakie miejsce chce gracz nacisnąć. Więc stwierdziłem, że łatwiej będzie sprawdzanie przedziałów dotknięcia dolnego ekranu, tylko jak to zrobić, wiedząc, że mam przykłady na github poszukałem jakiegoś, który by wypisywał miejsce dotknięcia i udało się znaleźć (github). Okazało się to łatwiejsze, niż sądziłem, ale to dzięki bibliotekom napisanym przez innych entuzjastów. Teraz tylko podzielić dolny ekran i dać odpowiednią reakcję na to. Choć teraz pisząc ten wpis, przyszedł jeszcze pomysł, aby zrobić na zasadzie wskaźnika pozycji i potem czytając którą strzałkę naciśnięto odpowiednio ją zmieniać, ale nauka jak działa ekran dotykowy, wydaje mi się lepsze.

Wypisywanie koordynator dotknięcia ekranu dolnego
Demo tekstowe + dotknięcia

A teraz trzeba to zrobić ładniejsze i tutaj wchodzi biblioteka citro2d i citro3d (obie są wspólnie zależne od siebie). Pierwszym mankamentem było jak to zrobić, aby ładnie wyglądało. Pomysłem było stworzenie planszy na górnym ekranie i po boku jego dodać dodatkowe informacje, to jeszcze było proste wraz z dokumentacją biblioteki, kilka linii poprowadzić i tyle. Otóż nie. Okazało się, że na raz nie może działać biblioteka i wypisywanie tekstów z programu Hello World oraz inaczej deklarować dane kwestie/funkcje. Drugą kwestią wprowadzającą w błąd było to, że niektóre jeszcze istniejące poradniki w internecie korzystały z mocno przestarzałych rzeczy. Tutaj przyszła myśl, aby skorzystać z ChatGPT i BingAI, po to istnieją, aby pomagać, tylko niestety obie AI uczyły się właśnie z tych przestarzałych stron. Cóż więc wracamy do przykładów i surowej dokumentacji. Pierwszą rzeczą, która nagle się rzuciła w oczy, że do Makefile trzeba było dodać odwołania do biblioteki, teraz się uruchamiała aplikacja, ale czarny ekran nadal, a później jeszcze zauważyłem, że są dodatkowe deklaracje procedur i funkcji, które myślałem, że są nie potrzebne, albo do czegoś innego.

O tyle fajnie jest, że w przypadku kształtów podajemy punkt startowy i końcowy (linia punkty AB, kwadrat to przekątne, a koło — średnicę, jedynie elipsa i trójkąty wymagają więcej danych).

Pierwszy graficzny efekt

Udało się przejść przez pierwsze problemy i teraz tylko trzeba przenieść klikanie danych pól, aby wyświetlać dane efekty. Na chwilę obecną mam zrobione dla X jako dwie przecinające się linie, a kółka średnicę. Jedynie, aby sobie ułatwić, zrobiłem funkcję przyjmujące które pole i jaki kształt. Następnie odpowiednie funkcje rysujące o danych współrzędnych.

Jeszcze dla siebie samego dorobiłem liczenie ilości wygranych danego gracza i ekran wygranej (po nim nacisnąć trzeba A)

Dla chętnych, którzy chcą spróbować mój kod na konsoli lub w emulatorze, znajdziecie go na moim serwisie Git. Jest to około 300 linijkowy kod C++, do którego co jakiś czas wracam w ramach odskoczni od codziennych prac (taki niedzielny programista)

Link do git`a: https://git.kry008.xyz/kry008/XO-game

Link do pobrania plików 3dsx: https://git.kry008.xyz/kry008/XO-game/releases

Ewentualne lustrzane źródło: Github i do pobrania


Jeżeli dotarłeś/aś aż tutaj chciałbym cię poprosić, jeżeli możesz o skorzystanie z tych linków afiliacyjnych, ty zapewne dostaniesz jakiś początkowy prezent, a ja kilka groszy prowizji, które pomogą rozwijać moje projekty.

MikrUS, tanie serwery VPS – https://mikr.us/?r=8dd1999d (nawet klikając, bez kupowania, pomagasz)

Polecając Mikrusa innym, zyskujesz 2 miesiące usługi za darmo.
Osoba, która skorzysta z linka dostaje 1 miesiąc usługi gratis.

LetyShops – https://letyshops.com/pl/winwin?ww=22086420

Aby bonus został Ci przyznany, osoba, która zarejestrowała się z Twojego linku, musi dokonać zakupów na kwotę minimum 70,00 zł w ciągu 30 dni od rejestracji na LetyShops. Jak tylko cashback za te zakupy zostanie potwierdzony oboje/obie otrzymacie 10,00 zł.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *