Fix missile and explosion animations
This commit is contained in:
@@ -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])));
|
||||||
|
Reference in New Issue
Block a user