@pong777, post #1
@pong777, post #1
@Hexmage960, post #4
@pong777, post #1
Super jeśli byłby pełny support dla ECS/AGA/RTG.
@Krashan, post #5
@Hexmage960, post #9
@teh_KaiN, post #10
@pong777, post #12
int main(void) {
logOpen(); // odpal menedżer logów
randInit(0); // odpal generator liczb losowych (seed = 0)
inputOpen(); // odpal menedżer inputa (nasłuchiwanie klawy, dżojów, myszy)
windowCreate(); // zrób mi screen oraz okno, które przesłania cały ekran, co bym mógł przechwytywać mysz i klawiaturę nie brudząc niczego w systemie działającym w tle
loadCursorData(); // własna funkcja, wczytuje dane kursora z pliku
gameChangeState(gsMenuCreate, gsMenuSplashSetup, gsMenuDestroy); // zacznij od gameState'a MENU
// tu już gra jest otwarta i sobie leci w kółko
while (gameIsRunning()) { // pętla gry
timerProcess(); // pyknij timery do przodu
inputProcess(); // odśwież stan wciśnięcia klawiszy, myszy, dżojów, itd.
gameProcess(); // wykonaj przebieg pętli z aktualnego gamestate'a
}
// tu już gra się zamyka
gameChangeState(0, 0, 0); // wyjdź z jakiegokolwiek gamestate'a
windowDestroy(); // zniszcz ekran
inputClose(); // zamknij nasłuchiwanie inputa
logClose(); // wyłącz menedżer logów
return EXIT_SUCCESS; // koniec programu
}void gsMenuCreate(void) {
logWrite("gsMenuCreate begin\n"); // wpis w logu, co by to debugować
logPushIndent(); // wcięcie w logu, co by widzieć, że ta część loga należy do menu
g_pExtView = extViewCreate( // tworzenie ekranu 320x256: pierwszy viewport na cały ekran i z pełnym bpp, drugiego viewporta nie ma (wewnątrz gry jest nim zrobiony HUD)
WINDOW_SCREEN_WIDTH, WINDOW_SCREEN_HEIGHT,
WINDOW_SCREEN_WIDTH, WINDOW_SCREEN_HEIGHT, WINDOW_SCREEN_BPP,
0, 0, 0,
0
);
createFilePalette("data/palettes/selur_v1.plt", g_sWindowManager.pPalette); // wczytanie palety kolorów z pliku i ustawienie jako bieżącej
g_pSplashBitMap = bitmapCreateFromFile("data/bitmaps/splash.bm"); // bitmapa splash screena
g_pCharactersBitMap = bitmapCreateFromFile("data/bitmaps/goblins.bm"); // bitmapa portretów postaci
g_pGrassBitMap = bitmapCreateFromFile("data/bitmaps/grass.bm"); // bitmapa trawy w tle
g_pFont = fontCreate("data/fonts/arpegius-15.fnt"); // wczytanie fonta z pliku
if (!g_sGameConfig.ubPawnCount) { // logika gry, nieistotne
g_sGameConfig.ubPawnCount = 8;
}
windowLoadExtView(g_pExtView); // załadowanie wcześniej utworzonego viewa z viewportami
logPopIndent(); // zmniejsz wcięcie w logu
logWrite("gsMenuCreate end\n"); // kolejny wpis w logu
}void gsMenuDestroy(void) {
logWrite("gsMenuDestroy begin\n"); // znowu to samo z dziennikiem
logPushIndent();
LoadView(0); // schowanie ekranu co by go spokojnie usunąć
fontDestroy(g_pFont); // zwolnij fonta
bitmapDestroy(g_pCharactersBitMap); // zwolnij bitmapy
bitmapDestroy(g_pGrassBitMap);
bitmapDestroy(g_pSplashBitMap);
extViewDestroy(g_pExtView); // zwolnij ekran z viewportami i bufferami
logPopIndent();
logWrite("gsMenuDestroy end\n");
}void gsMenuLoop(void) {
// Nie wywalać eskejpa, bo fajnie działa, my się przyzwyczailiśmy, to gracze też się przyzwyczają
if (keyUse(KEY_ESCAPE)) {
gameClose();
return;
}
// steruje port 2 bo osoby grające na singla ZAWSZE mają wpiętą mychę w port 1
else if ((joyUse(JOY1_DOWN) || keyUse(KEY_DOWN)) && (g_pMainMenuList->ubActiveOption < (g_pMainMenuList->ubLength - 1))) {
++g_pMainMenuList->ubActiveOption;
gsMenuDrawMenuList(g_pExtView, g_pMainMenuList, g_pFontAlagard, (WINDOW_SCREEN_WIDTH >> 1), MENULIST_Y, FONT_CENTER | FONT_COOKIE);
}
else if ((joyUse(JOY1_UP) || keyUse(KEY_UP)) && g_pMainMenuList->ubActiveOption) {
--g_pMainMenuList->ubActiveOption;
gsMenuDrawMenuList(g_pExtView, g_pMainMenuList, g_pFontAlagard, (WINDOW_SCREEN_WIDTH >> 1), MENULIST_Y, FONT_CENTER | FONT_COOKIE);
}
else if (joyUse(JOY1_FIRE) || keyUse(KEY_RETURN)) {
g_pMainMenuList->pOptions[g_pMainMenuList->ubActiveOption].pAction();
}
if (timerCheck(&g_ulLogoTimer, 1)) {
animateMenuCopperList(g_pCopList);
}
// Pulsowanie wybranej pozycji - kod własny
// ...
}@wali7, post #14
void windowSeekUCopList(struct UCopList *pUCopList, WORD wOffset, UBYTE ubFlags) {
if (ubFlags & CPR_SEEK_SET) {
pUCopList->CopList->Count = wOffset;
} else if (ubFlags & CPR_SEEK_END) {
pUCopList->CopList->Count = pUCopList->CopList->MaxCount+wOffset;
} else { // CPR_SEEK_CUR
pUCopList->CopList->Count += wOffset;
}
pUCopList->CopList->CopPtr = pUCopList->CopList->CopIns + (sizeof(struct CopIns) * pUCopList->CopList->Count);
}