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) { void do_missile_anim(short num_steps,location missile_origin,short sound_num) {
// TODO: Get rid of temp_rect, at least // 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; short i,store_missile_dir;
location start_point,finish_point[30]; location start_point,finish_point[30];
location screen_ul; location screen_ul;
short x1[30],x2[30],y1[30],y2[30],t; // for path paramaterization 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; location current_terrain_ul;
sf::RenderTexture temp_gworld;
if(!have_missile || !boom_anim_active) { if(!have_missile || !boom_anim_active) {
boom_anim_active = false; 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); to_rect.offset(current_terrain_ul);
rect_draw_some_item(terrain_screen_gworld.getTexture(),oldBounds,to_rect,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(); mainPtr.setActive();
// init missile paths // init missile paths
for(i = 0; i < 30; i++) { for(i = 0; i < 30; i++) {
store_erase_rect[i] = rectangle();
if((store_missiles[i].missile_type >= 0) && (missile_origin == store_missiles[i].dest)) if((store_missiles[i].missile_type >= 0) && (missile_origin == store_missiles[i].dest))
store_missiles[i].missile_type = -1; 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 // Now, at last, launch missile
for(t = 0; t < num_steps; t++) { for(t = 0; t < num_steps; t++) {
draw_terrain();
for(i = 0; i < 30; i++) for(i = 0; i < 30; i++)
if(store_missiles[i].missile_type >= 0) { if(store_missiles[i].missile_type >= 0) {
// Where place? // Where place?
temp_rect = missile_origin_base; temp_rect = missile_origin_base;
temp_rect.offset(-8 + x2[i] + (x1[i] * t) / num_steps, temp_rect.offset(-8 + x2[i] + (x1[i] * t) / num_steps,
-8 + y2[i] + (y1[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 // now adjust for different paths
if(store_missiles[i].path_type == 1) if(store_missiles[i].path_type == 1)
temp_rect.offset(0, -1 * (t * (num_steps - t)) / 100); 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 // Now put in missile
from_rect = missile_origin_rect[i]; from_rect = missile_origin_rect[i];
if(store_missiles[i].missile_type >= 7) if(store_missiles[i].missile_type >= 7)
from_rect.offset(18 * (t % 8),0); from_rect.offset(18 * (t % 8),0);
rect_draw_some_item(missiles_gworld,from_rect, rect_draw_some_item(missiles_gworld,from_rect,
temp_gworld,temp_rect,sf::BlendAlpha); mainPtr,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.display(); mainPtr.display();
if((PSD[SDF_GAME_SPEED] == 3) || ((PSD[SDF_GAME_SPEED] == 1) && (t % 4 == 0)) || 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 // sound_num currently ignored
// special_draw - 0 normal 1 - first half 2 - second half // special_draw - 0 normal 1 - first half 2 - second half
void do_explosion_anim(short /*sound_num*/,short special_draw) { 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; rectangle base_rect = {0,0,36,28},text_rect;
char str[60]; char str[60];
short i,temp_val,temp_val2; 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; short t,cur_boom_type = 0;
location current_terrain_ul; location current_terrain_ul;
sf::RenderTexture temp_gworld;
short boom_type_sound[3] = {5,10,53}; short boom_type_sound[3] = {5,10,53};
if(!have_boom || !boom_anim_active) { 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); 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; TextStyle style;
style.font = FONT_BOLD; style.font = FONT_BOLD;
style.pointSize = 10; style.pointSize = 10;
temp_gworld.create(temp_rect.width(), temp_rect.height());
temp_gworld.setActive();
clip_rect(temp_gworld, active_area_rect);
mainPtr.setActive(); mainPtr.setActive();
// init missile paths // 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] = base_rect;
explode_place_rect[i].offset(13 + 28 * (store_booms[i].dest.x - screen_ul.x) + store_booms[i].x_adj, 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); 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)) { if((store_booms[i].place_type == 1) && (special_draw < 2)) {
temp_val = get_ran(1,0,50) - 25; temp_val = get_ran(1,0,50) - 25;
temp_val2 = get_ran(1,0,50) - 25; temp_val2 = get_ran(1,0,50) - 25;
explode_place_rect[i].offset(temp_val,temp_val2); 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) else if(special_draw < 2)
explode_place_rect[i] = rectangle(); explode_place_rect[i] = rectangle();
@@ -624,11 +588,7 @@ void do_explosion_anim(short /*sound_num*/,short special_draw) {
// Now, at last, do explosion // 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 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; draw_terrain();
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]);
// Now put in explosions // Now put in explosions
for(i = 0; i < 30; i++) 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 = base_rect;
from_rect.offset(28 * (t + store_booms[i].offset),36 * (1 + store_booms[i].boom_type)); from_rect.offset(28 * (t + store_booms[i].offset),36 * (1 + store_booms[i].boom_type));
rect_draw_some_item(boom_gworld,from_rect, 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) { if(store_booms[i].val_to_place > 0) {
text_rect = explode_place_rect[i]; 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); sprintf(str,"%d",store_booms[i].val_to_place);
style.colour = sf::Color::White; style.colour = sf::Color::White;
style.lineHeight = 12; 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; style.colour = sf::Color::Black;
mainPtr.setActive(); 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))) //if(((PSD[SDF_GAME_SPEED] == 1) && (t % 3 == 0)) || ((PSD[SDF_GAME_SPEED] == 2) && (t % 2 == 0)))
mainPtr.display(); mainPtr.display();
sf::sleep(time_in_ticks(2 * (1 + PSD[SDF_GAME_SPEED]))); sf::sleep(time_in_ticks(2 * (1 + PSD[SDF_GAME_SPEED])));