sprite update accepts a list of subsections of the sprite to draw

This commit is contained in:
Frank DeMarco 2020-09-08 17:34:47 -04:00
parent a0897d80b4
commit be360b8a47
3 changed files with 41 additions and 21 deletions

View File

@ -16,7 +16,8 @@
base classes, private and public class members, pixel class iterator, sprite base classes, private and public class members, pixel class iterator, sprite
movement history, input history, use seconds instead of milliseconds, store movement history, input history, use seconds instead of milliseconds, store
a node's animations in list, frame object for sprite class, inline short a node's animations in list, frame object for sprite class, inline short
functions, add box2d to library, load in separate thread and display progress functions, add box2d to library, load in separate thread and display progress,
add anchor to box class
:) SWEATY HANDS :) OILY SNACKS :) AND BAD HYGIENE :) :) SWEATY HANDS :) OILY SNACKS :) AND BAD HYGIENE :)

View File

@ -778,7 +778,7 @@ void Sprite::advance_wipe_frame()
} }
} }
const std::vector<Box>& Sprite::get_current_wipe_blinds() const std::vector<Box>& Sprite::get_current_wipe_blinds() const
{ {
return wipe_blinds[wipe_index]; return wipe_blinds[wipe_index];
} }
@ -846,7 +846,7 @@ void Sprite::set_draw_children_on_frame(bool on_frame)
draw_children_on_frame = on_frame; draw_children_on_frame = on_frame;
} }
void Sprite::update() void Sprite::update(const std::vector<Box>& subsections)
{ {
if (active) if (active)
{ {
@ -872,28 +872,22 @@ void Sprite::update()
} }
for (std::size_t box_ii = 0; box_ii < boxes.size(); box_ii++) for (std::size_t box_ii = 0; box_ii < boxes.size(); box_ii++)
{ {
if (!wipe_animation.is_playing(false)) if (subsections.size() == 0 && !wipe_animation.is_playing(false))
{ {
SDL_RenderCopyF(renderer, texture, nullptr, &boxes[box_ii]); SDL_RenderCopyF(renderer, texture, nullptr, &boxes[box_ii]);
} }
else else
{ {
for (const Box& blind : get_current_wipe_blinds()) if (wipe_animation.is_playing(false))
{ {
bottom_save = std::round(blind.get_bottom()); for (const Box& blind : get_current_wipe_blinds())
subsection = blind;
subsection.y += bottom_save - (subsection.y + subsection.h);
subsection_destination = subsection;
subsection_destination.x += get_left();
subsection_destination.y += get_top();
if (get_scale() != 1)
{ {
unscaled_blind = blind; render_subsection(renderer, texture, blind, get_box(box_ii));
unscaled_blind.set_nw(unscaled_blind.get_nw() / get_scale());
unscaled_blind.set_size(unscaled_blind.get_size() / get_scale());
subsection = unscaled_blind;
} }
SDL_RenderCopy(renderer, texture, &subsection, &subsection_destination); }
for (const Box& subsection : subsections)
{
render_subsection(renderer, texture, subsection, get_box(box_ii));
} }
} }
} }
@ -923,6 +917,29 @@ void Sprite::update()
} }
} }
void Sprite::update()
{
update({});
}
void Sprite::render_subsection(SDL_Renderer* renderer, SDL_Texture* texture, const Box& subsection, const Box& box)
{
bottom_save = std::round(subsection.get_bottom());
subsection_int_rect = SDL_Rect(subsection);
subsection_int_rect.y += bottom_save - (subsection_int_rect.y + subsection_int_rect.h);
subsection_destination = subsection_int_rect;
subsection_destination.x += box.get_left();
subsection_destination.y += box.get_top();
if (get_scale() != 1)
{
unscaled_subsection = subsection;
unscaled_subsection.set_nw(unscaled_subsection.get_nw() / get_scale());
unscaled_subsection.set_size(unscaled_subsection.get_size() / get_scale());
subsection_int_rect = unscaled_subsection;
}
SDL_RenderCopy(renderer, texture, &subsection_int_rect, &subsection_destination);
}
void Sprite::set_to_leave_memory_allocated() void Sprite::set_to_leave_memory_allocated()
{ {
leave_memory_allocated = true; leave_memory_allocated = true;

View File

@ -40,10 +40,10 @@ struct Sprite : Node
std::string current_frameset_name; std::string current_frameset_name;
glm::bvec2 wrap = {false, false}; glm::bvec2 wrap = {false, false};
int texture_access = SDL_TEXTUREACCESS_TARGET, wipe_index = 0, wipe_increment = -1; int texture_access = SDL_TEXTUREACCESS_TARGET, wipe_index = 0, wipe_increment = -1;
Box wrap_frame, unscaled_blind; Box wrap_frame, unscaled_subsection;
bool leave_memory_allocated = false, hidden = false, draw_children_on_frame = true; bool leave_memory_allocated = false, hidden = false, draw_children_on_frame = true;
std::vector<std::vector<Box>> wipe_blinds; std::vector<std::vector<Box>> wipe_blinds;
SDL_Rect subsection, subsection_destination; SDL_Rect subsection_int_rect, subsection_destination;
std::list<Child> children = {}; std::list<Child> children = {};
Sprite(); Sprite();
@ -128,7 +128,7 @@ struct Sprite : Node
bool collide(const Sprite&, Box&, bool = false, bool = false, bool = false) const; bool collide(const Sprite&, Box&, bool = false, bool = false, bool = false) const;
void wipe(float = 0.0f); void wipe(float = 0.0f);
void advance_wipe_frame(); void advance_wipe_frame();
const std::vector<Box>& get_current_wipe_blinds(); const std::vector<Box>& get_current_wipe_blinds() const;
void reverse_wipe_direction(); void reverse_wipe_direction();
Sprite& insert_child(std::string, std::list<Child>::iterator); Sprite& insert_child(std::string, std::list<Child>::iterator);
Sprite& insert_child(std::string, std::string); Sprite& insert_child(std::string, std::string);
@ -138,7 +138,9 @@ struct Sprite : Node
bool has_child(std::string) const; bool has_child(std::string) const;
void remove_child(std::string); void remove_child(std::string);
void set_draw_children_on_frame(bool); void set_draw_children_on_frame(bool);
virtual void update(const std::vector<Box>&);
virtual void update(); virtual void update();
void render_subsection(SDL_Renderer*, SDL_Texture*, const Box&, const Box&);
void set_to_leave_memory_allocated(); void set_to_leave_memory_allocated();
void set_to_deallocate_memory(); void set_to_deallocate_memory();
virtual std::string get_class_name() { return "Sprite"; } virtual std::string get_class_name() { return "Sprite"; }