📄 donuts.c
字号:
event = TRUE;
}
if( input & KEY_DOWN )
{
DL.velx -= Dirx[(int)DL.frame] * 10.0/1000.0;
DL.vely -= Diry[(int)DL.frame] * 10.0/1000.0;
event = TRUE;
}
// setrate
if (event) {
UpdateEngineIdle();
}
if (event != lastThrust)
{
if (event)
{
input &= ~KEY_STOP;
if(bWantSound)
{
SndObjStop(hsoSkidToStop);
SndObjPlay(hsoEngineRev);
}
bPlayRev = TRUE;
}
else
{
if(bWantSound)
{
SndObjStop(hsoEngineRev);
}
bPlayRev = FALSE;
}
lastThrust = event;
}
if( input & KEY_STOP )
{
if(bWantSound)
{
if (DL.velx || DL.vely)
playPanned(hsoSkidToStop, &DL);
}
DL.velx = 0;
DL.vely = 0;
UpdateEngineIdle();
}
this = DL.next;
do
{
this->posx += this->velx * (double)tickDiff;
this->posy += this->vely * (double)tickDiff;
this->frame += this->delay * (double)tickDiff;
switch( this->type )
{
case OBJ_DONUT:
maxx = (double)MAX_DONUT_X;
maxy = (double)MAX_DONUT_Y;
maxframe = (double)MAX_DONUT_FRAME;
break;
case OBJ_PYRAMID:
maxx = (double)MAX_PYRAMID_X;
maxy = (double)MAX_PYRAMID_Y;
maxframe = (double)MAX_PYRAMID_FRAME;
break;
case OBJ_SPHERE:
maxx = (double)MAX_SPHERE_X;
maxy = (double)MAX_SPHERE_Y;
maxframe = (double)MAX_SPHERE_FRAME;
break;
case OBJ_CUBE:
maxx = (double)MAX_CUBE_X;
maxy = (double)MAX_CUBE_Y;
maxframe = (double)MAX_CUBE_FRAME;
break;
case OBJ_BULLET:
maxx = (double)MAX_BULLET_X;
maxy = (double)MAX_BULLET_Y;
maxframe = (double)MAX_BULLET_FRAME;
if( this->frame >= (double)MAX_BULLET_FRAME )
{
save = this;
this = this->next;
DeleteFromList( save );
continue;
}
break;
}
if( this != &DL )
{
if( this->posx > maxx )
{
this->posx = maxx;
this->velx = -this->velx;
}
else if ( this->posx < 0 )
{
this->posx =0;
this->velx = -this->velx;
}
if( this->posy > maxy )
{
this->posy = maxy;
this->vely = -this->vely;
}
else if ( this->posy < 0 )
{
this->posy =0;
this->vely = -this->vely;
}
if( this->frame >= maxframe )
{
this->frame -= maxframe;
}
this = this->next;
}
}
while( this != &DL );
}
BOOL isDisplayListEmpty( void )
{
LPDBLNODE ptr;
for(ptr=DL.next; ptr != &DL; ptr = ptr->next)
{
if(ptr->type != OBJ_BULLET)
return FALSE;
}
return TRUE;
}
void initShip( BOOL delay )
{
DL.posx = (double)(ScreenX/2-16); // center the ship
DL.posy = (double)(ScreenY/2-16);
DL.frame = 0.0;
if( bTest )
{
DL.velx = 0.25;
DL.vely = 0.5;
}
else
{
DL.velx = DL.vely = 0.0; // not moving
}
if( !bTest && delay ) {
showDelay = DEF_SHOW_DELAY;
}
else {
UpdateEngineIdle();
SndObjPlay(hsoEngineIdle);
}
}
void initLevel( int level )
{
int i;
// clear any stray bullets out of the display list
while( DL.next != &DL )
{
DeleteFromList( DL.next );
}
for(i=0; i<(2*level-1); i++)
{
addObject( OBJ_DONUT, -1.0, -1.0, -1.0, -1.0 );
}
initShip(TRUE);
}
void addObject( SHORT type, double x, double y, double vx, double vy )
{
LPDBLNODE new;
new = (LPDBLNODE) LocalAlloc( LPTR, sizeof( DBLNODE ) );
if( new == NULL)
return;
new->type = type;
switch( type )
{
case OBJ_DONUT:
if( x < 0.0) // no position specified?
{
new->posx = randDouble( 0.0, (double)MAX_DONUT_X );
new->posy = randDouble( 0.0, (double)MAX_DONUT_Y );
}
else
{
new->posx = x;
new->posy = y;
}
new->velx = randDouble( -50.0/1000.0, 50.0/1000.0 );
new->vely = randDouble( -50.0/1000.0, 50.0/1000.0 );
new->frame = randDouble( 0, 30 );
new->delay = 30.0*randDouble( 0.1, 0.4 )/1000.0;
new->surf = lpDonut;
linkObject( new );
break;
case OBJ_PYRAMID:
if( x < 0) // no position specified?
{
new->posx = randDouble( 0.0, (double)MAX_PYRAMID_X );
new->posy = randDouble( 0.0, (double)MAX_PYRAMID_Y );
}
else
{
new->posx = x;
new->posy = y;
}
new->velx = 1.5*randDouble( -50.0/1000.0, 50.0/1000.0 );
new->vely = 1.5*randDouble( -50.0/1000.0, 50.0/1000.0 );
new->frame = randDouble( 0, 30 );
new->delay = 40.0*randDouble( 0.3, 1.0 )/1000.0;
new->surf = lpPyramid;
linkObject( new );
break;
case OBJ_SPHERE:
if( x < 0) // no position specified?
{
new->posx = randDouble( 0.0, (double)MAX_SPHERE_X );
new->posy = randDouble( 0.0, (double)MAX_SPHERE_Y );
}
else
{
new->posx = x;
new->posy = y;
}
new->velx = 3.0*randDouble( -50.0/1000.0, 50.0/1000.0 );
new->vely = 3.0*randDouble( -50.0/1000.0, 50.0/1000.0 );
new->frame = randDouble( 0, 30 );
new->delay = 40.0*randDouble( 1.5, 2.0 )/1000.0;
new->surf = lpSphere;
linkObject( new );
break;
case OBJ_CUBE:
if( x < 0) // no position specified?
{
new->posx = randDouble( 0.0, (double)MAX_CUBE_X );
new->posy = randDouble( 0.0, (double)MAX_CUBE_Y );
}
else
{
new->posx = x;
new->posy = y;
}
new->velx = 4.0*randDouble( -50.0/1000.0, 50.0/1000.0 );
new->vely = 4.0*randDouble( -50.0/1000.0, 50.0/1000.0 );
new->frame = randDouble( 0, 30 );
new->delay = 40.0*randDouble( 0.8, 2.0 )/1000.0;
new->surf = lpCube;
linkObject( new );
break;
case OBJ_BULLET:
new->posx = x;
new->posy = y;
new->velx = vx;
new->vely = vy;
new->frame = 0.0;
new->delay = 1.0;
new->surf = lpNum;
linkObject( new );
break;
}
}
void linkObject( LPDBLNODE new )
{
new->next = DL.next;
new->prev = &DL;
DL.next->prev = new;
DL.next = new;
}
void linkLastObject( LPDBLNODE new )
{
new->prev = DL.prev;
new->next = &DL;
DL.prev->next = new;
DL.prev = new;
}
BOOL RestoreSurfaces( void )
{
HRESULT ddrval;
HBITMAP hbm;
ddrval = lpFrontBuffer->lpVtbl->Restore(lpFrontBuffer);
if( ddrval != DD_OK )
return FALSE;
ddrval = lpDonut->lpVtbl->Restore(lpDonut);
if( ddrval != DD_OK )
return FALSE;
ddrval = lpPyramid->lpVtbl->Restore(lpPyramid);
if( ddrval != DD_OK )
return FALSE;
ddrval = lpCube->lpVtbl->Restore(lpCube);
if( ddrval != DD_OK )
return FALSE;
ddrval = lpSphere->lpVtbl->Restore(lpSphere);
if( ddrval != DD_OK )
return FALSE;
ddrval = lpShip->lpVtbl->Restore(lpShip);
if( ddrval != DD_OK )
return FALSE;
ddrval = lpNum->lpVtbl->Restore(lpNum);
if( ddrval != DD_OK )
return FALSE;
hbm = (HBITMAP)LoadImage( hInst, TEXT("DONUTS8"), IMAGE_BITMAP, 0, 0, 0 );
if( NULL == hbm )
return FALSE;
ddrval = DDCopyBitmap( lpDonut, hbm, 0, 0, 320, 384 );
if( ddrval != DD_OK )
{
DeleteObject( hbm );
return FALSE;
}
ddrval = DDCopyBitmap( lpPyramid, hbm, 0, 384, 320, 128 );
if( ddrval != DD_OK )
{
DeleteObject( hbm );
return FALSE;
}
ddrval = DDCopyBitmap( lpSphere, hbm, 0, 512, 320, 32 );
if( ddrval != DD_OK )
{
DeleteObject( hbm );
return FALSE;
}
ddrval = DDCopyBitmap( lpCube, hbm, 0, 544, 320, 32 );
if( ddrval != DD_OK )
{
DeleteObject( hbm );
return FALSE;
}
ddrval = DDCopyBitmap( lpShip, hbm, 0, 576, 320, 256 );
if( ddrval != DD_OK )
{
DeleteObject( hbm );
return FALSE;
}
ddrval = DDCopyBitmap( lpNum, hbm, 0, 832, 320, 16 );
if( ddrval != DD_OK )
{
DeleteObject( hbm );
return FALSE;
}
DeleteObject( hbm );
if (bSingleBuffer)
{
// Set fill color to almost black. Black is used as the transparency color
// on lpBackBuffer.
dwFillColor = RGB(8,8,8);
}
else
{
dwFillColor = 0;
}
// Set the transparent color to black for each sprite
if (FAILED(DDSetColorKey(lpDonut, RGB(0,0,0))))
return FALSE;
if (FAILED(DDSetColorKey(lpPyramid, RGB(0,0,0))))
return FALSE;
if (FAILED(DDSetColorKey(lpCube, RGB(0,0,0))))
return FALSE;
if (FAILED(DDSetColorKey(lpSphere, RGB(0,0,0))))
return FALSE;
if (FAILED(DDSetColorKey(lpShip, RGB(0,0,0))))
return FALSE;
if (FAILED(DDSetColorKey(lpNum, RGB(0,0,0))))
return FALSE;
if (bSingleBuffer)
{
if (FAILED(DDSetColorKey(lpBackBuffer, RGB(0,0,0))))
return FALSE;
}
return TRUE;
}
int randInt( int low, int high )
{
int range = high - low;
int num = (int)(Random() % range);
return( num + low );
}
double randDouble( double low, double high )
{
double range = high - low;
double num = (double)(range * (double)Random()/0xFFFFFFFF);
return( num + low );
}
BOOL InitializeSound( void )
{
bSoundEnabled = FALSE;
if (!bWantSound) {
return TRUE;
}
hSoundDevice = SndCreateSndDevice(0);
if (hSoundDevice != NULL) {
hsoBeginLevel = SndObjCreate(hSoundDevice, hInst, TEXT("BeginLevel"), FALSE, 1);
hsoEngineIdle = SndObjCreate(hSoundDevice, hInst, TEXT("EngineIdle"), TRUE, 1);
hsoEngineRev = SndObjCreate(hSoundDevice, hInst, TEXT("EngineRev"), TRUE, 1);
hsoSkidToStop = SndObjCreate(hSoundDevice, hInst, TEXT("SkidToStop"), FALSE, 1);
hsoShieldBuzz = SndObjCreate(hSoundDevice, hInst, TEXT("ShieldBuzz"), TRUE, 1);
hsoShipExplode = SndObjCreate(hSoundDevice, hInst, TEXT("ShipExplode"), FALSE, 1);
hsoFireBullet = SndObjCreate(hSoundDevice, hInst, TEXT("Gunfire"), FALSE, 25);
hsoShipBounce = SndObjCreate(hSoundDevice, hInst, TEXT("ShipBounce"), FALSE, 4);
hsoDonutExplode = SndObjCreate(hSoundDevice, hInst, TEXT("DonutExplode"), FALSE, 10);
hsoPyramidExplode = SndObjCreate(hSoundDevice, hInst, TEXT("PyramidExplode"), FALSE, 12);
hsoCubeExplode = SndObjCreate(hSoundDevice, hInst, TEXT("CubeExplode"), FALSE, 15);
hsoSphereExplode = SndObjCreate(hSoundDevice, hInst, TEXT("SphereExplode"), FALSE, 10);
bSoundEnabled = TRUE;
}
return TRUE;
}
void DestroySound( void )
{
if (!bWantSound) {
return; //No work to be done
}
bSoundEnabled = FALSE;
if (hSoundDevice) {
SndObjDestroy(hsoBeginLevel);
hsoBeginLevel = NULL;
SndObjDestroy(hsoEngineIdle);
hsoEngineIdle = NULL;
SndObjDestroy(hsoEngineRev);
hsoEngineRev = NULL;
SndObjDestroy(hsoSkidToStop);
hsoSkidToStop = NULL;
SndObjDestroy(hsoShieldBuzz);
hsoShieldBuzz = NULL;
SndObjDestroy(hsoShipExplode);
hsoShipExplode = NULL;
SndObjDestroy(hsoFireBullet);
hsoFireBullet = NULL;
SndObjDestroy(hsoShipBounce);
hsoShipBounce = NULL;
SndObjDestroy(hsoDonutExplode);
hsoDonutExplode = NULL;
SndObjDestroy(hsoPyramidExplode);
hsoPyramidExplode = NULL;
SndObjDestroy(hsoCubeExplode);
hsoCubeExplode = NULL;
SndObjDestroy(hsoSphereExplode);
hsoSphereExplode = NULL;
SndObjCloseDevice(hSoundDevice);
hSoundDevice = NULL;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -