125 lines
3.8 KiB
C
125 lines
3.8 KiB
C
/***************************************************************************
|
|
shine.c - description
|
|
-------------------
|
|
begin : Thu Sep 13 2001
|
|
copyright : (C) 2001 by Michael Speck
|
|
email : kulkanie@gmx.net
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* This program is free software; you can redistribute it and/or modify *
|
|
* it under the terms of the GNU General Public License as published by *
|
|
* the Free Software Foundation; either version 2 of the License, or *
|
|
* (at your option) any later version. *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
#include "lbreakout.h"
|
|
#include "config.h"
|
|
|
|
extern SDL_Surface *stk_display;
|
|
extern Config config;
|
|
extern SDL_Surface *offscreen;
|
|
extern SDL_Surface *shine_pic;
|
|
extern Game *game;
|
|
float shine_change = 0.020; /* per ms */
|
|
int shine_frame = 6; /* maximum frame */
|
|
float shine_cur = 0; /* current frame */
|
|
int shine_x, shine_y; /* position where current shine is drawn */
|
|
int shine_recreate = 1;
|
|
Delay shine_delay; /* delay between shines */
|
|
|
|
/*
|
|
====================================================================
|
|
Load/delete resources
|
|
====================================================================
|
|
*/
|
|
void shine_load()
|
|
{
|
|
delay_set( &shine_delay, 200 );
|
|
}
|
|
void shine_delete()
|
|
{
|
|
}
|
|
/*
|
|
====================================================================
|
|
Recreate shine on a random but valid brick
|
|
====================================================================
|
|
*/
|
|
void shine_create()
|
|
{
|
|
int x_add, y_add, x, y;
|
|
shine_cur = 0;
|
|
shine_x = 0; shine_y = 0;
|
|
|
|
if ( !config.anim ) return;
|
|
|
|
x = (rand() % (BRICK_WIDTH - 2)) + 1;
|
|
y = (rand() % (BRICK_HEIGHT - 2)) + 1;
|
|
x_add = rand() % 2 == 0 ? 1 : -1;
|
|
y_add = rand() % 2 == 0 ? 1 : -1;
|
|
|
|
while (x > 0 && x < MAP_WIDTH - 1 && y > 0 && y < MAP_HEIGHT - 1) {
|
|
if (game->bricks[x][y].type != MAP_EMPTY && game->bricks[x][y].id != INVIS_BRICK_ID ) {
|
|
shine_x = x * BRICK_WIDTH;
|
|
shine_y = y * BRICK_HEIGHT;
|
|
break;
|
|
}
|
|
x += x_add; y += y_add;
|
|
}
|
|
/* if creation succeeded don't create any more shines */
|
|
if ( shine_x != 0 && shine_y != 0 ) shine_recreate = 0;
|
|
}
|
|
/*
|
|
====================================================================
|
|
Reset (delete( shine
|
|
====================================================================
|
|
*/
|
|
void shine_reset()
|
|
{
|
|
shine_x = shine_y = 0;
|
|
shine_recreate = 1;
|
|
delay_reset( &shine_delay );
|
|
}
|
|
/*
|
|
====================================================================
|
|
Show/hide current shine
|
|
====================================================================
|
|
*/
|
|
void shine_hide()
|
|
{
|
|
if (shine_x == 0 && shine_y == 0) return;
|
|
stk_surface_blit( offscreen, shine_x, shine_y,
|
|
BRICK_WIDTH, BRICK_HEIGHT,
|
|
stk_display, shine_x, shine_y );
|
|
stk_display_store_drect();
|
|
}
|
|
void shine_show()
|
|
{
|
|
if (shine_x == 0 && shine_y == 0) return;
|
|
stk_surface_blit( shine_pic, (int)shine_cur * BRICK_WIDTH, 0,
|
|
BRICK_WIDTH, BRICK_HEIGHT,
|
|
stk_display, shine_x, shine_y );
|
|
}
|
|
/*
|
|
====================================================================
|
|
Update shine
|
|
====================================================================
|
|
*/
|
|
void shine_update( int ms )
|
|
{
|
|
/* recreate shine? */
|
|
if ( shine_recreate ) {
|
|
shine_x = shine_y = 0; /* if recreation is demanded delete old shine */
|
|
if ( delay_timed_out( &shine_delay, ms ) ) shine_create();
|
|
}
|
|
else {
|
|
shine_cur += shine_change * ms;
|
|
if (shine_cur > shine_frame) {
|
|
shine_recreate = 1;
|
|
delay_reset( &shine_delay );
|
|
}
|
|
}
|
|
}
|