New intermediate object between actors and sprites, "characters". Characters consist of a properties map of states to sprites. TIle object layers specify character names, and those are fetched from the heap, and new actors are instantiated for those characters. Each actor is used exactly once, characters may be used by many actors.
Heap objects automatically increment their refcounts when fetched via heap_next_XXX() and their references decrement when released with heap_release_XXX(). When an objects refcount reaches zero, dynamic objects are freed and child reference counts are decremented.
This commit is contained in:
@@ -14,19 +14,15 @@
|
||||
#include "assets.h"
|
||||
#include "sprite.h"
|
||||
|
||||
spritesheet actorsheet;
|
||||
sprite littleguy;
|
||||
actor player;
|
||||
actor npc;
|
||||
|
||||
SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
|
||||
{
|
||||
SDL_AudioSpec spec;
|
||||
/* Initialize variables */
|
||||
spec.freq = MIX_DEFAULT_FREQUENCY;
|
||||
spec.format = MIX_DEFAULT_FORMAT;
|
||||
spec.channels = MIX_DEFAULT_CHANNELS;
|
||||
spritesheet *spritesheetptr = NULL;
|
||||
sprite *spriteptr = NULL;
|
||||
actor *actorptr = NULL;
|
||||
character *characterptr = NULL;
|
||||
|
||||
SDL_AudioSpec spec;
|
||||
exclib_init();
|
||||
exclib_name_exception(EXC_SDL_INIT, "SDL Initialization Failure");
|
||||
exclib_name_exception(EXC_SDL_MUSICMIXER, "SDL Music Mixer Failure");
|
||||
exclib_name_exception(EXC_GAME_UNDEFINED, "Undefined method or value");
|
||||
@@ -34,10 +30,12 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
|
||||
exclib_name_exception(EXC_TYPEERROR, "Type Error");
|
||||
exclib_name_exception(EXC_KEYERROR, "Key Error");
|
||||
|
||||
heap_init();
|
||||
registry_init_actor();
|
||||
registry_init_sprite();
|
||||
registry_init_spritesheet();
|
||||
|
||||
registry_init_character();
|
||||
|
||||
SDL_SetAppMetadata("SDL3-GameTest", "0.1", "net.aklabs.sdl3-gametest");
|
||||
|
||||
if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_AUDIO )) {
|
||||
@@ -52,6 +50,9 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
|
||||
|
||||
GAME_init_physics();
|
||||
|
||||
spec.freq = MIX_DEFAULT_FREQUENCY;
|
||||
spec.format = MIX_DEFAULT_FORMAT;
|
||||
spec.channels = MIX_DEFAULT_CHANNELS;
|
||||
if (!Mix_OpenAudio(0, &spec)) {
|
||||
SDL_Log("Couldn't initialize the audio subsystem: %s", SDL_GetError());
|
||||
return SDL_APP_FAILURE;
|
||||
@@ -64,43 +65,49 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[])
|
||||
}
|
||||
|
||||
TRY {
|
||||
load_frame_from_image("../assets/ball.png", &ball);
|
||||
load_frame_from_image("../assets/paddle-green.png", &paddle1);
|
||||
load_frame_from_image("../assets/paddle-red.png", &paddle2);
|
||||
load_frame_from_image("../assets/table.jpg", &table);
|
||||
|
||||
spritesheet_new(&actorsheet, 48, 48, "../assets/Actor1.png");
|
||||
spritesheetptr = heap_next_spritesheet();
|
||||
spritesheet_initialize(spritesheetptr, 48, 48, "../assets/Actor1.png");
|
||||
|
||||
sprite_new(&littleguy, "little guy facing down", &actorsheet);
|
||||
littleguy.width = 48;
|
||||
littleguy.height = 48;
|
||||
littleguy.speed = 100;
|
||||
littleguy.loop = true;
|
||||
littleguy.loopReverse = true;
|
||||
littleguy.frames = 3;
|
||||
littleguy.frameids[0] = 12;
|
||||
littleguy.frameids[1] = 13;
|
||||
littleguy.frameids[2] = 14;
|
||||
spriteptr = heap_next_sprite();
|
||||
sprite_initialize(spriteptr, "little guy facing left", spritesheetptr);
|
||||
spriteptr->width = 48;
|
||||
spriteptr->height = 48;
|
||||
spriteptr->speed = 100;
|
||||
spriteptr->loop = true;
|
||||
spriteptr->loopReverse = true;
|
||||
spriteptr->frames = 3;
|
||||
spriteptr->frameids[0] = 12;
|
||||
spriteptr->frameids[1] = 13;
|
||||
spriteptr->frameids[2] = 14;
|
||||
|
||||
characterptr = heap_next_character();
|
||||
character_initialize(characterptr, "little guy");
|
||||
character_sprite_add(characterptr,
|
||||
spriteptr,
|
||||
(ACTOR_STATE_ALIVE | ACTOR_STATE_FACE_LEFT | ACTOR_STATE_MOVING_LEFT));
|
||||
|
||||
actor_new(&player, "player");
|
||||
player.curSprite = &littleguy;
|
||||
player.x = 0;
|
||||
player.y = 0;
|
||||
actorptr = heap_next_actor();
|
||||
actor_initialize(actorptr, "player");
|
||||
actorptr->basechar = characterptr;
|
||||
actorptr->x = 0;
|
||||
actorptr->y = 0;
|
||||
actorptr->state = (ACTOR_STATE_ALIVE | ACTOR_STATE_FACE_LEFT | ACTOR_STATE_MOVING_LEFT);
|
||||
} CATCH(EXC_NULLPOINTER) {
|
||||
SDL_Log("Attempting to load asset: %s (%s)", EXCLIB_EXCEPTION->description, SDL_GetError());
|
||||
return SDL_APP_FAILURE;
|
||||
} ETRY;
|
||||
|
||||
TRY {
|
||||
actor_new(&npc, "npc");
|
||||
npc.curSprite = SDL_GetPointerProperty(REGISTRY_SPRITE, "little guy facing down", NULL);
|
||||
THROW_ZERO(npc.curSprite, EXC_NULLPOINTER, "'little guy facing down' was not found in the sprite registry");
|
||||
npc.x = 0;
|
||||
npc.y = 0;
|
||||
/*TRY {
|
||||
actorptr = heap_next_actor();
|
||||
actor_initialize(actorptr, "npc");
|
||||
actorptr->basechar = characterptr;
|
||||
actorptr->x = 0;
|
||||
actorptr->y = 0;
|
||||
actorptr->state = (ACTOR_STATE_ALIVE | ACTOR_STATE_FACE_LEFT | ACTOR_STATE_MOVING_LEFT);
|
||||
} CATCH(EXC_NULLPOINTER) {
|
||||
SDL_Log("Attempting to setup npc: %s (%s)", EXCLIB_EXCEPTION->description, SDL_GetError());
|
||||
return SDL_APP_FAILURE;
|
||||
} ETRY;
|
||||
} ETRY;*/
|
||||
|
||||
/*
|
||||
TRY {
|
||||
|
||||
Reference in New Issue
Block a user