Start implementing ball catcher

This commit is contained in:
James Lambert 2023-01-20 21:50:13 -07:00
parent b2553911b4
commit 970d45687c
4 changed files with 55 additions and 2 deletions

View file

@ -63,6 +63,8 @@ void ballCatcherInit(struct BallCatcher* catcher, struct BallCatcherDefinition*
catcher->signalIndex = definition->signalIndex;
catcher->flags = 0;
collisionObjectUpdateBB(&catcher->collisionObject);
catcher->dynamicId = dynamicSceneAdd(catcher, ballCatcherRender, &catcher->rigidBody.transform, 1.0f);
@ -73,6 +75,40 @@ void ballCatcherInit(struct BallCatcher* catcher, struct BallCatcherDefinition*
skArmatureInit(&catcher->armature, &props_combine_ball_catcher_armature);
}
void ballCatcherUpdate(struct BallCatcher* catcher) {
void ballCatcherCheckBalls(struct BallCatcher* catcher, struct BallLauncher* ballLaunchers, int ballLauncherCount) {
if (catcher->flags & BallCatcherFlagsCaught) {
return;
}
for (int i = 0; i < ballLauncherCount; ++i) {
struct BallLauncher* launcher = &ballLaunchers[i];
if (!ballIsActive(&launcher->currentBall)) {
continue;
}
struct Simplex simplex;
if (!gjkCheckForOverlap(
&simplex,
&catcher->collisionObject,
minkowsiSumAgainstObject,
&launcher->currentBall.collisionObject,
minkowsiSumAgainstObject,
&launcher->currentBall.rigidBody.velocity)) {
continue;
}
catcher->flags |= BallCatcherFlagsCaught;
skAnimatorRunClip(&catcher->animator, &props_combine_ball_catcher_Armature_catch_clip, 0.0f, 0);
}
}
void ballCatcherUpdate(struct BallCatcher* catcher, struct BallLauncher* ballLaunchers, int ballLauncherCount) {
skAnimatorUpdate(&catcher->animator, catcher->armature.pose, FIXED_DELTA_TIME);
if (catcher->flags & BallCatcherFlagsCaught) {
signalsSend(catcher->signalIndex);
} else {
ballCatcherCheckBalls(catcher, ballLaunchers, ballLauncherCount);
}
}

View file

@ -8,6 +8,12 @@
#include "../levels/level_definition.h"
#include "./ball_launcher.h"
enum BallCatcherFlags {
BallCatcherFlagsCaught = (1 << 0),
};
struct BallCatcher {
struct CollisionObject collisionObject;
struct RigidBody rigidBody;
@ -15,9 +21,10 @@ struct BallCatcher {
struct SKAnimator animator;
short dynamicId;
short signalIndex;
short flags;
};
void ballCatcherInit(struct BallCatcher* catcher, struct BallCatcherDefinition* definition);
void ballCatcherUpdate(struct BallCatcher* catcher);
void ballCatcherUpdate(struct BallCatcher* catcher, struct BallLauncher* ballLaunchers, int ballLauncherCount);
#endif

View file

@ -153,6 +153,12 @@ void sceneInit(struct Scene* scene) {
ballLauncherInit(&scene->ballLaunchers[i], &gCurrentLevel->ballLaunchers[i]);
}
scene->ballCatcherCount = gCurrentLevel->ballCatcherCount;
scene->ballCatchers = malloc(sizeof(struct BallCatcher) * scene->ballCatcherCount);
for (int i = 0; i < scene->ballCatcherCount; ++i) {
ballCatcherInit(&scene->ballCatchers[i], &gCurrentLevel->ballCatchers[i]);
}
scene->freeCameraOffset = gZeroVec;
sceneInitDynamicColliders(scene);
@ -430,6 +436,10 @@ void sceneUpdate(struct Scene* scene) {
ballLauncherUpdate(&scene->ballLaunchers[i]);
}
for (int i = 0; i < scene->ballCatcherCount; ++i) {
ballCatcherUpdate(&scene->ballCatchers[i], scene->ballLaunchers, scene->ballLancherCount);
}
sceneAnimatorUpdate(&scene->animator);
sceneUpdatePortalVelocity(scene);
sceneUpdateAnimatedObjects(scene);