@teh_KaiN, post #1
z tego co zauważyłem, to graphics.library służy do wysokopoziomowego rysowania grafiki i właściwie nie pozwala na wykonywanie żadnych operacji sprzętowo, stąd można zapomnieć o robieniu poważniejszej gry pod tą biblioteką?
rozdzielczość 320 PAL/NTSC bez przeplotu, nic wyżej nie będzie potrzebne
będzie dość dużo sprite'ów, większość to tło, ze dwie postaci na ekranie, rzadko kiedy czymś przykrywane, ale jak już to raczej kształtem nie kwadratowym tylko czymś ażurowym. Blittowanie przez maskę będzie nieocenione
@Hextreme-Attic, post #2
@teh_KaiN, post #3
InitView( &view );
InitBitMap( &bitmap, DEPTH, 320, 256 ); for (i = 0; i < DEPTH; i++ ) bitmap.Planes[ i ] = AllocRaster( 320, 256 );
InitVPort( &vport ); vport.DxOffset = 0; vport.DyOffset = 0; vport.DWidth = 320; vport.DHeight = 256; vport.RasInfo = &rasinfo; vport.Next = NULL; view.ViewPort = &vport; rasinfo.BitMap = &bitmap; rasinfo.RxOffset = 0; rasinfo.RyOffset = 0; rasinfo.Next = NULL;
vport.ColorMap = GetColorMap( 1 << DEPTH );
MakeVPort( &view, &vport ); MrgCop( &view ); LoadView( &view ); WaitTOF();
/* Zwolnienie zasobów */ LoadView( NULL ); WaitTOF(); FreeCprList( view.LOFCprList ); FreeVPortCopLists( &vport ); FreeColorMap( vport.ColorMap ); for (i = 0; i < DEPTH; i++) FreeRaster( bitmap.Planes[ i ], 320, 256 );
@teh_KaiN, post #1
z tego co zauważyłem, to graphics.library służy do wysokopoziomowego rysowania grafiki i właściwie nie pozwala na wykonywanie żadnych operacji sprzętowo, stąd można zapomnieć o robieniu poważniejszej gry pod tą biblioteką?
jeśli nie korzystać z graphics.library to z czego? SDL i inne tego kalibru odpadają, nie po to piszę pod Ami żeby się w nienatywność bawić
Czy też trzeba zrobić jakiś chocek klocek żeby jechać bezpośrednio na sprzęcie? Ale jak? Są do tego jakieś logiczne zestawy funkcji pod C?
rozdzielczość 320 PAL/NTSC bez przeplotu, nic wyżej nie będzie potrzebne
dość dużo kolorów, prawdopodobnie skończy się potrzebą trybu EHB
będzie dość dużo sprite'ów
start z dyskietki, może być bez własnego bootblocka tylko DOS+startup-sequence
fajnie by było dać możliwość odpalania z dysku twardego pod WB.
fajnie by też było zrobić wyjście z gry do systemu operacyjnego
interesuje mnie przede wszystkim A500, kick 1.3.
Współpraca z kartami graficznymi nie jest ważna.
Zapał mam, skilla też, tylko może niekoniecznie amigowego.
6 lat programowania na różnych platformach już za mną
Potrzebuję tylko parę odpowiedzi i najlepiej paru krótkich, zwięzłych przykładów.
Zamieszczam to w dziale C, bo tego języka bym się chciał trzymać.
Wstawki asm tylko w newralgicznych punktach.
@cholok, post #7
@selur, post #9
@Hextreme-Attic, post #4
oldView = GfxBase->ActiView
/* Zwolnienie zasobów */ LoadView(oldView);
@teh_KaiN, post #11
@teh_KaiN, post #11
@asman, post #14
@teh_KaiN, post #15
@Hextreme-Attic, post #16
@teh_KaiN, post #17
@Hextreme-Attic, post #18
@gx, post #20
@teh_KaiN, post #19
@teh_KaiN, post #21
@teh_KaiN, post #19
#include <proto/exec.h> #include <proto/graphics.h> #include <hardware/custom.h> struct GfxBase* GfxBase; extern struct ExecBase* SysBase; static struct View* oldView = NULL; static UWORD oldIntena; static UWORD oldDmacon; static ULONG oldVertb; static ULONG oldPorts; void DisableOs { //otwarcie graphics library GfxBase = (struct GfxBase*)OpenLibrary("graphics.library",0); //zapamiętanie starego view ekranu oldView = GfxBase->ActiView; //zresetowanie ekranu LoadView(NULL); WaitTOF(); WaitTOF(); //wyłączenie multitaskingu Forbid(); //dostęp do blittera tylko dla naszego programu OwnBlitter(); //zapamiętanie rejestrów hardware oldIntena = custom.intenar | 0xc000; oldDmacon = custom.dmaconr | 0x8000; //zatrzymanie przerwań i dma custom.intena = 0x7fff; custom.dmacon = 0x7fff; custom.intreq = 0x7fff; } void EnableOs { //zatrzymanie przerwań i dma custom.intena = 0x7fff; custom.dmacon = 0x7fff; custom.intreq = 0x7fff; //odtworzenie przerwań i dma custom.dmacon = oldDmacon; custom.intena = oldIntena; //oddajemy blitter WaitBlit(); DissownBlitter(); //odtworzenie systemowej copperlisty custom.cop1lc = (ULONG)GfxBase->copinit; //załadowanie starego view LoadView(oldView) WaitTOF(); WaitTOF(); //włączamy multitasking Permit(); //zamykamy bibliotekę graphics CloseLibrary((struct Library*)GfxBase); }
@asman, post #24
Mając już ubity system i ekran zrestwoany właśnie do lowresu, możemy zająć się wyświetlaniem czarnego ekranu 320x256x5. Do tego celu w tym przypadku (kości OCS/ECS) najlepiej użyć zwyczajowego AllocMem z exec.library, można by użyć AllocRaster (który notabene to wywołuje AllocMem z atrybutami MEMF_CHIP i MEMF_PUBLIC bodajże) ale w naszym przypadku możemy dodatkowo poprosić o wyczyszczenie pamięci zadając MEMF_CLEAR.
@Hextreme-Attic, post #25
AllocRaster: BSR.S lbC0081BA MOVEQ #3,D1 ;MEMF_PUBLIC|MEMF_CHIP MOVE.L A6,-(SP) MOVEA.L 4.W,A6 JSR -$C6(A6) ;AllocMem z exec.library MOVEA.L (SP)+,A6 RTS
lbC0081BA: ADD.W #15,D0 ASR.W #3,D0 AND.W #$FFFE,D0 MULU.W D1,D0 RTS
@asman, post #26
Weźmy ekran 320x256x5 (szerokość x wysokość x ilośc bitplanów). W twoim przypadku alokujesz 5 razy bitmapę. I wtedy gdy chcemy skopiować blok 16x16x5 to musimy użyć 5 blitów by go skopiować. By użyć 5 blitów musimy 5 razy czekać aż blitter skończy poprzednią operację. Wygodniej i szybciej byłoby użyć tylko jednego blitu, nieprawdaż ? Według mnie najlepiej napisać własną funkcję alokującą bitmapę (MyAllocBitmap), zyskamy i prędkość i, elastyczność.
A to dlaczego, mógłbyś rozwinąć, dziękuje
Recepta jest skomplikowana, trzeba zainstalować handlery dla PORTS, COPER, VERTB, EXTER i to tylko po to by przejąć system (dla mnie to pisanie zbędnego kodu) i jak piszesz z możliwością korzystania z niego. Z drugiej strony piszesz że WaitTOF wtedy przestaje działać, to znaczy że jednak nie można korzystać z systemu, czy coś przeoczyłem ?
Bardzo mnie to ciekawi, w jaki sposób zasygnalizujesz nasz Task (w szczególności gdy wszystkie przerwania są przejęte powyższym sposobem), mógłbyś to bardziej szczegółowo opisać bądź podać przykład, dziękuje.
@teh_KaiN, post #21
CINIT(uCopList, NUMCOLORS); scanlines_per_color = screen->Height/NUMCOLORS; /* Load in each color. */ for (i=0; i<NUMCOLORS; i++) { CWAIT(uCopList, (i*scanlines_per_color), 0); CMOVE(uCopList, custom.color[0], spectrum[i]); }Wynika z tego, że CWAIT i CMOVE liczone są jako jedna instrukcja. O co chodzi? Jeżeli zlepek CWAIT i CMOVE jest liczony jako jedno, to ile instrukcji na liście zajmie zlepek CWAIT CMOVE CMOVE CMOVE?
@teh_KaiN, post #28
@cholok, post #29