sprite update accepts a list of subsections of the sprite to draw
This commit is contained in:
parent
a0897d80b4
commit
be360b8a47
|
@ -16,7 +16,8 @@
|
|||
base classes, private and public class members, pixel class iterator, sprite
|
||||
movement history, input history, use seconds instead of milliseconds, store
|
||||
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 :)
|
||||
|
||||
|
|
|
@ -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];
|
||||
}
|
||||
|
@ -846,7 +846,7 @@ void Sprite::set_draw_children_on_frame(bool on_frame)
|
|||
draw_children_on_frame = on_frame;
|
||||
}
|
||||
|
||||
void Sprite::update()
|
||||
void Sprite::update(const std::vector<Box>& subsections)
|
||||
{
|
||||
if (active)
|
||||
{
|
||||
|
@ -872,28 +872,22 @@ void Sprite::update()
|
|||
}
|
||||
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]);
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
for (const Box& blind : get_current_wipe_blinds())
|
||||
if (wipe_animation.is_playing(false))
|
||||
{
|
||||
bottom_save = std::round(blind.get_bottom());
|
||||
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)
|
||||
for (const Box& blind : get_current_wipe_blinds())
|
||||
{
|
||||
unscaled_blind = blind;
|
||||
unscaled_blind.set_nw(unscaled_blind.get_nw() / get_scale());
|
||||
unscaled_blind.set_size(unscaled_blind.get_size() / get_scale());
|
||||
subsection = unscaled_blind;
|
||||
render_subsection(renderer, texture, blind, get_box(box_ii));
|
||||
}
|
||||
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()
|
||||
{
|
||||
leave_memory_allocated = true;
|
||||
|
|
|
@ -40,10 +40,10 @@ struct Sprite : Node
|
|||
std::string current_frameset_name;
|
||||
glm::bvec2 wrap = {false, false};
|
||||
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;
|
||||
std::vector<std::vector<Box>> wipe_blinds;
|
||||
SDL_Rect subsection, subsection_destination;
|
||||
SDL_Rect subsection_int_rect, subsection_destination;
|
||||
std::list<Child> children = {};
|
||||
|
||||
Sprite();
|
||||
|
@ -128,7 +128,7 @@ struct Sprite : Node
|
|||
bool collide(const Sprite&, Box&, bool = false, bool = false, bool = false) const;
|
||||
void wipe(float = 0.0f);
|
||||
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();
|
||||
Sprite& insert_child(std::string, std::list<Child>::iterator);
|
||||
Sprite& insert_child(std::string, std::string);
|
||||
|
@ -138,7 +138,9 @@ struct Sprite : Node
|
|||
bool has_child(std::string) const;
|
||||
void remove_child(std::string);
|
||||
void set_draw_children_on_frame(bool);
|
||||
virtual void update(const std::vector<Box>&);
|
||||
virtual void update();
|
||||
void render_subsection(SDL_Renderer*, SDL_Texture*, const Box&, const Box&);
|
||||
void set_to_leave_memory_allocated();
|
||||
void set_to_deallocate_memory();
|
||||
virtual std::string get_class_name() { return "Sprite"; }
|
||||
|
|
Loading…
Reference in New Issue