005
17.07.2002, 06:21 Uhr
Bruder Leif
dances with systems (Operator)
|
Moin!
*threadzuspätbemerkthab* Das könnt Ihr vergessen... mit BGI-Treibern kommt Ihr bei Demos nicht weit. Der Mode 13 ist gerade deshalb so beliebt, weil er so einfach DIREKT anzusteuern ist. Unter DOS, per direktem Zugriff auf den GraKa-Speicher. Dadurch ist man weder auf lahme BGIs noch auf die lahmen BIOS-Funktionen angewiesen ;-) Unter Windows wirst Du damit aber nicht allzu weit kommen, dort werden direkte Hardwarezugriffe abgeblockt. Warte mal, irgendwo hab ich noch ne kleine Demo rumliegen... *suchkramwühl* hier:
C++: |
#define BYTE unsigned char #define WORD unsigned short
#include <math.h>
BYTE bSin[1024]; BYTE bCos[1024];
void AddColor( BYTE bRed, BYTE bGreen, BYTE bBlue ) { asm mov dx, 0x3c9 asm mov al, bBlue asm out dx, al asm mov al, bGreen asm out dx, al asm mov al, bRed asm out dx, al }
void SetPalette( void ) { WORD wCounter;
asm mov dx, 0x3c8 asm xor al, al asm out dx, al /* for( wCounter = 0; wCounter <= 63; wCounter++ ) AddColor( 63-wCounter, 0, wCounter ); for( wCounter = 0; wCounter <= 63; wCounter++ ) AddColor( 0, wCounter/2, 63-(wCounter/2) ); for( wCounter = 0; wCounter <= 63; wCounter++ ) AddColor( wCounter, 31-(wCounter/2), 32+(wCounter/2) ); for( wCounter = 0; wCounter <= 63; wCounter++ ) AddColor( 63-wCounter, wCounter, 63-wCounter ); */
for( wCounter = 0; wCounter <= 63; wCounter++ ) AddColor( (63-wCounter)/2, 63-wCounter, wCounter ); for( wCounter = 0; wCounter <= 63; wCounter++ ) AddColor( wCounter/2, wCounter, 63-wCounter ); for( wCounter = 0; wCounter <= 63; wCounter++ ) AddColor( 31+(wCounter/2), 63-wCounter, wCounter ); for( wCounter = 0; wCounter <= 63; wCounter++ ) AddColor( 63-wCounter, wCounter, 63-wCounter ); }
void DrawPlasma( BYTE dx, BYTE dy ) { WORD x, y; BYTE bColor, bBuffer; BYTE bValue1, bValue2; WORD wOffset = 0;
for( y=0; y<=199; y++ ) { bBuffer = bSin[ ( y + dy ) ]; for( x=0; x<=319; x++ ) { bValue1 = x + bBuffer; bValue2 = y + bSin[ (x + dx) ]; bColor = ( bCos[ bValue1] + bCos[ bValue2 ] ) >> 1;
asm // PutPixel { mov di, wOffset mov ax, 0xa000 mov es, ax mov al, bColor stosb mov wOffset, di } } } }
void main( void ) { int iCounter, iDoIt;
for( iCounter=0; iCounter<1024; iCounter++ ) { bSin[ iCounter ] = 63 * ( sin( iCounter * 3.14159 / 128 ) + 1 ); bCos[ iCounter ] = 127 * ( cos( iCounter * 3.14159 / 128 ) + 1 ); }
asm mov ax, 0x13 asm int 0x10
SetPalette();
iDoIt = 1; while( iDoIt ) { DrawPlasma( iCounter, iCounter ); iCounter++;
asm { mov ah, 1 int 0x16 jz _Ja mov iDoIt, 0 jmp _Fertig _Ja: mov iDoIt, 1 _Fertig: // auf vert. Retrace warten mov dx, 0x3da _Retrace: in al, dx and al, 8 jz _Retrace } } asm mov ax, 0x03 asm int 0x10 }
|
Das ist ein einfaches Sinus-Plasma. Nicht besonders optimiert, Du kannst mit den Werten rumexperimentieren, bis es Dir gefällt. Wenn's sich überhaupt nich compilieren läßt... ich hab's damals mit einem Symantec-C-Compiler übersetzt.
Mit Spielen hab ich weniger Erfahrung... auf dem C64 hab ich Unmengen an Demos programmiert, da isset sowieso viel einfacher als auf dem PC ;-) Probiers einfach mal, mehr als dazulernen kannst Du nicht ;-)
Tschöööööööö
Leifus -- Mit 40 Fieber sitzt man nicht mehr vor dem PC. Man liegt im Bett. Mit dem Notebook. |