📄 demo.c
字号:
putpixel(bmp, x, y, 15-(int)star[c].z);
if (animation_type == DIRTY_RECTANGLE)
add_to_list(&dirty, x, y, 1, 1);
}
/* draw the player */
x = pos>>SPEED_SHIFT;
if ((ship_burn) && (ship_state < EXPLODE_FLAG)) {
spr = (RLE_SPRITE *)data[ENGINE1+(retrace_count/4)%7].dat;
draw_rle_sprite(bmp, spr, x-spr->w/2, SCREEN_H-24);
if (animation_type == DIRTY_RECTANGLE)
add_to_list(&dirty, x-spr->w/2, SCREEN_H-24, spr->w, spr->h);
}
if (ship_state >= EXPLODE_FLAG)
spr = explosion[ship_state-EXPLODE_FLAG];
else
spr = (RLE_SPRITE *)data[ship_state].dat;
draw_rle_sprite(bmp, spr, x-spr->w/2, SCREEN_H-42-spr->h/2);
if (animation_type == DIRTY_RECTANGLE)
add_to_list(&dirty, x-spr->w/2, SCREEN_H-42-spr->h/2, spr->w, spr->h);
/* draw the aliens */
for (c=0; c<alien_count; c++) {
x = alien[c].x;
y = alien[c].y;
if (alien[c].state >= EXPLODE_FLAG) {
spr = explosion[alien[c].state-EXPLODE_FLAG];
}
else {
switch (c%3) {
case 0: i = ASTA01; break;
case 1: i = ASTB01; break;
case 2: i = ASTC01; break;
default: i = 0; break;
}
j = (retrace_count/(6-(c&3))+c)%15;
if (c&1)
spr = (RLE_SPRITE *)data[i+14-j].dat;
else
spr = (RLE_SPRITE *)data[i+j].dat;
}
draw_rle_sprite(bmp, spr, x-spr->w/2, y-spr->h/2);
if (animation_type == DIRTY_RECTANGLE)
add_to_list(&dirty, x-spr->h/2, y-spr->h/2, spr->w, spr->h);
}
/* draw the bullet */
if (bullet_flag) {
x = bullet_x;
y = bullet_y;
spr = (RLE_SPRITE *)data[ROCKET].dat;
draw_rle_sprite(bmp, spr, x-spr->w/2, y-spr->h/2);
if (animation_type == DIRTY_RECTANGLE)
add_to_list(&dirty, x-spr->w/2, y-spr->h/2, spr->w, spr->h);
}
/* draw the score and fps information */
if (fps)
sprintf(score_buf, "Score: %ld - (%s, %ld fps)", (long)score,
animation_type_str, (long)fps);
else
sprintf(score_buf, "Score: %ld", (long)score);
textout(bmp, font, score_buf, 0, 0, 7);
if (animation_type == DIRTY_RECTANGLE)
add_to_list(&dirty, 0, 0, text_length(font, score_buf), 8);
if (animation_type == DOUBLE_BUFFER) {
/* when double buffering, just copy the memory bitmap to the screen */
blit(s, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
}
else if ((animation_type == PAGE_FLIP) || (animation_type == RETRACE_FLIP)) {
/* for page flipping we scroll to display the image */
scroll_screen(0, (current_page==0) ? 0: SCREEN_H);
}
else if (animation_type == TRIPLE_BUFFER) {
/* make sure the last flip request has actually happened */
do {
} while (poll_scroll());
/* post a request to display the page we just drew */
request_scroll(0, current_page * SCREEN_H);
}
else {
/* for dirty rectangle animation, only copy the areas that changed */
for (c=0; c<dirty.count; c++)
add_to_list(&old_dirty, dirty.rect[c].x, dirty.rect[c].y,
dirty.rect[c].w, dirty.rect[c].h);
/* sorting the objects really cuts down on bank switching */
if (!gfx_driver->linear)
qsort(old_dirty.rect, old_dirty.count, sizeof(RECT), rect_cmp);
for (c=0; c<old_dirty.count; c++) {
if ((old_dirty.rect[c].w == 1) && (old_dirty.rect[c].h == 1))
putpixel(screen, old_dirty.rect[c].x, old_dirty.rect[c].y,
getpixel(bmp, old_dirty.rect[c].x, old_dirty.rect[c].y));
else
blit(bmp, screen, old_dirty.rect[c].x, old_dirty.rect[c].y,
old_dirty.rect[c].x, old_dirty.rect[c].y,
old_dirty.rect[c].w, old_dirty.rect[c].h);
}
}
}
volatile int scroll_count;
void scroll_counter()
{
scroll_count++;
}
END_OF_FUNCTION(scroll_counter);
void draw_intro_item(int item, int size)
{
BITMAP *b = (BITMAP *)data[item].dat;
int w = MIN(SCREEN_W, (SCREEN_W * 2 / size));
int h = SCREEN_H / size;
clear(screen);
stretch_blit(b, screen, 0, 0, b->w, b->h, (SCREEN_W-w)/2, (SCREEN_H-h)/2, w, h);
}
int fade_intro_item(int music_pos, int fade_speed)
{
while (midi_pos < music_pos) {
if (keypressed())
return TRUE;
poll_joystick();
if ((joy[0].button[0].b) || (joy[0].button[1].b))
return TRUE;
}
set_pallete(data[GAME_PAL].dat);
fade_out(fade_speed);
return FALSE;
}
void play_game()
{
int c;
BITMAP *b, *b2;
int esc = FALSE;
stop_midi();
/* set up a load of globals */
dead = shot = FALSE;
pos = (SCREEN_W/2)<<SPEED_SHIFT;
xspeed = yspeed = ycounter = 0;
ship_state = SHIP3;
ship_burn = FALSE;
frame_count = fps = 0;
bullet_flag = FALSE;
score = 0;
old_dirty.count = dirty.count = 0;
skip_count = 0;
if (SCREEN_W < 400)
skip_speed = 0;
else if (SCREEN_W < 700)
skip_speed = 1;
else if (SCREEN_W < 1000)
skip_speed = 2;
else
skip_speed = 3;
for (c=0; c<MAX_STARS; c++) {
star[c].ox = random() % SCREEN_W;
star[c].oy = random() % SCREEN_H;
star[c].z = random() & 7;
}
for (c=0; c<MAX_ALIENS; c++) {
alien[c].x = 16 + random() % (SCREEN_W-32);
alien[c].y = -60 - (random() & 0x3f);
alien[c].d = (random()&1) ? 1 : -1;
alien[c].state = -1;
alien[c].shot = FALSE;
}
alien_count = 2;
new_alien_count = 0;
/* introduction synced to the music */
draw_intro_item(INTRO_BMP_1, 5);
play_midi(data[GAME_MUSIC].dat, TRUE);
clear_keybuf();
if (fade_intro_item(-1, 2))
goto skip;
draw_intro_item(INTRO_BMP_2, 4);
if (fade_intro_item(5, 2))
goto skip;
draw_intro_item(INTRO_BMP_3, 3);
if (fade_intro_item(9, 4))
goto skip;
draw_intro_item(INTRO_BMP_4, 2);
if (fade_intro_item(11, 4))
goto skip;
draw_intro_item(GO_BMP, 1);
if (fade_intro_item(13, 16))
goto skip;
if (fade_intro_item(14, 16))
goto skip;
if (fade_intro_item(15, 16))
goto skip;
if (fade_intro_item(16, 16))
goto skip;
skip:
text_mode(0);
clear(screen);
clear(s);
draw_screen();
if ((!keypressed()) && (!joy[0].button[0].b) && (!joy[0].button[1].b)) {
do {
} while (midi_pos < 17);
}
clear_keybuf();
set_pallete(data[GAME_PAL].dat);
position_mouse(SCREEN_W/2, SCREEN_H/2);
/* set up the interrupt routines... */
install_int(fps_proc, 1000);
if (use_retrace_proc)
retrace_proc = game_timer;
else
install_int(game_timer, 6400/SCREEN_W);
game_time = 0;
/* main game loop */
while (!dead) {
poll_joystick();
while (game_time > 0) {
move_everyone();
game_time--;
}
draw_screen();
frame_count++;
if (key[KEY_ESC])
esc = dead = TRUE;
}
/* cleanup, display score, etc */
remove_int(fps_proc);
if (use_retrace_proc)
retrace_proc = NULL;
else
remove_int(game_timer);
stop_sample(data[ENGINE_SPL].dat);
if (esc) {
while (current_page != 0)
draw_screen();
do {
} while (key[KEY_ESC]);
fade_out(5);
return;
}
fps = 0;
draw_screen();
if ((animation_type == PAGE_FLIP) || (animation_type == RETRACE_FLIP) ||
(animation_type == TRIPLE_BUFFER)) {
while (current_page != 0)
draw_screen();
blit(screen, s, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
}
b = create_bitmap(160, 160);
b2 = create_bitmap(160, 160);
clear(b);
textout_centre(b, data[END_FONT].dat, "GAME OVER", 80, 50, 2);
textout_centre(b, data[END_FONT].dat, score_buf, 80, 82, 2);
clear_keybuf();
scroll_count = -160;
c = 0;
install_int(scroll_counter, 6000/SCREEN_W);
while ((!keypressed()) && (!joy[0].button[0].b) && (!joy[0].button[1].b)) {
if (scroll_count > c+8)
c = scroll_count = c+8;
else
c = scroll_count;
blit(s, b2, c, c, 0, 0, 160, 160);
rotate_sprite(b2, b, 0, 0, itofix(c)/4);
blit(b2, screen, 0, 0, c, c, 160, 160);
if ((c > SCREEN_W) || (c > SCREEN_H))
scroll_count = -160;
poll_joystick();
}
remove_int(scroll_counter);
destroy_bitmap(b);
destroy_bitmap(b2);
clear_keybuf();
fade_out(5);
}
void generate_explosions()
{
BITMAP *bmp = create_bitmap(EXPLODE_SIZE, EXPLODE_SIZE);
unsigned char *p;
int c, c2;
int x, y;
int xx, yy;
int color;
#define HOTSPOTS 64
struct HOTSPOT
{
int x, y;
int xc, yc;
} hot[HOTSPOTS];
for (c=0; c<HOTSPOTS; c++) {
hot[c].x = hot[c].y = (EXPLODE_SIZE/2)<<16;
hot[c].xc = (random()&0xFFFF)-0x7FFF;
hot[c].yc = (random()&0xFFFF)-0x7FFF;
}
for (c=0; c<EXPLODE_FRAMES; c++) {
clear(bmp);
color = ((c<16) ? c*4 : (80-c)) >> 2;
for (c2=0; c2<HOTSPOTS; c2++) {
for (x=-6; x<=6; x++) {
for (y=-6; y<=6; y++) {
xx = (hot[c2].x>>16) + x;
yy = (hot[c2].y>>16) + y;
if ((xx>0) && (yy>0) && (xx<EXPLODE_SIZE) && (yy<EXPLODE_SIZE)) {
p = bmp->line[yy] + xx;
*p += (color >> ((ABS(x)+ABS(y))/3));
if (*p > 63)
*p = 63;
}
}
}
hot[c2].x += hot[c2].xc;
hot[c2].y += hot[c2].yc;
}
for (x=0; x<EXPLODE_SIZE; x++) {
for (y=0; y<EXPLODE_SIZE; y++) {
c2 = bmp->line[y][x];
if (c2 < 8)
bmp->line[y][x] = 0;
else
bmp->line[y][x] = 16+c2/4;
}
}
explosion[c] = get_rle_sprite(bmp);
}
destroy_bitmap(bmp);
}
int title_screen()
{
static int color = 0;
int c, c2;
fixed x, y;
int ix, iy;
int star_count = 0;
int star_count_count = 0;
RGB rgb;
char buf[2] = " ";
int text_char = 0xFFFF;
int text_width = 0;
int text_pix = 0;
BITMAP *text_bmp;
play_midi(data[TITLE_MUSIC].dat, TRUE);
play_sample(data[WELCOME_SPL].dat, 255, 127, 1000, FALSE);
for (c=0; c<MAX_STARS; c++) {
star[c].z = 0;
star[c].ox = star[c].oy = -1;
}
for (c=0; c<8; c++)
title_pallete[c] = ((RGB *)data[TITLE_PAL].dat)[c];
/* set up the colors differently each time we display the title screen */
for (c=8; c<PAL_SIZE/2; c++) {
rgb = ((RGB *)data[TITLE_PAL].dat)[c];
switch (color) {
case 0:
rgb.b = rgb.r;
rgb.r = 0;
break;
case 1:
rgb.g = rgb.r;
rgb.r = 0;
break;
case 3:
rgb.g = rgb.r;
break;
}
title_pallete[c] = rgb;
}
for (c=PAL_SIZE/2; c<PAL_SIZE; c++)
title_pallete[c] = ((RGB *)data[TITLE_PAL].dat)[c];
color++;
if (color > 3)
color = 0;
text_bmp = create_bitmap(SCREEN_W, 24);
clear(text_bmp);
clear(screen);
set_pallete(title_pallete);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -