From 6eadb09be3ba0a8587f82e311d5213842e74ac87 Mon Sep 17 00:00:00 2001 From: Ivan Mahonin Date: Sep 09 2020 17:34:53 +0000 Subject: groupDraw --- diff --git a/src/group.c b/src/group.c index 0600235..607f087 100644 --- a/src/group.c +++ b/src/group.c @@ -111,6 +111,19 @@ Sprite groupSpriteByPoint(Group group, double x, double y, int onlyVisible) { } +void groupDraw(Group group) { + heliSpriteSort(&group->spritesSorted); + for(int i = 0; i < group->spritesSorted.count; ++i) { + Sprite s = (Sprite)(group->spritesSorted.items[i].value); + if (spriteGetVisible(s)) heliSpriteDraw(s); + } + for(int i = 0; i < group->spritesSorted.count; ++i) { + Sprite s = (Sprite)(group->spritesSorted.items[i].value); + if (spriteGetDebug(s)) heliSpriteDrawDebug(s); + } +} + + int groupOverlap(Group group, Sprite sprite) { for(int i = 0; i < groupGetCount(group); ++i) if (spriteOverlap(groupGet(group, i), sprite)) @@ -215,6 +228,10 @@ void groupDestroyTimerEach(Group group, double lifetime) void groupSetVisibleEach(Group group, int visible) { foreachInt(group, visible, &spriteSetVisible); } +void groupSetFrozenEach(Group group, int frozen) + { foreachInt(group, frozen, &spriteSetFrozen); } +void groupSetDebugEach(Group group, int debug) + { foreachInt(group, debug, &spriteSetDebug); } void groupSetWidthEach(Group group, double width) { foreachDouble(group, width, &spriteSetWidth); } void groupSetHeightEach(Group group, double height) diff --git a/src/group.h b/src/group.h index a66d53e..0f2d9ed 100644 --- a/src/group.h +++ b/src/group.h @@ -31,6 +31,8 @@ void groupDestroyTimerEach(Group group, double lifetime); Sprite groupSpriteByPoint(Group group, double x, double y, int onlyVisible); +void groupDraw(Group group); + int groupOverlap(Group group, Sprite sprite); int groupCollide(Group group, Sprite sprite); int groupOverlapGroup(Group a, Group b); @@ -46,6 +48,8 @@ void groupSetAirFriction(Group group, double friction); void groupSetMassLevel(Group group, int massLevel); void groupSetVisibleEach(Group group, int visible); +void groupSetFrozenEach(Group group, int frozen); +void groupSetDebugEach(Group group, int debug); void groupSetWidthEach(Group group, double width); void groupSetHeightEach(Group group, double height); void groupSetDepthEach(Group group, double depth); diff --git a/src/private.h b/src/private.h index f576acf..bd0342c 100644 --- a/src/private.h +++ b/src/private.h @@ -265,6 +265,8 @@ typedef void (*HeliSpriteEashDouble)(Sprite, double); HeliArray* heliSpriteGetGroups(Sprite sprite); int heliSpriteCollisionCheck(Sprite a, Sprite b, HeliCollisionInfo *info); void heliSpriteCollisionApply(Sprite a, Sprite b, HeliCollisionInfo *info); +void heliSpriteDraw(Sprite sprite); +void heliSpriteDrawDebug(Sprite sprite); void heliSpriteSort(HeliArray *sprites); void heliSpriteUpdate(double dt); void heliSpriteFinish(); diff --git a/src/sprite.c b/src/sprite.c index 71a51d8..79af469 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -38,6 +38,7 @@ struct _Sprite { double depth; double lifeTime; int visible; + int frozen; int debug; double shapeColor[4]; @@ -244,6 +245,10 @@ int spriteGetVisible(Sprite sprite) { return sprite->visible; } void spriteSetVisible(Sprite sprite, int visible) { sprite->visible = visible != FALSE; } +int spriteGetFrozen(Sprite sprite) { return sprite->frozen; } +void spriteSetFrozen(Sprite sprite, int frozen) + { sprite->frozen = frozen != FALSE; } + int spriteGetDebug(Sprite sprite) { return sprite->debug; } void spriteSetDebug(Sprite sprite, int debug) { sprite->debug = debug != FALSE; } @@ -486,7 +491,7 @@ Sprite worldGetSprite(int i) { return (Sprite)heliArrayGetValue(&sprites, i); } -static void drawSpriteDebug(Sprite s) { +void heliSpriteDrawDebug(Sprite s) { saveState(); translate(s->x, s->y); rotate(s->rotation); @@ -519,7 +524,7 @@ static void drawSpriteDebug(Sprite s) { restoreState(); } -static void drawSprite(Sprite s) { +void heliSpriteDraw(Sprite s) { double w = 0.5*s->scale*s->width; double h = 0.5*s->scale*s->height; if (w < HELI_PRECISION || h < HELI_PRECISION) return; @@ -574,20 +579,22 @@ void heliSpriteSort(HeliArray *sprites) { } } + +void spriteDraw(Sprite sprite) { + if (sprite->visible) heliSpriteDraw(sprite); + if (sprite->debug) heliSpriteDrawDebug(sprite); +} + + void drawSprites() { - // sort heliSpriteSort(&spritesSorted); - - // draw for(int i = 0; i < spritesSorted.count; ++i) { Sprite s = (Sprite)(spritesSorted.items[i].value); - if (s->visible) drawSprite(s); + if (s->visible) heliSpriteDraw(s); } - - // draw debug marks for(int i = 0; i < spritesSorted.count; ++i) { Sprite s = (Sprite)(spritesSorted.items[i].value); - if (s->debug) drawSpriteDebug(s); + if (s->debug) heliSpriteDrawDebug(s); } } @@ -595,6 +602,7 @@ void heliSpriteUpdate(double dt) { // auto-remove for(int i = sprites.count - 1; i > 0; --i) { Sprite s = (Sprite)sprites.items[i].value; + if (s->frozen) continue; if (s->lifeTime >= -HELI_PRECISION) { s->lifeTime -= dt; if (s->lifeTime <= HELI_PRECISION) @@ -605,6 +613,7 @@ void heliSpriteUpdate(double dt) { // update for(int i = 0; i < sprites.count; ++i) { Sprite s = (Sprite)sprites.items[i].value; + if (s->frozen) continue; double vx = s->vx + s->ax*dt; double vy = s->vy + s->ay*dt; diff --git a/src/sprite.h b/src/sprite.h index c2dbc9f..6a5f425 100644 --- a/src/sprite.h +++ b/src/sprite.h @@ -72,6 +72,9 @@ void spriteSetDepth(Sprite sprite, double depth); int spriteGetVisible(Sprite sprite); void spriteSetVisible(Sprite sprite, int visible); +int spriteGetFrozen(Sprite sprite); +void spriteSetFrozen(Sprite sprite, int frozen); + int spriteGetDebug(Sprite sprite); void spriteSetDebug(Sprite sprite, int debug); @@ -137,5 +140,7 @@ void spriteSetUserData(Sprite sprite, void *data); void spriteSetDestroy(Sprite sprite, SpriteCallback destroy); +void spriteDraw(Sprite sprite); + #endif