Start implementing ball catcher
This commit is contained in:
parent
b2553911b4
commit
970d45687c
Binary file not shown.
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue