Fix missile and explosion animations

This commit is contained in:
2014-12-22 18:20:16 -05:00
parent da975d6e3e
commit 37a8b27209

View File

@@ -371,15 +371,14 @@ void add_explosion(location dest,short val_to_place,short place_type,short boom_
void do_missile_anim(short num_steps,location missile_origin,short sound_num) {
// TODO: Get rid of temp_rect, at least
rectangle temp_rect,missile_origin_base = {1,1,17,17},active_area_rect,to_rect,from_rect;
rectangle temp_rect, missile_origin_base = {1,1,17,17},to_rect,from_rect;
short i,store_missile_dir;
location start_point,finish_point[30];
location screen_ul;
short x1[30],x2[30],y1[30],y2[30],t; // for path paramaterization
rectangle missile_place_rect[30],missile_origin_rect[30],store_erase_rect[30];
rectangle missile_place_rect[30],missile_origin_rect[30];
location current_terrain_ul;
sf::RenderTexture temp_gworld;
if(!have_missile || !boom_anim_active) {
boom_anim_active = false;
@@ -406,19 +405,11 @@ void do_missile_anim(short num_steps,location missile_origin,short sound_num) {
to_rect.offset(current_terrain_ul);
rect_draw_some_item(terrain_screen_gworld.getTexture(),oldBounds,to_rect,ul);
// create and clip temporary anim template
temp_rect = rectangle(terrain_screen_gworld);
active_area_rect = temp_rect;
active_area_rect.inset(13,13);
temp_gworld.create(temp_rect.width(), temp_rect.height());
temp_gworld.setActive();
clip_rect(temp_gworld, active_area_rect);
mainPtr.setActive();
// init missile paths
for(i = 0; i < 30; i++) {
store_erase_rect[i] = rectangle();
if((store_missiles[i].missile_type >= 0) && (missile_origin == store_missiles[i].dest))
store_missiles[i].missile_type = -1;
}
@@ -454,40 +445,28 @@ void do_missile_anim(short num_steps,location missile_origin,short sound_num) {
// Now, at last, launch missile
for(t = 0; t < num_steps; t++) {
draw_terrain();
for(i = 0; i < 30; i++)
if(store_missiles[i].missile_type >= 0) {
// Where place?
temp_rect = missile_origin_base;
temp_rect.offset(-8 + x2[i] + (x1[i] * t) / num_steps,
-8 + y2[i] + (y1[i] * t) / num_steps);
temp_rect.offset(ul);
temp_rect.offset(current_terrain_ul);
// now adjust for different paths
if(store_missiles[i].path_type == 1)
temp_rect.offset(0, -1 * (t * (num_steps - t)) / 100);
missile_place_rect[i] = temp_rect | active_area_rect;
missile_place_rect[i] = temp_rect;
// Now put terrain in temporary;
rect_draw_some_item(terrain_screen_gworld.getTexture(),missile_place_rect[i],
temp_gworld,missile_place_rect[i]);
// Now put in missile
from_rect = missile_origin_rect[i];
if(store_missiles[i].missile_type >= 7)
from_rect.offset(18 * (t % 8),0);
rect_draw_some_item(missiles_gworld,from_rect,
temp_gworld,temp_rect,sf::BlendAlpha);
}
// Now draw all missiles to screen
for(i = 0; i < 30; i++)
if(store_missiles[i].missile_type >= 0) {
to_rect = store_erase_rect[i];
to_rect.offset(current_terrain_ul);
rect_draw_some_item(terrain_screen_gworld.getTexture(),store_erase_rect[i],to_rect,ul);
to_rect = missile_place_rect[i];
store_erase_rect[i] = to_rect;
to_rect.offset(current_terrain_ul);
rect_draw_some_item(temp_gworld.getTexture(),missile_place_rect[i],to_rect,ul);
mainPtr,temp_rect,sf::BlendAlpha);
}
mainPtr.display();
if((PSD[SDF_GAME_SPEED] == 3) || ((PSD[SDF_GAME_SPEED] == 1) && (t % 4 == 0)) ||
@@ -541,7 +520,7 @@ short get_missile_direction(location origin_point,location the_point) {
// sound_num currently ignored
// special_draw - 0 normal 1 - first half 2 - second half
void do_explosion_anim(short /*sound_num*/,short special_draw) {
rectangle temp_rect,active_area_rect,to_rect,from_rect;
rectangle active_area_rect,to_rect,from_rect;
rectangle base_rect = {0,0,36,28},text_rect;
char str[60];
short i,temp_val,temp_val2;
@@ -549,7 +528,6 @@ void do_explosion_anim(short /*sound_num*/,short special_draw) {
short t,cur_boom_type = 0;
location current_terrain_ul;
sf::RenderTexture temp_gworld;
short boom_type_sound[3] = {5,10,53};
if(!have_boom || !boom_anim_active) {
@@ -579,16 +557,9 @@ void do_explosion_anim(short /*sound_num*/,short special_draw) {
rect_draw_some_item(terrain_screen_gworld.getTexture(),oldRect,to_rect,ul);
}
// create and clip temporary anim template
temp_rect = rectangle(terrain_screen_gworld);
active_area_rect = temp_rect;
active_area_rect.inset(13,13);
TextStyle style;
style.font = FONT_BOLD;
style.pointSize = 10;
temp_gworld.create(temp_rect.width(), temp_rect.height());
temp_gworld.setActive();
clip_rect(temp_gworld, active_area_rect);
mainPtr.setActive();
// init missile paths
@@ -599,21 +570,14 @@ void do_explosion_anim(short /*sound_num*/,short special_draw) {
explode_place_rect[i] = base_rect;
explode_place_rect[i].offset(13 + 28 * (store_booms[i].dest.x - screen_ul.x) + store_booms[i].x_adj,
13 + 36 * (store_booms[i].dest.y - screen_ul.y) + store_booms[i].y_adj);
explode_place_rect[i].offset(ul);
explode_place_rect[i].offset(current_terrain_ul);
if((store_booms[i].place_type == 1) && (special_draw < 2)) {
temp_val = get_ran(1,0,50) - 25;
temp_val2 = get_ran(1,0,50) - 25;
explode_place_rect[i].offset(temp_val,temp_val2);
}
// eliminate stuff that's too gone.
rectangle tempRect2;
tempRect2 = rectangle(terrain_screen_gworld);
temp_rect = explode_place_rect[i] | tempRect2;
if(temp_rect == explode_place_rect[i]) {
store_booms[i].boom_type = -1;
}
}
else if(special_draw < 2)
explode_place_rect[i] = rectangle();
@@ -624,11 +588,7 @@ void do_explosion_anim(short /*sound_num*/,short special_draw) {
// Now, at last, do explosion
for(t = (special_draw == 2) ? 6 : 0; t < ((special_draw == 1) ? 6 : 11); t++) { // t goes up to 10 to make sure screen gets cleaned up
// First, lay terrain in temporary graphic area;
for(i = 0; i < 30; i++)
if(store_booms[i].boom_type >= 0)
rect_draw_some_item(terrain_screen_gworld.getTexture(),explode_place_rect[i],
temp_gworld,explode_place_rect[i]);
draw_terrain();
// Now put in explosions
for(i = 0; i < 30; i++)
@@ -637,7 +597,7 @@ void do_explosion_anim(short /*sound_num*/,short special_draw) {
from_rect = base_rect;
from_rect.offset(28 * (t + store_booms[i].offset),36 * (1 + store_booms[i].boom_type));
rect_draw_some_item(boom_gworld,from_rect,
temp_gworld,explode_place_rect[i],sf::BlendAlpha);
mainPtr,explode_place_rect[i],sf::BlendAlpha);
if(store_booms[i].val_to_place > 0) {
text_rect = explode_place_rect[i];
@@ -648,19 +608,12 @@ void do_explosion_anim(short /*sound_num*/,short special_draw) {
sprintf(str,"%d",store_booms[i].val_to_place);
style.colour = sf::Color::White;
style.lineHeight = 12;
win_draw_string(temp_gworld,text_rect,str,eTextMode::CENTRE,style);
win_draw_string(mainPtr,text_rect,str,eTextMode::CENTRE,style);
style.colour = sf::Color::Black;
mainPtr.setActive();
}
}
}
// Now draw all missiles to screen
for(i = 0; i < 30; i++)
if(store_booms[i].boom_type >= 0) {
to_rect = explode_place_rect[i];
to_rect.offset(current_terrain_ul);
rect_draw_some_item(temp_gworld.getTexture(),explode_place_rect[i],to_rect,ul);
}
//if(((PSD[SDF_GAME_SPEED] == 1) && (t % 3 == 0)) || ((PSD[SDF_GAME_SPEED] == 2) && (t % 2 == 0)))
mainPtr.display();
sf::sleep(time_in_ticks(2 * (1 + PSD[SDF_GAME_SPEED])));