From cbb578981af3059f751125c21b1b4dc7a8b1cfd5 Mon Sep 17 00:00:00 2001 From: arc1tec4 Date: Sun, 10 Nov 2024 22:08:47 -0700 Subject: [PATCH 01/19] Add files via upload --- getspritegravity.html | 20 + getspritegravity.txt | 6 + rc_spritelib.h | 960 ++++++++++++++++++++++++++++++++++++++++++ setspritegravity.html | 20 + setspritegravity.txt | 6 + 5 files changed, 1012 insertions(+) create mode 100644 getspritegravity.html create mode 100644 getspritegravity.txt create mode 100644 rc_spritelib.h create mode 100644 setspritegravity.html create mode 100644 setspritegravity.txt diff --git a/getspritegravity.html b/getspritegravity.html new file mode 100644 index 0000000..976bef4 --- /dev/null +++ b/getspritegravity.html @@ -0,0 +1,20 @@ + + + + + + GetSpriteGravity [RCBasic Doc] + + + +

sub GetSpriteGravity(ByRef x, ByRef y)

+

+ Use this function for retrieving the global gravity vector. +

+

Related: + SetSpriteGravity +

+

+ + + \ No newline at end of file diff --git a/getspritegravity.txt b/getspritegravity.txt new file mode 100644 index 0000000..fcf8f4e --- /dev/null +++ b/getspritegravity.txt @@ -0,0 +1,6 @@ +#title GetSpriteGravity [RCBasic Doc] +#header sub GetSpriteGravity(ByRef x, ByRef y) + +Use this function for retrieving the global gravity vector. + +#ref SetSpriteGravity diff --git a/rc_spritelib.h b/rc_spritelib.h new file mode 100644 index 0000000..0796d64 --- /dev/null +++ b/rc_spritelib.h @@ -0,0 +1,960 @@ +#ifndef RC_SPRITELIB_H_INCLUDED +#define RC_SPRITELIB_H_INCLUDED + +#ifdef RC_ANDROID + #include "SDL.h" +#else + #include +#endif // _IRR_ANDROID_PLATFORM_ + +#include "rc_sprite2D.h" +#include "rc_gfx_core.h" + +#include "rc_sprite_physics.h" +#include "rc_joints.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(); + if(rc_sprite[spr_id].deleted_sprites.size() > 0) + { + animation_id = rc_sprite[spr_id].deleted_sprites[0]; + rc_sprite[spr_id].deleted_sprites.erase(0); + rc_sprite[spr_id].animation[animation_id] = animation; + } + else + rc_sprite[spr_id].animation.push_back(animation); + + return animation_id; +} + +void rc_deleteSpriteAnimation(int spr_id, int animation) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return; + + if(!rc_sprite[spr_id].active) + return; + + rc_sprite[spr_id].deleted_sprites.push_back(animation); +} + +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 spr_animation, int anim_frame, int frame) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return; + + if(!rc_sprite[spr_id].active) + return; + + if(anim_frame < 0 || anim_frame >= rc_sprite[spr_id].animation[spr_animation].num_frames) + return; + + if(frame < 0 || frame >= rc_sprite[spr_id].sheet_numFrames) + return; + + rc_sprite[spr_id].animation[spr_animation].frames[anim_frame] = frame; +} + +int rc_getSpriteAnimationFrame(int spr_id, int spr_animation, int anim_frame) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return -1; + + if(!rc_sprite[spr_id].active) + return -1; + + if(anim_frame < 0 || anim_frame >= rc_sprite[spr_id].animation[spr_animation].num_frames) + return -1; + + return rc_sprite[spr_id].animation[spr_animation].frames[anim_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; + + if(num_frames > rc_sprite[spr_id].animation[animation].num_frames) + { + for(int i = rc_sprite[spr_id].animation[animation].num_frames; i < rc_sprite[spr_id].animation[animation].frames.size(); i++) + rc_sprite[spr_id].animation[animation].frames[i] = 0; + } + + 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); + } + + if(num_frames < rc_sprite[spr_id].animation[animation].frames.size()) + { + if(rc_sprite[spr_id].animation[animation].current_frame >= num_frames) + rc_sprite[spr_id].animation[animation].current_frame = num_frames - 1; + } +} + +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, int num_loops) +{ + 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].isPlaying = true; + rc_sprite[spr_id].animation[animation].frame_start_time = SDL_GetTicks(); + rc_sprite[spr_id].num_animation_loops = num_loops; +} + +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; +} + +int rc_getSpriteCurrentAnimationFrame(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_setSpriteAnimationLoops(int spr_id, int num_loops) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return; + + if(!rc_sprite[spr_id].active) + return; + + rc_sprite[spr_id].num_animation_loops = num_loops; +} + +int rc_numSpriteAnimationLoops(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].num_animation_loops; +} + +bool rc_spriteAnimationIsPlaying(int spr_id) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return false; + + if(!rc_sprite[spr_id].active) + return false; + + return rc_sprite[spr_id].isPlaying; +} + +//------------------------------SPRITES------------------------------------------------------- +//Larger z gets drawn first +void sortSpriteZ(int canvas_id) +{ + if(canvas_id < 0 || canvas_id >= rc_canvas.size()) + return; + + if(!rc_canvas[canvas_id].texture) + return; + + for(int i = 0; i < rc_canvas[canvas_id].sprite.size(); i++) + { + rc_sprite2D_obj* spriteA = rc_canvas[canvas_id].sprite[i]; + + for(int j = i+1; j < rc_canvas[canvas_id].sprite.size(); j++) + { + rc_sprite2D_obj* spriteB = rc_canvas[canvas_id].sprite[j]; + + if(spriteB->z > spriteA->z) + { + rc_canvas[canvas_id].sprite[j] = NULL; + rc_canvas[canvas_id].sprite.erase(j); + rc_canvas[canvas_id].sprite.insert(spriteB, i); + } + } + } +} + + +int rc_createSprite(int img_id, double w, double h) +{ + if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size()) + return -1; + + if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE) + return -1; + + //std::cout << "debug 1" << std::endl; + + int spr_id = -1; + for(int i = 0; i < rc_sprite.size(); i++) + { + if(!rc_sprite[i].active) + { + spr_id = i; + break; + } + } + + if(spr_id < 0) + { + spr_id = rc_sprite.size(); + rc_sprite2D_obj sprite; + rc_sprite.push_back(sprite); + } + + rc_sprite[spr_id].active = true; + rc_sprite[spr_id].id = spr_id; + rc_sprite[spr_id].image_id = img_id; + rc_sprite[spr_id].frame_size.set(w, h); + + if(img_id >= 0 && img_id < rc_image.size()) + { + if(rc_image[img_id].image) + { + int img_w = rc_image[img_id].image->getSize().Width; + int img_h = rc_image[img_id].image->getSize().Height; + + rc_sprite[spr_id].frames_per_row = (int)(img_w / w); + rc_sprite[spr_id].sheet_numFrames = ((int)(img_h / h)) * rc_sprite[spr_id].frames_per_row; + } + else + rc_sprite[spr_id].image_id = -1; + } + else + rc_sprite[spr_id].image_id = -1; + + b2BodyDef sprBodyDef; + sprBodyDef.type = b2_dynamicBody; + sprBodyDef.position.Set(0, 0); + sprBodyDef.angle = 0; + sprBodyDef.userData.pointer = (uintptr_t)&rc_sprite[spr_id]; + rc_sprite[spr_id].physics.body = rc_canvas[rc_active_canvas].physics2D.world->CreateBody(&sprBodyDef); + + b2FixtureDef sprFixtureDef; + rc_sprite[spr_id].physics.shape = new b2PolygonShape(); + b2PolygonShape* fix_shape = (b2PolygonShape*)rc_sprite[spr_id].physics.shape; + fix_shape->SetAsBox(w/2, h/2); + sprFixtureDef.shape = rc_sprite[spr_id].physics.shape; + sprFixtureDef.isSensor = true; + sprFixtureDef.density = 1; + rc_sprite[spr_id].physics.fixture = rc_sprite[spr_id].physics.body->CreateFixture(&sprFixtureDef); + + rc_sprite[spr_id].physics.offset_x = 0; + rc_sprite[spr_id].physics.offset_y = 0; + rc_sprite[spr_id].isSolid = false; + + if(rc_sprite[spr_id].image_id < 0) + rc_sprite[spr_id].visible =false; + else + rc_sprite[spr_id].visible = true; + + rc_sprite[spr_id].scale.set(1.0, 1.0); + rc_sprite[spr_id].alpha = 255; + rc_sprite[spr_id].z = 0; + 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].num_animation_loops = 0; + rc_sprite[spr_id].current_animation_loop = 0; + rc_sprite[spr_id].isPlaying = false; + rc_sprite[spr_id].animation.clear(); + rc_createSpriteAnimation(spr_id, 1, 0); + + rc_canvas[rc_active_canvas].sprite.push_back(&rc_sprite[spr_id]); + + sortSpriteZ(rc_active_canvas); + + return spr_id; +} + +void rc_deleteSprite(int spr_id) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return; + + if(rc_sprite[spr_id].physics.body) + { + if(rc_sprite[spr_id].parent_canvas >= 0 && rc_sprite[spr_id].parent_canvas < rc_canvas.size()) + { + if(rc_canvas[rc_sprite[spr_id].parent_canvas].physics2D.world) + rc_canvas[rc_sprite[spr_id].parent_canvas].physics2D.world->DestroyBody(rc_sprite[spr_id].physics.body); + } + rc_sprite[spr_id].physics.body = NULL; + } + + 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++) + { + rc_sprite2D_obj* canvas_sprite = rc_canvas[rc_active_canvas].sprite[i]; + rc_sprite2D_obj* global_sprite = &rc_sprite[spr_id]; + if(canvas_sprite == global_sprite) + { + rc_canvas[rc_active_canvas].sprite.erase(i); + break; + } + } +} + +void rc_setSpriteSource(int spr_id, int img_id) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return; + + if(!rc_sprite[spr_id].active) + return; + + if(img_id < 0) + { + rc_sprite[spr_id].image_id = -1; + return; + } + + if(img_id >= rc_image.size()) + return; + + if(!rc_image[img_id].image) + return; + + rc_sprite[spr_id].image_id = img_id; +} + +int rc_getSpriteSource(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].image_id; +} + + +void rc_setSpriteType(int spr_id, int body_type) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return; + + if(!rc_sprite[spr_id].active) + return; + + rc_sprite[spr_id].physics.body->SetType((b2BodyType) body_type); +} + +int rc_getSpriteType(int spr_id) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return -1; + + if(!rc_sprite[spr_id].active) + return -1; + + return (int)rc_sprite[spr_id].physics.body->GetType(); +} + +void rc_setSpriteSolid(int spr_id, bool flag) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return; + + if(!rc_sprite[spr_id].active) + return; + + rc_sprite[spr_id].isSolid = flag; + rc_sprite[spr_id].physics.fixture->SetSensor(!flag); +} + +bool rc_spriteIsSolid(int spr_id) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return false; + + if(!rc_sprite[spr_id].active) + return false; + + return rc_sprite[spr_id].isSolid; +} + +void rc_setSpritePosition(int spr_id, double x, double y) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return; + + if(!rc_sprite[spr_id].active) + return; + + float current_angle = rc_sprite[spr_id].physics.body->GetAngle(); + rc_sprite[spr_id].physics.body->SetTransform(b2Vec2(x, y), current_angle); +} + +void rc_translateSprite(int spr_id, double x, double y) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return; + + if(!rc_sprite[spr_id].active) + return; + + float current_angle = rc_sprite[spr_id].physics.body->GetAngle(); + double spr_x = rc_sprite[spr_id].physics.body->GetPosition().x + x; + double spr_y = rc_sprite[spr_id].physics.body->GetPosition().y + y; + rc_sprite[spr_id].physics.body->SetTransform(b2Vec2(spr_x, spr_y), current_angle); +} + +void rc_getSpritePosition(int spr_id, double* x, double* y) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return; + + if(!rc_sprite[spr_id].active) + return; + + *x = (double)rc_sprite[spr_id].physics.body->GetPosition().x; + *y = (double)rc_sprite[spr_id].physics.body->GetPosition().y; +} + +double rc_spriteX(int spr_id) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return 0; + + if(!rc_sprite[spr_id].active) + return 0; + + return (double)rc_sprite[spr_id].physics.body->GetPosition().x; +} + +double rc_spriteY(int spr_id) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return 0; + + if(!rc_sprite[spr_id].active) + return 0; + + return (double)rc_sprite[spr_id].physics.body->GetPosition().y; +} + +void rc_setSpriteRotation(int spr_id, double angle) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return; + + if(!rc_sprite[spr_id].active) + return; + + //convert angle to radians + angle = rc_util_radians(angle); + + rc_sprite[spr_id].physics.body->SetTransform(rc_sprite[spr_id].physics.body->GetPosition(), angle); +} + +void rc_rotateSprite(int spr_id, double angle) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return; + + if(!rc_sprite[spr_id].active) + return; + + //convert angle to radians + angle = rc_util_radians(angle); + + float new_angle = rc_sprite[spr_id].physics.body->GetAngle() + angle; + rc_sprite[spr_id].physics.body->SetTransform(rc_sprite[spr_id].physics.body->GetPosition(), new_angle); +} + +double rc_getSpriteRotation(int spr_id) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return 0; + + if(!rc_sprite[spr_id].active) + return 0; + + return rc_util_degrees(rc_sprite[spr_id].physics.body->GetAngle()); +} + +void rc_setSpriteScale(int spr_id, double x, double y) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return; + + if(!rc_sprite[spr_id].active) + return; + + rc_sprite[spr_id].scale.set(x, y); + + if(true) //(rc_sprite[spr_id].isSolid) //I probably originally planned on not having a fixture for non-solid sprites but then I discovered sensors + { + if(rc_sprite[spr_id].physics.fixture) + { + b2FixtureDef fixdef; + fixdef.density = rc_sprite[spr_id].physics.fixture->GetDensity(); + fixdef.friction = rc_sprite[spr_id].physics.fixture->GetFriction(); + fixdef.restitution = rc_sprite[spr_id].physics.fixture->GetRestitution(); + fixdef.restitutionThreshold = rc_sprite[spr_id].physics.fixture->GetRestitutionThreshold(); + fixdef.shape = rc_sprite[spr_id].physics.shape; + fixdef.isSensor = !(rc_sprite[spr_id].isSolid); + + switch(fixdef.shape->GetType()) + { + case b2Shape::e_circle: + { + b2CircleShape* shape = (b2CircleShape*)fixdef.shape; + shape->m_radius = (x+y)/2; + } + break; + + case b2Shape::e_polygon: + { + b2PolygonShape* shape = (b2PolygonShape*)fixdef.shape; + for(int i = 0; i < shape->m_count; i++) + { + shape->m_vertices[i].x *= x; + shape->m_vertices[i].y *= y; + } + } + break; + + case b2Shape::e_chain: + { + b2ChainShape* shape = (b2ChainShape*)fixdef.shape; + for(int i = 0; i < shape->m_count; i++) + { + shape->m_vertices[i].x *= x; + shape->m_vertices[i].y *= y; + } + } + break; + + case b2Shape::e_edge: + { + b2EdgeShape* shape = (b2EdgeShape*)fixdef.shape; + + shape->m_vertex0.x *= x; + shape->m_vertex0.y *= y; + + shape->m_vertex1.x *= x; + shape->m_vertex1.y *= y; + + shape->m_vertex2.x *= x; + shape->m_vertex2.y *= y; + + shape->m_vertex3.x *= x; + shape->m_vertex3.y *= y; + } + break; + } + + rc_sprite[spr_id].physics.body->DestroyFixture(rc_sprite[spr_id].physics.fixture); + rc_sprite[spr_id].physics.fixture = rc_sprite[spr_id].physics.body->CreateFixture(&fixdef); + } + } +} + +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); +} + + +void rc_getSpriteScale(int spr_id, double* x, double* y) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return; + + if(!rc_sprite[spr_id].active) + return; + + *x = rc_sprite[spr_id].scale.X; + *y = rc_sprite[spr_id].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; +} + +void rc_setSpriteZ(int spr_id, double z) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return; + + if(!rc_sprite[spr_id].active) + return; + + rc_sprite[spr_id].z = z; + sortSpriteZ(rc_sprite[spr_id].parent_canvas); +} + +double rc_spriteZ(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].z; +} + +void rc_setSpriteVisible(int spr_id, bool flag) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return; + + if(!rc_sprite[spr_id].active) + return; + + if(rc_sprite[spr_id].image_id) + rc_sprite[spr_id].visible = flag; + else + rc_sprite[spr_id].visible = false; +} + +bool rc_spriteIsVisible(int spr_id) +{ + if(spr_id < 0 || spr_id >= rc_sprite.size()) + return false; + + if(!rc_sprite[spr_id].active) + return false; + + return rc_sprite[spr_id].visible; +} + +void rc_setSpriteGravity(double x, double y) +{ + if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size()) + return; + + if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE) + return; + + b2Vec2 gravity(x, y); + b2World(gravity); +} + +void rc_getSpriteGravity(double* x, double* y) +{ + if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size()) + return; + + if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE) + return; + + *x = 0; + *y = 0; + + *x = b2World.GetGravity().x; + *y = b2World.GetGravity().y; +} + + +//-----------------------------------PHYSICS---------------------------------------------------------------------------------- + + + +//This function is called on each canvas on update +void drawSprites(int canvas_id) +{ + float step = rc_canvas[canvas_id].physics2D.timeStep; + int32 velocityIterations = rc_canvas[canvas_id].physics2D.velocityIterations; + int32 positionIterations = rc_canvas[canvas_id].physics2D.positionIterations; + + if(rc_canvas[canvas_id].physics2D.enabled && (!hasPreUpdated)) + rc_canvas[canvas_id].physics2D.world->Step(step, velocityIterations, positionIterations); + + //Setting the render target to the current canvas. NOTE: I might change this target to a separate sprite layer later. + VideoDriver->setRenderTarget(rc_canvas[canvas_id].texture, true, true); + VideoDriver->clearBuffers(true, true, true, irr::video::SColor(0,0,0,0)); + + + irr::core::dimension2d src_size; + irr::core::rect sourceRect; + + irr::core::position2d position; + + irr::core::position2d rotationPoint; + + irr::f32 rotation = 0; + irr::core::vector2df scale(1.0, 1.0); + bool useAlphaChannel = true; + irr::video::SColor color; + + //irr::core::rect dest( irr::core::vector2d(x, y), irr::core::dimension2d(src_w, src_h));; + + irr::core::vector2df screenSize(rc_canvas[canvas_id].dimension.Width, rc_canvas[canvas_id].dimension.Height); + + int x = 0; + int y = 0; + + b2Vec2 physics_pos; + + irr::f32 RAD_TO_DEG = 180.0/3.141592653589793238463; + + double spr_timer = SDL_GetTicks(); + + int offset_x = rc_canvas[canvas_id].offset.X; + int offset_y = rc_canvas[canvas_id].offset.Y; + + for(int spr_index = 0; spr_index < rc_canvas[canvas_id].sprite.size(); spr_index++) + { + rc_sprite2D_obj* sprite = rc_canvas[canvas_id].sprite[spr_index]; + if(!sprite->visible) + continue; + + physics_pos = sprite->physics.body->GetPosition(); + x = (int)physics_pos.x - offset_x; + y = (int)physics_pos.y - offset_y; + + int xf = x + sprite->frame_size.Width; + int yf = y + sprite->frame_size.Height; + + //std::cout << "sprite info: " << xf << ", " << x << ", " << rc_canvas[canvas_id].viewport.dimension.Width << std::endl; + + if( (xf < 0) || (x > ((int)rc_canvas[canvas_id].viewport.dimension.Width)) ) + { + //std::cout << "skip draw[X]: " << spr_index << std::endl; + continue; + } + + if( (yf < 0) || (y > ((int)rc_canvas[canvas_id].viewport.dimension.Height)) ) + { + //std::cout << "skip draw[Y]: " << spr_index << std::endl; + continue; + } + + position.set(x, y); + + int img_id = sprite->image_id; + if(img_id < 0 || img_id >= rc_image.size()) + continue; + + //src_size = rc_image[img_id].image->getSize(); + int current_animation = sprite->current_animation; + if((spr_timer - sprite->animation[current_animation].frame_start_time) >= sprite->animation[current_animation].frame_swap_time) + { + sprite->animation[current_animation].current_frame++; + + if(sprite->animation[current_animation].current_frame >= sprite->animation[current_animation].num_frames) + { + sprite->animation[current_animation].current_frame = 0; + sprite->current_animation_loop++; + + if(sprite->current_animation_loop >= sprite->num_animation_loops) + { + if(sprite->num_animation_loops < 0) + sprite->isPlaying = true; + else + sprite->isPlaying = false; + sprite->current_animation_loop = 0; + } + } + + if(!sprite->isPlaying) + sprite->animation[current_animation].current_frame = 0; + + sprite->animation[current_animation].frame_start_time = spr_timer; + } + + int current_animation_frame = sprite->animation[current_animation].current_frame; + + int frame_x = (int)(sprite->animation[current_animation].frames[current_animation_frame]%sprite->frames_per_row)*sprite->frame_size.Width; + int frame_y = (int)(sprite->animation[current_animation].frames[current_animation_frame]/sprite->frames_per_row)*sprite->frame_size.Height; + irr::core::vector2d frame_pos(frame_x, frame_y); + src_size = sprite->frame_size; + sourceRect = irr::core::rect( frame_pos, src_size); + //sourceRect = irr::core::rect( irr::core::vector2d(0, 0), src_size); + + //physics_pos = sprite->physics.body->GetPosition(); + //x = (int)physics_pos.x; + //y = (int)physics_pos.y; + //position.set(x, y); + + + rotationPoint.set(x + (src_size.Width/2), y + (src_size.Height/2)); //TODO: need to account for offset once that is implemented + rotation = -1 * (sprite->physics.body->GetAngle() * RAD_TO_DEG); //convert Box2D radians to degrees + + scale.set(sprite->scale.X, sprite->scale.Y); + + color.set(sprite->alpha, + sprite->color_mod.getRed(), + sprite->color_mod.getGreen(), + sprite->color_mod.getBlue()); + + //I don't want to draw an image that doesn't exists. Thats just crazy. + draw2DImage(VideoDriver, rc_image[img_id].image, sourceRect, position, rotationPoint, rotation, scale, useAlphaChannel, color, screenSize); + } + //Must set back to canvas 0 (the backbuffer) before returning + + VideoDriver->setRenderTarget(rc_canvas[0].texture, false, false); +} + +//-----------------------------END OF SPRITE STUFF------------------------------------------------------------------------------ + +#endif // RC_SPRITELIB_H_INCLUDED diff --git a/setspritegravity.html b/setspritegravity.html new file mode 100644 index 0000000..7cf20d4 --- /dev/null +++ b/setspritegravity.html @@ -0,0 +1,20 @@ + + + + + + SetSpriteGravity [RCBasic Doc] + + + +

sub SetSpriteGravity(x, y)

+

+ Use this function for setting the global gravity vector. +

+

Related: + GetSpriteGravity +

+

+ + + \ No newline at end of file diff --git a/setspritegravity.txt b/setspritegravity.txt new file mode 100644 index 0000000..a5f6154 --- /dev/null +++ b/setspritegravity.txt @@ -0,0 +1,6 @@ +#title SetSpriteGravity [RCBasic Doc] +#header sub SetSpriteGravity(x, y) + +Use this function for setting the global gravity vector. + +#ref GetSpriteGravity From 5c53e7067bc0bb227587a8e6196a1f851edfdeac Mon Sep 17 00:00:00 2001 From: arc1tec4 Date: Sun, 10 Nov 2024 22:10:42 -0700 Subject: [PATCH 02/19] Add files via upload --- rcbasic_runtime/rc_spritelib.h | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/rcbasic_runtime/rc_spritelib.h b/rcbasic_runtime/rc_spritelib.h index 9a4a491..0796d64 100644 --- a/rcbasic_runtime/rc_spritelib.h +++ b/rcbasic_runtime/rc_spritelib.h @@ -787,6 +787,32 @@ bool rc_spriteIsVisible(int spr_id) return rc_sprite[spr_id].visible; } +void rc_setSpriteGravity(double x, double y) +{ + if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size()) + return; + + if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE) + return; + + b2Vec2 gravity(x, y); + b2World(gravity); +} + +void rc_getSpriteGravity(double* x, double* y) +{ + if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size()) + return; + + if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE) + return; + + *x = 0; + *y = 0; + + *x = b2World.GetGravity().x; + *y = b2World.GetGravity().y; +} //-----------------------------------PHYSICS---------------------------------------------------------------------------------- From 1e47d69e23444787e08e0001239766d16bec3873 Mon Sep 17 00:00:00 2001 From: arc1tec4 Date: Sun, 10 Nov 2024 22:13:24 -0700 Subject: [PATCH 03/19] Add files via upload --- doc/files/getspritegravity.txt | 6 ++++++ doc/files/setspritegravity.txt | 6 ++++++ 2 files changed, 12 insertions(+) create mode 100644 doc/files/getspritegravity.txt create mode 100644 doc/files/setspritegravity.txt diff --git a/doc/files/getspritegravity.txt b/doc/files/getspritegravity.txt new file mode 100644 index 0000000..fcf8f4e --- /dev/null +++ b/doc/files/getspritegravity.txt @@ -0,0 +1,6 @@ +#title GetSpriteGravity [RCBasic Doc] +#header sub GetSpriteGravity(ByRef x, ByRef y) + +Use this function for retrieving the global gravity vector. + +#ref SetSpriteGravity diff --git a/doc/files/setspritegravity.txt b/doc/files/setspritegravity.txt new file mode 100644 index 0000000..a5f6154 --- /dev/null +++ b/doc/files/setspritegravity.txt @@ -0,0 +1,6 @@ +#title SetSpriteGravity [RCBasic Doc] +#header sub SetSpriteGravity(x, y) + +Use this function for setting the global gravity vector. + +#ref GetSpriteGravity From f30aaffc4c327eac49250510b5cd3df036d1552d Mon Sep 17 00:00:00 2001 From: arc1tec4 Date: Sun, 10 Nov 2024 22:15:47 -0700 Subject: [PATCH 04/19] Add files via upload --- doc/files/opencanvasspritelayer.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/files/opencanvasspritelayer.txt b/doc/files/opencanvasspritelayer.txt index 3635a7e..0ba5a75 100644 --- a/doc/files/opencanvasspritelayer.txt +++ b/doc/files/opencanvasspritelayer.txt @@ -1,5 +1,5 @@ #title OpenCanvasSpriteLayer [RCBasic Doc] -#header function OpenCanvasSpriteLayer(w, h, viewport_x, viewport_y, viewport_w, viewport_h) +#header function OpenCanvasSpriteLayer(viewport_x, viewport_y, viewport_w, viewport_h) Returns a sprite layer. These canvases are used for rendering sprites with the integrated physics engine. From f8296f44cf75065c8b05303a19c0942bccbd300b Mon Sep 17 00:00:00 2001 From: arc1tec4 Date: Sun, 10 Nov 2024 22:17:02 -0700 Subject: [PATCH 05/19] Add files via upload --- doc/doc_files/getspritegravity.html | 20 ++++++++++++++++++++ doc/doc_files/opencanvasspritelayer.html | 2 +- doc/doc_files/setspritegravity.html | 20 ++++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 doc/doc_files/getspritegravity.html create mode 100644 doc/doc_files/setspritegravity.html diff --git a/doc/doc_files/getspritegravity.html b/doc/doc_files/getspritegravity.html new file mode 100644 index 0000000..976bef4 --- /dev/null +++ b/doc/doc_files/getspritegravity.html @@ -0,0 +1,20 @@ + + + + + + GetSpriteGravity [RCBasic Doc] + + + +

sub GetSpriteGravity(ByRef x, ByRef y)

+

+ Use this function for retrieving the global gravity vector. +

+

Related: + SetSpriteGravity +

+

+ + + \ No newline at end of file diff --git a/doc/doc_files/opencanvasspritelayer.html b/doc/doc_files/opencanvasspritelayer.html index e214db4..eb20172 100644 --- a/doc/doc_files/opencanvasspritelayer.html +++ b/doc/doc_files/opencanvasspritelayer.html @@ -7,7 +7,7 @@ -

function OpenCanvasSpriteLayer(w, h, viewport_x, viewport_y, viewport_w, viewport_h)

+

function OpenCanvasSpriteLayer(viewport_x, viewport_y, viewport_w, viewport_h)

Returns a sprite layer. These canvases are used for rendering sprites with the integrated physics engine.

diff --git a/doc/doc_files/setspritegravity.html b/doc/doc_files/setspritegravity.html new file mode 100644 index 0000000..7cf20d4 --- /dev/null +++ b/doc/doc_files/setspritegravity.html @@ -0,0 +1,20 @@ + + + + + + SetSpriteGravity [RCBasic Doc] + + + +

sub SetSpriteGravity(x, y)

+

+ Use this function for setting the global gravity vector. +

+

Related: + GetSpriteGravity +

+

+ + + \ No newline at end of file From 19f67fa883dc5f4a682194c5b1005c589b4cc751 Mon Sep 17 00:00:00 2001 From: arc1tec4 Date: Sun, 10 Nov 2024 22:17:58 -0700 Subject: [PATCH 06/19] Add files via upload From a13d3de54f128e5a6816fab6ff361767e37cfeee Mon Sep 17 00:00:00 2001 From: arc1tec4 Date: Mon, 11 Nov 2024 16:36:50 -0700 Subject: [PATCH 07/19] Delete getspritegravity.html --- getspritegravity.html | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 getspritegravity.html diff --git a/getspritegravity.html b/getspritegravity.html deleted file mode 100644 index 976bef4..0000000 --- a/getspritegravity.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - GetSpriteGravity [RCBasic Doc] - - - -

sub GetSpriteGravity(ByRef x, ByRef y)

-

- Use this function for retrieving the global gravity vector. -

-

Related: - SetSpriteGravity -

-

- - - \ No newline at end of file From 74f9fc89698a0561c2b031c93e4f9dfe34960386 Mon Sep 17 00:00:00 2001 From: arc1tec4 Date: Mon, 11 Nov 2024 16:37:02 -0700 Subject: [PATCH 08/19] Delete setspritegravity.txt --- setspritegravity.txt | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 setspritegravity.txt diff --git a/setspritegravity.txt b/setspritegravity.txt deleted file mode 100644 index a5f6154..0000000 --- a/setspritegravity.txt +++ /dev/null @@ -1,6 +0,0 @@ -#title SetSpriteGravity [RCBasic Doc] -#header sub SetSpriteGravity(x, y) - -Use this function for setting the global gravity vector. - -#ref GetSpriteGravity From 34c023a9765f2491c6e47e06fe774c4a582149bc Mon Sep 17 00:00:00 2001 From: arc1tec4 Date: Mon, 11 Nov 2024 16:37:12 -0700 Subject: [PATCH 09/19] Delete setspritegravity.html --- setspritegravity.html | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 setspritegravity.html diff --git a/setspritegravity.html b/setspritegravity.html deleted file mode 100644 index 7cf20d4..0000000 --- a/setspritegravity.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - SetSpriteGravity [RCBasic Doc] - - - -

sub SetSpriteGravity(x, y)

-

- Use this function for setting the global gravity vector. -

-

Related: - GetSpriteGravity -

-

- - - \ No newline at end of file From ceee3fc5d06f8597600dc9801bcda542bf6b9d3b Mon Sep 17 00:00:00 2001 From: arc1tec4 Date: Mon, 11 Nov 2024 16:37:24 -0700 Subject: [PATCH 10/19] Delete rc_spritelib.h --- rc_spritelib.h | 960 ------------------------------------------------- 1 file changed, 960 deletions(-) delete mode 100644 rc_spritelib.h diff --git a/rc_spritelib.h b/rc_spritelib.h deleted file mode 100644 index 0796d64..0000000 --- a/rc_spritelib.h +++ /dev/null @@ -1,960 +0,0 @@ -#ifndef RC_SPRITELIB_H_INCLUDED -#define RC_SPRITELIB_H_INCLUDED - -#ifdef RC_ANDROID - #include "SDL.h" -#else - #include -#endif // _IRR_ANDROID_PLATFORM_ - -#include "rc_sprite2D.h" -#include "rc_gfx_core.h" - -#include "rc_sprite_physics.h" -#include "rc_joints.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(); - if(rc_sprite[spr_id].deleted_sprites.size() > 0) - { - animation_id = rc_sprite[spr_id].deleted_sprites[0]; - rc_sprite[spr_id].deleted_sprites.erase(0); - rc_sprite[spr_id].animation[animation_id] = animation; - } - else - rc_sprite[spr_id].animation.push_back(animation); - - return animation_id; -} - -void rc_deleteSpriteAnimation(int spr_id, int animation) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return; - - if(!rc_sprite[spr_id].active) - return; - - rc_sprite[spr_id].deleted_sprites.push_back(animation); -} - -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 spr_animation, int anim_frame, int frame) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return; - - if(!rc_sprite[spr_id].active) - return; - - if(anim_frame < 0 || anim_frame >= rc_sprite[spr_id].animation[spr_animation].num_frames) - return; - - if(frame < 0 || frame >= rc_sprite[spr_id].sheet_numFrames) - return; - - rc_sprite[spr_id].animation[spr_animation].frames[anim_frame] = frame; -} - -int rc_getSpriteAnimationFrame(int spr_id, int spr_animation, int anim_frame) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return -1; - - if(!rc_sprite[spr_id].active) - return -1; - - if(anim_frame < 0 || anim_frame >= rc_sprite[spr_id].animation[spr_animation].num_frames) - return -1; - - return rc_sprite[spr_id].animation[spr_animation].frames[anim_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; - - if(num_frames > rc_sprite[spr_id].animation[animation].num_frames) - { - for(int i = rc_sprite[spr_id].animation[animation].num_frames; i < rc_sprite[spr_id].animation[animation].frames.size(); i++) - rc_sprite[spr_id].animation[animation].frames[i] = 0; - } - - 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); - } - - if(num_frames < rc_sprite[spr_id].animation[animation].frames.size()) - { - if(rc_sprite[spr_id].animation[animation].current_frame >= num_frames) - rc_sprite[spr_id].animation[animation].current_frame = num_frames - 1; - } -} - -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, int num_loops) -{ - 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].isPlaying = true; - rc_sprite[spr_id].animation[animation].frame_start_time = SDL_GetTicks(); - rc_sprite[spr_id].num_animation_loops = num_loops; -} - -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; -} - -int rc_getSpriteCurrentAnimationFrame(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_setSpriteAnimationLoops(int spr_id, int num_loops) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return; - - if(!rc_sprite[spr_id].active) - return; - - rc_sprite[spr_id].num_animation_loops = num_loops; -} - -int rc_numSpriteAnimationLoops(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].num_animation_loops; -} - -bool rc_spriteAnimationIsPlaying(int spr_id) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return false; - - if(!rc_sprite[spr_id].active) - return false; - - return rc_sprite[spr_id].isPlaying; -} - -//------------------------------SPRITES------------------------------------------------------- -//Larger z gets drawn first -void sortSpriteZ(int canvas_id) -{ - if(canvas_id < 0 || canvas_id >= rc_canvas.size()) - return; - - if(!rc_canvas[canvas_id].texture) - return; - - for(int i = 0; i < rc_canvas[canvas_id].sprite.size(); i++) - { - rc_sprite2D_obj* spriteA = rc_canvas[canvas_id].sprite[i]; - - for(int j = i+1; j < rc_canvas[canvas_id].sprite.size(); j++) - { - rc_sprite2D_obj* spriteB = rc_canvas[canvas_id].sprite[j]; - - if(spriteB->z > spriteA->z) - { - rc_canvas[canvas_id].sprite[j] = NULL; - rc_canvas[canvas_id].sprite.erase(j); - rc_canvas[canvas_id].sprite.insert(spriteB, i); - } - } - } -} - - -int rc_createSprite(int img_id, double w, double h) -{ - if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size()) - return -1; - - if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE) - return -1; - - //std::cout << "debug 1" << std::endl; - - int spr_id = -1; - for(int i = 0; i < rc_sprite.size(); i++) - { - if(!rc_sprite[i].active) - { - spr_id = i; - break; - } - } - - if(spr_id < 0) - { - spr_id = rc_sprite.size(); - rc_sprite2D_obj sprite; - rc_sprite.push_back(sprite); - } - - rc_sprite[spr_id].active = true; - rc_sprite[spr_id].id = spr_id; - rc_sprite[spr_id].image_id = img_id; - rc_sprite[spr_id].frame_size.set(w, h); - - if(img_id >= 0 && img_id < rc_image.size()) - { - if(rc_image[img_id].image) - { - int img_w = rc_image[img_id].image->getSize().Width; - int img_h = rc_image[img_id].image->getSize().Height; - - rc_sprite[spr_id].frames_per_row = (int)(img_w / w); - rc_sprite[spr_id].sheet_numFrames = ((int)(img_h / h)) * rc_sprite[spr_id].frames_per_row; - } - else - rc_sprite[spr_id].image_id = -1; - } - else - rc_sprite[spr_id].image_id = -1; - - b2BodyDef sprBodyDef; - sprBodyDef.type = b2_dynamicBody; - sprBodyDef.position.Set(0, 0); - sprBodyDef.angle = 0; - sprBodyDef.userData.pointer = (uintptr_t)&rc_sprite[spr_id]; - rc_sprite[spr_id].physics.body = rc_canvas[rc_active_canvas].physics2D.world->CreateBody(&sprBodyDef); - - b2FixtureDef sprFixtureDef; - rc_sprite[spr_id].physics.shape = new b2PolygonShape(); - b2PolygonShape* fix_shape = (b2PolygonShape*)rc_sprite[spr_id].physics.shape; - fix_shape->SetAsBox(w/2, h/2); - sprFixtureDef.shape = rc_sprite[spr_id].physics.shape; - sprFixtureDef.isSensor = true; - sprFixtureDef.density = 1; - rc_sprite[spr_id].physics.fixture = rc_sprite[spr_id].physics.body->CreateFixture(&sprFixtureDef); - - rc_sprite[spr_id].physics.offset_x = 0; - rc_sprite[spr_id].physics.offset_y = 0; - rc_sprite[spr_id].isSolid = false; - - if(rc_sprite[spr_id].image_id < 0) - rc_sprite[spr_id].visible =false; - else - rc_sprite[spr_id].visible = true; - - rc_sprite[spr_id].scale.set(1.0, 1.0); - rc_sprite[spr_id].alpha = 255; - rc_sprite[spr_id].z = 0; - 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].num_animation_loops = 0; - rc_sprite[spr_id].current_animation_loop = 0; - rc_sprite[spr_id].isPlaying = false; - rc_sprite[spr_id].animation.clear(); - rc_createSpriteAnimation(spr_id, 1, 0); - - rc_canvas[rc_active_canvas].sprite.push_back(&rc_sprite[spr_id]); - - sortSpriteZ(rc_active_canvas); - - return spr_id; -} - -void rc_deleteSprite(int spr_id) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return; - - if(rc_sprite[spr_id].physics.body) - { - if(rc_sprite[spr_id].parent_canvas >= 0 && rc_sprite[spr_id].parent_canvas < rc_canvas.size()) - { - if(rc_canvas[rc_sprite[spr_id].parent_canvas].physics2D.world) - rc_canvas[rc_sprite[spr_id].parent_canvas].physics2D.world->DestroyBody(rc_sprite[spr_id].physics.body); - } - rc_sprite[spr_id].physics.body = NULL; - } - - 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++) - { - rc_sprite2D_obj* canvas_sprite = rc_canvas[rc_active_canvas].sprite[i]; - rc_sprite2D_obj* global_sprite = &rc_sprite[spr_id]; - if(canvas_sprite == global_sprite) - { - rc_canvas[rc_active_canvas].sprite.erase(i); - break; - } - } -} - -void rc_setSpriteSource(int spr_id, int img_id) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return; - - if(!rc_sprite[spr_id].active) - return; - - if(img_id < 0) - { - rc_sprite[spr_id].image_id = -1; - return; - } - - if(img_id >= rc_image.size()) - return; - - if(!rc_image[img_id].image) - return; - - rc_sprite[spr_id].image_id = img_id; -} - -int rc_getSpriteSource(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].image_id; -} - - -void rc_setSpriteType(int spr_id, int body_type) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return; - - if(!rc_sprite[spr_id].active) - return; - - rc_sprite[spr_id].physics.body->SetType((b2BodyType) body_type); -} - -int rc_getSpriteType(int spr_id) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return -1; - - if(!rc_sprite[spr_id].active) - return -1; - - return (int)rc_sprite[spr_id].physics.body->GetType(); -} - -void rc_setSpriteSolid(int spr_id, bool flag) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return; - - if(!rc_sprite[spr_id].active) - return; - - rc_sprite[spr_id].isSolid = flag; - rc_sprite[spr_id].physics.fixture->SetSensor(!flag); -} - -bool rc_spriteIsSolid(int spr_id) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return false; - - if(!rc_sprite[spr_id].active) - return false; - - return rc_sprite[spr_id].isSolid; -} - -void rc_setSpritePosition(int spr_id, double x, double y) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return; - - if(!rc_sprite[spr_id].active) - return; - - float current_angle = rc_sprite[spr_id].physics.body->GetAngle(); - rc_sprite[spr_id].physics.body->SetTransform(b2Vec2(x, y), current_angle); -} - -void rc_translateSprite(int spr_id, double x, double y) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return; - - if(!rc_sprite[spr_id].active) - return; - - float current_angle = rc_sprite[spr_id].physics.body->GetAngle(); - double spr_x = rc_sprite[spr_id].physics.body->GetPosition().x + x; - double spr_y = rc_sprite[spr_id].physics.body->GetPosition().y + y; - rc_sprite[spr_id].physics.body->SetTransform(b2Vec2(spr_x, spr_y), current_angle); -} - -void rc_getSpritePosition(int spr_id, double* x, double* y) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return; - - if(!rc_sprite[spr_id].active) - return; - - *x = (double)rc_sprite[spr_id].physics.body->GetPosition().x; - *y = (double)rc_sprite[spr_id].physics.body->GetPosition().y; -} - -double rc_spriteX(int spr_id) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return 0; - - if(!rc_sprite[spr_id].active) - return 0; - - return (double)rc_sprite[spr_id].physics.body->GetPosition().x; -} - -double rc_spriteY(int spr_id) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return 0; - - if(!rc_sprite[spr_id].active) - return 0; - - return (double)rc_sprite[spr_id].physics.body->GetPosition().y; -} - -void rc_setSpriteRotation(int spr_id, double angle) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return; - - if(!rc_sprite[spr_id].active) - return; - - //convert angle to radians - angle = rc_util_radians(angle); - - rc_sprite[spr_id].physics.body->SetTransform(rc_sprite[spr_id].physics.body->GetPosition(), angle); -} - -void rc_rotateSprite(int spr_id, double angle) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return; - - if(!rc_sprite[spr_id].active) - return; - - //convert angle to radians - angle = rc_util_radians(angle); - - float new_angle = rc_sprite[spr_id].physics.body->GetAngle() + angle; - rc_sprite[spr_id].physics.body->SetTransform(rc_sprite[spr_id].physics.body->GetPosition(), new_angle); -} - -double rc_getSpriteRotation(int spr_id) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return 0; - - if(!rc_sprite[spr_id].active) - return 0; - - return rc_util_degrees(rc_sprite[spr_id].physics.body->GetAngle()); -} - -void rc_setSpriteScale(int spr_id, double x, double y) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return; - - if(!rc_sprite[spr_id].active) - return; - - rc_sprite[spr_id].scale.set(x, y); - - if(true) //(rc_sprite[spr_id].isSolid) //I probably originally planned on not having a fixture for non-solid sprites but then I discovered sensors - { - if(rc_sprite[spr_id].physics.fixture) - { - b2FixtureDef fixdef; - fixdef.density = rc_sprite[spr_id].physics.fixture->GetDensity(); - fixdef.friction = rc_sprite[spr_id].physics.fixture->GetFriction(); - fixdef.restitution = rc_sprite[spr_id].physics.fixture->GetRestitution(); - fixdef.restitutionThreshold = rc_sprite[spr_id].physics.fixture->GetRestitutionThreshold(); - fixdef.shape = rc_sprite[spr_id].physics.shape; - fixdef.isSensor = !(rc_sprite[spr_id].isSolid); - - switch(fixdef.shape->GetType()) - { - case b2Shape::e_circle: - { - b2CircleShape* shape = (b2CircleShape*)fixdef.shape; - shape->m_radius = (x+y)/2; - } - break; - - case b2Shape::e_polygon: - { - b2PolygonShape* shape = (b2PolygonShape*)fixdef.shape; - for(int i = 0; i < shape->m_count; i++) - { - shape->m_vertices[i].x *= x; - shape->m_vertices[i].y *= y; - } - } - break; - - case b2Shape::e_chain: - { - b2ChainShape* shape = (b2ChainShape*)fixdef.shape; - for(int i = 0; i < shape->m_count; i++) - { - shape->m_vertices[i].x *= x; - shape->m_vertices[i].y *= y; - } - } - break; - - case b2Shape::e_edge: - { - b2EdgeShape* shape = (b2EdgeShape*)fixdef.shape; - - shape->m_vertex0.x *= x; - shape->m_vertex0.y *= y; - - shape->m_vertex1.x *= x; - shape->m_vertex1.y *= y; - - shape->m_vertex2.x *= x; - shape->m_vertex2.y *= y; - - shape->m_vertex3.x *= x; - shape->m_vertex3.y *= y; - } - break; - } - - rc_sprite[spr_id].physics.body->DestroyFixture(rc_sprite[spr_id].physics.fixture); - rc_sprite[spr_id].physics.fixture = rc_sprite[spr_id].physics.body->CreateFixture(&fixdef); - } - } -} - -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); -} - - -void rc_getSpriteScale(int spr_id, double* x, double* y) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return; - - if(!rc_sprite[spr_id].active) - return; - - *x = rc_sprite[spr_id].scale.X; - *y = rc_sprite[spr_id].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; -} - -void rc_setSpriteZ(int spr_id, double z) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return; - - if(!rc_sprite[spr_id].active) - return; - - rc_sprite[spr_id].z = z; - sortSpriteZ(rc_sprite[spr_id].parent_canvas); -} - -double rc_spriteZ(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].z; -} - -void rc_setSpriteVisible(int spr_id, bool flag) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return; - - if(!rc_sprite[spr_id].active) - return; - - if(rc_sprite[spr_id].image_id) - rc_sprite[spr_id].visible = flag; - else - rc_sprite[spr_id].visible = false; -} - -bool rc_spriteIsVisible(int spr_id) -{ - if(spr_id < 0 || spr_id >= rc_sprite.size()) - return false; - - if(!rc_sprite[spr_id].active) - return false; - - return rc_sprite[spr_id].visible; -} - -void rc_setSpriteGravity(double x, double y) -{ - if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size()) - return; - - if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE) - return; - - b2Vec2 gravity(x, y); - b2World(gravity); -} - -void rc_getSpriteGravity(double* x, double* y) -{ - if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size()) - return; - - if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE) - return; - - *x = 0; - *y = 0; - - *x = b2World.GetGravity().x; - *y = b2World.GetGravity().y; -} - - -//-----------------------------------PHYSICS---------------------------------------------------------------------------------- - - - -//This function is called on each canvas on update -void drawSprites(int canvas_id) -{ - float step = rc_canvas[canvas_id].physics2D.timeStep; - int32 velocityIterations = rc_canvas[canvas_id].physics2D.velocityIterations; - int32 positionIterations = rc_canvas[canvas_id].physics2D.positionIterations; - - if(rc_canvas[canvas_id].physics2D.enabled && (!hasPreUpdated)) - rc_canvas[canvas_id].physics2D.world->Step(step, velocityIterations, positionIterations); - - //Setting the render target to the current canvas. NOTE: I might change this target to a separate sprite layer later. - VideoDriver->setRenderTarget(rc_canvas[canvas_id].texture, true, true); - VideoDriver->clearBuffers(true, true, true, irr::video::SColor(0,0,0,0)); - - - irr::core::dimension2d src_size; - irr::core::rect sourceRect; - - irr::core::position2d position; - - irr::core::position2d rotationPoint; - - irr::f32 rotation = 0; - irr::core::vector2df scale(1.0, 1.0); - bool useAlphaChannel = true; - irr::video::SColor color; - - //irr::core::rect dest( irr::core::vector2d(x, y), irr::core::dimension2d(src_w, src_h));; - - irr::core::vector2df screenSize(rc_canvas[canvas_id].dimension.Width, rc_canvas[canvas_id].dimension.Height); - - int x = 0; - int y = 0; - - b2Vec2 physics_pos; - - irr::f32 RAD_TO_DEG = 180.0/3.141592653589793238463; - - double spr_timer = SDL_GetTicks(); - - int offset_x = rc_canvas[canvas_id].offset.X; - int offset_y = rc_canvas[canvas_id].offset.Y; - - for(int spr_index = 0; spr_index < rc_canvas[canvas_id].sprite.size(); spr_index++) - { - rc_sprite2D_obj* sprite = rc_canvas[canvas_id].sprite[spr_index]; - if(!sprite->visible) - continue; - - physics_pos = sprite->physics.body->GetPosition(); - x = (int)physics_pos.x - offset_x; - y = (int)physics_pos.y - offset_y; - - int xf = x + sprite->frame_size.Width; - int yf = y + sprite->frame_size.Height; - - //std::cout << "sprite info: " << xf << ", " << x << ", " << rc_canvas[canvas_id].viewport.dimension.Width << std::endl; - - if( (xf < 0) || (x > ((int)rc_canvas[canvas_id].viewport.dimension.Width)) ) - { - //std::cout << "skip draw[X]: " << spr_index << std::endl; - continue; - } - - if( (yf < 0) || (y > ((int)rc_canvas[canvas_id].viewport.dimension.Height)) ) - { - //std::cout << "skip draw[Y]: " << spr_index << std::endl; - continue; - } - - position.set(x, y); - - int img_id = sprite->image_id; - if(img_id < 0 || img_id >= rc_image.size()) - continue; - - //src_size = rc_image[img_id].image->getSize(); - int current_animation = sprite->current_animation; - if((spr_timer - sprite->animation[current_animation].frame_start_time) >= sprite->animation[current_animation].frame_swap_time) - { - sprite->animation[current_animation].current_frame++; - - if(sprite->animation[current_animation].current_frame >= sprite->animation[current_animation].num_frames) - { - sprite->animation[current_animation].current_frame = 0; - sprite->current_animation_loop++; - - if(sprite->current_animation_loop >= sprite->num_animation_loops) - { - if(sprite->num_animation_loops < 0) - sprite->isPlaying = true; - else - sprite->isPlaying = false; - sprite->current_animation_loop = 0; - } - } - - if(!sprite->isPlaying) - sprite->animation[current_animation].current_frame = 0; - - sprite->animation[current_animation].frame_start_time = spr_timer; - } - - int current_animation_frame = sprite->animation[current_animation].current_frame; - - int frame_x = (int)(sprite->animation[current_animation].frames[current_animation_frame]%sprite->frames_per_row)*sprite->frame_size.Width; - int frame_y = (int)(sprite->animation[current_animation].frames[current_animation_frame]/sprite->frames_per_row)*sprite->frame_size.Height; - irr::core::vector2d frame_pos(frame_x, frame_y); - src_size = sprite->frame_size; - sourceRect = irr::core::rect( frame_pos, src_size); - //sourceRect = irr::core::rect( irr::core::vector2d(0, 0), src_size); - - //physics_pos = sprite->physics.body->GetPosition(); - //x = (int)physics_pos.x; - //y = (int)physics_pos.y; - //position.set(x, y); - - - rotationPoint.set(x + (src_size.Width/2), y + (src_size.Height/2)); //TODO: need to account for offset once that is implemented - rotation = -1 * (sprite->physics.body->GetAngle() * RAD_TO_DEG); //convert Box2D radians to degrees - - scale.set(sprite->scale.X, sprite->scale.Y); - - color.set(sprite->alpha, - sprite->color_mod.getRed(), - sprite->color_mod.getGreen(), - sprite->color_mod.getBlue()); - - //I don't want to draw an image that doesn't exists. Thats just crazy. - draw2DImage(VideoDriver, rc_image[img_id].image, sourceRect, position, rotationPoint, rotation, scale, useAlphaChannel, color, screenSize); - } - //Must set back to canvas 0 (the backbuffer) before returning - - VideoDriver->setRenderTarget(rc_canvas[0].texture, false, false); -} - -//-----------------------------END OF SPRITE STUFF------------------------------------------------------------------------------ - -#endif // RC_SPRITELIB_H_INCLUDED From fe5b5bc389666ca17c355bfb4aaece9845a73130 Mon Sep 17 00:00:00 2001 From: arc1tec4 Date: Mon, 11 Nov 2024 16:37:36 -0700 Subject: [PATCH 11/19] Delete getspritegravity.txt --- getspritegravity.txt | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 getspritegravity.txt diff --git a/getspritegravity.txt b/getspritegravity.txt deleted file mode 100644 index fcf8f4e..0000000 --- a/getspritegravity.txt +++ /dev/null @@ -1,6 +0,0 @@ -#title GetSpriteGravity [RCBasic Doc] -#header sub GetSpriteGravity(ByRef x, ByRef y) - -Use this function for retrieving the global gravity vector. - -#ref SetSpriteGravity From a0b3025848dea6dfa677c2ae5b35ea7c7c912123 Mon Sep 17 00:00:00 2001 From: arc1tec4 Date: Mon, 11 Nov 2024 16:38:26 -0700 Subject: [PATCH 12/19] Add files via upload --- doc/files/getgravity2d.txt | 6 ++++++ doc/files/setgravity2d.txt | 6 ++++++ 2 files changed, 12 insertions(+) create mode 100644 doc/files/getgravity2d.txt create mode 100644 doc/files/setgravity2d.txt diff --git a/doc/files/getgravity2d.txt b/doc/files/getgravity2d.txt new file mode 100644 index 0000000..a181a73 --- /dev/null +++ b/doc/files/getgravity2d.txt @@ -0,0 +1,6 @@ +#title GetGravity2D [RCBasic Doc] +#header sub GetGravity2D(ByRef x, ByRef y) + +Use this function for retrieving the global gravity vector. A sprite canvas layer must be open. + +#ref SetGravity2D diff --git a/doc/files/setgravity2d.txt b/doc/files/setgravity2d.txt new file mode 100644 index 0000000..c3a667d --- /dev/null +++ b/doc/files/setgravity2d.txt @@ -0,0 +1,6 @@ +#title SetGravity2D [RCBasic Doc] +#header sub SetGravity2D(x, y) + +Use this function for setting the global gravity vector. A sprite canvas layer must be active. + +#ref GetGravity2D From 8fd6acbde31300a351333bb4cc6af39454f32cca Mon Sep 17 00:00:00 2001 From: arc1tec4 Date: Mon, 11 Nov 2024 16:39:14 -0700 Subject: [PATCH 13/19] Delete doc/files/setspritegravity.txt --- doc/files/setspritegravity.txt | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 doc/files/setspritegravity.txt diff --git a/doc/files/setspritegravity.txt b/doc/files/setspritegravity.txt deleted file mode 100644 index a5f6154..0000000 --- a/doc/files/setspritegravity.txt +++ /dev/null @@ -1,6 +0,0 @@ -#title SetSpriteGravity [RCBasic Doc] -#header sub SetSpriteGravity(x, y) - -Use this function for setting the global gravity vector. - -#ref GetSpriteGravity From b4b18b4860f5b779e8b72e5463c6a575fa52dc37 Mon Sep 17 00:00:00 2001 From: arc1tec4 Date: Mon, 11 Nov 2024 16:39:35 -0700 Subject: [PATCH 14/19] Delete doc/files/getspritegravity.txt --- doc/files/getspritegravity.txt | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 doc/files/getspritegravity.txt diff --git a/doc/files/getspritegravity.txt b/doc/files/getspritegravity.txt deleted file mode 100644 index fcf8f4e..0000000 --- a/doc/files/getspritegravity.txt +++ /dev/null @@ -1,6 +0,0 @@ -#title GetSpriteGravity [RCBasic Doc] -#header sub GetSpriteGravity(ByRef x, ByRef y) - -Use this function for retrieving the global gravity vector. - -#ref SetSpriteGravity From 3e2b01d7943bdc816e8a85abab2c70a6224d51bf Mon Sep 17 00:00:00 2001 From: arc1tec4 Date: Mon, 11 Nov 2024 16:39:51 -0700 Subject: [PATCH 15/19] Delete doc/doc_files/getspritegravity.html --- doc/doc_files/getspritegravity.html | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 doc/doc_files/getspritegravity.html diff --git a/doc/doc_files/getspritegravity.html b/doc/doc_files/getspritegravity.html deleted file mode 100644 index 976bef4..0000000 --- a/doc/doc_files/getspritegravity.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - GetSpriteGravity [RCBasic Doc] - - - -

sub GetSpriteGravity(ByRef x, ByRef y)

-

- Use this function for retrieving the global gravity vector. -

-

Related: - SetSpriteGravity -

-

- - - \ No newline at end of file From 5221ac5e8f39c9559f576c1038c847268dbd5d6d Mon Sep 17 00:00:00 2001 From: arc1tec4 Date: Mon, 11 Nov 2024 16:40:14 -0700 Subject: [PATCH 16/19] Delete doc/doc_files/setspritegravity.html --- doc/doc_files/setspritegravity.html | 20 -------------------- 1 file changed, 20 deletions(-) delete mode 100644 doc/doc_files/setspritegravity.html diff --git a/doc/doc_files/setspritegravity.html b/doc/doc_files/setspritegravity.html deleted file mode 100644 index 7cf20d4..0000000 --- a/doc/doc_files/setspritegravity.html +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - SetSpriteGravity [RCBasic Doc] - - - -

sub SetSpriteGravity(x, y)

-

- Use this function for setting the global gravity vector. -

-

Related: - GetSpriteGravity -

-

- - - \ No newline at end of file From cf6feab5c133c5f5151f1bb24cc9404f9a029f44 Mon Sep 17 00:00:00 2001 From: arc1tec4 Date: Mon, 11 Nov 2024 16:41:10 -0700 Subject: [PATCH 17/19] Add files via upload --- doc/doc_files/getgravity2d.html | 20 ++++++++++++++++++++ doc/doc_files/setgravity2d.html | 20 ++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 doc/doc_files/getgravity2d.html create mode 100644 doc/doc_files/setgravity2d.html diff --git a/doc/doc_files/getgravity2d.html b/doc/doc_files/getgravity2d.html new file mode 100644 index 0000000..030e929 --- /dev/null +++ b/doc/doc_files/getgravity2d.html @@ -0,0 +1,20 @@ + + + + + + GetGravity2D [RCBasic Doc] + + + +

sub GetGravity2D(ByRef x, ByRef y)

+

+ Use this function for retrieving the global gravity vector. A sprite canvas layer must be open. +

+

Related: + SetGravity2D +

+

+ + + \ No newline at end of file diff --git a/doc/doc_files/setgravity2d.html b/doc/doc_files/setgravity2d.html new file mode 100644 index 0000000..e231e64 --- /dev/null +++ b/doc/doc_files/setgravity2d.html @@ -0,0 +1,20 @@ + + + + + + SetGravity2D [RCBasic Doc] + + + +

sub SetGravity2D(x, y)

+

+ Use this function for setting the global gravity vector. A sprite canvas layer must be active. +

+

Related: + GetGravity2D +

+

+ + + \ No newline at end of file From 78e3281bf3090d15a5dafb9036531615c8faa1ec Mon Sep 17 00:00:00 2001 From: arc1tec4 Date: Mon, 11 Nov 2024 16:44:14 -0700 Subject: [PATCH 18/19] Fixed-Hopefully functions --- rcbasic_runtime/rc_spritelib.h | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/rcbasic_runtime/rc_spritelib.h b/rcbasic_runtime/rc_spritelib.h index 0796d64..31037f1 100644 --- a/rcbasic_runtime/rc_spritelib.h +++ b/rcbasic_runtime/rc_spritelib.h @@ -787,19 +787,20 @@ bool rc_spriteIsVisible(int spr_id) return rc_sprite[spr_id].visible; } -void rc_setSpriteGravity(double x, double y) +void rc_setGravity2d(double x, double y) { if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size()) return; - if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE) + if(rc_canvas[r].type != RC_CANVAS_TYPE_SPRITE) return; b2Vec2 gravity(x, y); - b2World(gravity); + rc_canvas[rc_active_canvas].physics2D.world.SetGravity(gravity); + } -void rc_getSpriteGravity(double* x, double* y) +void rc_getGravity2d(double* x, double* y) { if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size()) return; @@ -810,8 +811,8 @@ void rc_getSpriteGravity(double* x, double* y) *x = 0; *y = 0; - *x = b2World.GetGravity().x; - *y = b2World.GetGravity().y; + *x = rc_canvas[rc_active_canvas].physics2D.world.GetGravity().x; + *y = rc_canvas[rc_active_canvas].physics2D.world.GetGravity().y; } From 9e61ea1c5e3e2e8f96f03962d2f8c31184a0d696 Mon Sep 17 00:00:00 2001 From: arc1tec4 Date: Mon, 11 Nov 2024 20:02:07 -0700 Subject: [PATCH 19/19] Add files via upload --- rcbasic_runtime/rc_spritelib.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rcbasic_runtime/rc_spritelib.h b/rcbasic_runtime/rc_spritelib.h index 31037f1..d24dfe7 100644 --- a/rcbasic_runtime/rc_spritelib.h +++ b/rcbasic_runtime/rc_spritelib.h @@ -792,11 +792,11 @@ void rc_setGravity2d(double x, double y) if(rc_active_canvas < 0 || rc_active_canvas >= rc_canvas.size()) return; - if(rc_canvas[r].type != RC_CANVAS_TYPE_SPRITE) + if(rc_canvas[rc_active_canvas].type != RC_CANVAS_TYPE_SPRITE) return; b2Vec2 gravity(x, y); - rc_canvas[rc_active_canvas].physics2D.world.SetGravity(gravity); + rc_canvas[rc_active_canvas].physics2D.world->SetGravity(gravity); } @@ -811,8 +811,8 @@ void rc_getGravity2d(double* x, double* y) *x = 0; *y = 0; - *x = rc_canvas[rc_active_canvas].physics2D.world.GetGravity().x; - *y = rc_canvas[rc_active_canvas].physics2D.world.GetGravity().y; + *x = rc_canvas[rc_active_canvas].physics2D.world->GetGravity().x; + *y = rc_canvas[rc_active_canvas].physics2D.world->GetGravity().y; }