Sprite Engine WIP

This commit is contained in:
n00b
2024-10-15 22:57:34 -04:00
parent 4d2e050dcf
commit f9a8e828f2
2 changed files with 256 additions and 0 deletions

View File

@@ -14,13 +14,29 @@ struct rc_sprite2D_physics_obj
int offset_y;
};
struct rc_sprite2D_animation_obj
{
irr::core::array<int> frames;
int num_frames;
int current_frame;
double fps;
double frame_start_time;
double frame_swap_time;
};
struct rc_sprite2D_obj
{
bool active = false;
int image_id;
int sheet_numFrames;
irr::core::vector2d<irr::f64> scale;
irr::core::dimension2d<irr::f64> frame_size;
bool visible = true;
Uint8 alpha;
@@ -29,6 +45,9 @@ struct rc_sprite2D_obj
bool isSolid = false;
rc_sprite2D_physics_obj physics;
int current_animation;
irr::core::array<rc_sprite2D_animation_obj> animation;
int parent_canvas = -1;
double z;

View File

@@ -1,9 +1,197 @@
#ifndef RC_SPRITELIB_H_INCLUDED
#define RC_SPRITELIB_H_INCLUDED
#ifdef RC_ANDROID
#include "SDL.h"
#else
#include <SDL2/SDL.h>
#endif // _IRR_ANDROID_PLATFORM_
#include "rc_sprite2D.h"
#include "rc_gfx_core.h"
#define RC_SPRITE_BASE_ANIMATION 0
int rc_createSpriteAnimation(int spr_id, int anim_length, double fps)
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return -1;
if(!rc_sprite[spr_id].active)
return -1;
if(anim_length <= 0)
anim_length = 1;
rc_sprite2D_animation_obj animation;
animation.current_frame = 0;
animation.fps = fps;
animation.frame_swap_time = 1000/fps;
animation.num_frames = anim_length;
for(int i = 0; i < anim_length; i++)
animation.frames.push_back(0);
int animation_id = rc_sprite[spr_id].animation.size();
rc_sprite[spr_id].animation.push_back(animation);
return animation_id;
}
void rc_setSpriteFrame(int spr_id, int frame)
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return;
if(!rc_sprite[spr_id].active)
return;
if(frame < 0 || frame >= rc_sprite[spr_id].sheet_numFrames)
return;
rc_sprite[spr_id].current_animation = RC_SPRITE_BASE_ANIMATION;
rc_sprite[spr_id].animation[RC_SPRITE_BASE_ANIMATION].current_frame = 0;
rc_sprite[spr_id].animation[RC_SPRITE_BASE_ANIMATION].frames[0] = frame;
}
int rc_getSpriteFrame(int spr_id)
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return -1;
if(!rc_sprite[spr_id].active)
return -1;
int current_animation = rc_sprite[spr_id].current_animation;
int current_frame = rc_sprite[spr_id].animation[current_animation].current_frame;
return rc_sprite[spr_id].animation[current_animation].frames[current_frame];
}
void rc_setSpriteAnimationFrame(int spr_id, int anim_frame, int frame)
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return;
if(!rc_sprite[spr_id].active)
return;
int current_animation = rc_sprite[spr_id].current_animation;
if(anim_frame < 0 || anim_frame >= rc_sprite[spr_id].animation[current_animation].num_frames)
return;
if(frame < 0 || frame >= rc_sprite[spr_id].sheet_numFrames)
return;
rc_sprite[spr_id].animation[current_animation].frames[anim_frame] = frame;
}
int rc_getSpriteAnimationFrame(int spr_id)
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return -1;
if(!rc_sprite[spr_id].active)
return -1;
int current_animation = rc_sprite[spr_id].current_animation;
return rc_sprite[spr_id].animation[current_animation].current_frame;
}
void rc_setSpriteAnimationLength(int spr_id, int animation, int num_frames)
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return;
if(!rc_sprite[spr_id].active)
return;
// I intentionally checked for less than or equal to 0 because 0 is the base animation and should not be changed
if(animation <= 0 || animation >= rc_sprite[spr_id].animation.size())
return;
if(num_frames <= 0)
num_frames = 1;
rc_sprite[spr_id].animation[animation].num_frames = num_frames;
if(num_frames > rc_sprite[spr_id].animation[animation].frames.size())
{
while(num_frames > rc_sprite[spr_id].animation[animation].frames.size())
rc_sprite[spr_id].animation[animation].frames.push_back(0);
}
}
int rc_getSpriteAnimationLength(int spr_id, int animation)
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return 0;
if(!rc_sprite[spr_id].active)
return 0;
if(animation < 0 || animation >= rc_sprite[spr_id].animation.size())
return 0;
return rc_sprite[spr_id].animation[animation].num_frames;
}
void rc_setSpriteAnimationSpeed(int spr_id, int animation, double fps)
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return;
if(!rc_sprite[spr_id].active)
return;
if(animation < 0 || animation >= rc_sprite[spr_id].animation.size())
return;
rc_sprite[spr_id].animation[animation].fps = fps;
rc_sprite[spr_id].animation[animation].frame_swap_time = 1000/fps;
}
double rc_getSpriteAnimationSpeed(int spr_id, int animation)
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return 0;
if(!rc_sprite[spr_id].active)
return 0;
if(animation < 0 || animation >= rc_sprite[spr_id].animation.size())
return 0;
return rc_sprite[spr_id].animation[animation].fps;
}
void rc_setSpriteAnimation(int spr_id, int animation)
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return;
if(!rc_sprite[spr_id].active)
return;
if(animation < 0 || animation >= rc_sprite[spr_id].animation.size())
return;
rc_sprite[spr_id].current_animation = animation;
rc_sprite[spr_id].animation[animation].current_frame = 0;
rc_sprite[spr_id].animation[animation].frame_start_time = SDL_GetTicks();
}
int rc_getSpriteAnimation(int spr_id)
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return -1;
if(!rc_sprite[spr_id].active)
return -1;
return rc_sprite[spr_id].current_animation;
}
//------------------------------SPRITES-------------------------------------------------------
int rc_createSprite(int img_id, double w, double h)
{
@@ -34,6 +222,7 @@ int rc_createSprite(int img_id, double w, double h)
rc_sprite[spr_id].active = true;
rc_sprite[spr_id].image_id = img_id;
rc_sprite[spr_id].frame_size.set(w, h);
b2BodyDef sprBodyDef;
sprBodyDef.type = b2_staticBody;
@@ -59,6 +248,10 @@ int rc_createSprite(int img_id, double w, double h)
rc_sprite[spr_id].color_mod.set(255,255,255,255);
rc_sprite[spr_id].parent_canvas = rc_active_canvas;
rc_sprite[spr_id].current_animation = RC_SPRITE_BASE_ANIMATION;
rc_sprite[spr_id].animation.clear();
rc_createSpriteAnimation(spr_id, 1, 0);
rc_canvas[rc_active_canvas].sprite.push_back(&rc_sprite[spr_id]);
return spr_id;
@@ -81,6 +274,7 @@ void rc_deleteSprite(int spr_id)
rc_sprite[spr_id].active = false;
rc_sprite[spr_id].parent_canvas = -1;
rc_sprite[spr_id].animation.clear();
for(int i = 0; i < rc_canvas[rc_active_canvas].sprite.size(); i++)
{
@@ -277,6 +471,49 @@ void rc_setSpriteScale(int spr_id, double x, double y)
}
}
void rc_scaleSprite(int spr_id, double x, double y)
{
double scale_x = rc_sprite[spr_id].scale.X * x;
double scale_y = rc_sprite[spr_id].scale.Y * y;
rc_setSpriteScale(spr_id, scale_x, scale_y);
}
double rc_spriteWidth(int spr_id)
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return 0;
if(!rc_sprite[spr_id].active)
return 0;
return rc_sprite[spr_id].frame_size.Width;
}
double rc_spriteHeight(int spr_id)
{
if(spr_id < 0 || spr_id >= rc_sprite.size())
return 0;
if(!rc_sprite[spr_id].active)
return 0;
return rc_sprite[spr_id].frame_size.Height;
}
void rc_getSpriteSize(int spr_id, double* w, double* h)
{
*w = 0;
*h = 0;
if(spr_id < 0 || spr_id >= rc_sprite.size())
return;
if(!rc_sprite[spr_id].active)
return;
*w = rc_sprite[spr_id].frame_size.Width;
*h = rc_sprite[spr_id].frame_size.Height;
}
//This function is called on each canvas on update