summaryrefslogtreecommitdiff
path: root/kon/kon2d.h
diff options
context:
space:
mode:
Diffstat (limited to 'kon/kon2d.h')
-rw-r--r--kon/kon2d.h112
1 files changed, 112 insertions, 0 deletions
diff --git a/kon/kon2d.h b/kon/kon2d.h
new file mode 100644
index 0000000..7a58dc6
--- /dev/null
+++ b/kon/kon2d.h
@@ -0,0 +1,112 @@
+/* SPDX-License-Identifier: MIT */
+/*
+ * kon2d.h
+ *
+ * Copyright (c) 2026 KonAki
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#ifndef KON2D_H
+#define KON2D_H
+
+#include "konsofren.h"
+#include "koncollide.h"
+#include "kontile.h"
+
+/*** platformer ***/
+
+/* a box that runs and jumps through a tilemap. the game sets moveX and jumpHeld every frame, calls kon_platformerUpdate and reads
+ box, velocity and onGround back. everything is in map pixels and seconds. kon_platformerInit fills in the tuning values,
+ change them afterwards as you like */
+typedef struct kon_platformer {
+ kon_box2_t box;
+ kon_vec2_t velocity;
+ int onGround;
+
+ int moveX; /* -1 left, 0 stand, 1 right */
+ int jumpHeld;
+
+ float runSpeed;
+ float groundAccel, airAccel; /* how fast velocity.x closes in on the run speed, per second */
+ float gravity;
+ float jumpSpeed;
+ float jumpCut; /* letting go of jump early slows the rise to this speed */
+ float maxFall;
+ float coyoteTime; /* seconds after leaving a ledge a jump still works */
+ float bufferTime; /* seconds before landing a jump press is remembered */
+
+ /* private */
+ float coyote, buffer, leftover;
+ int jumpWas;
+} kon_platformer_t;
+
+void kon_platformerInit(kon_platformer_t *p, kon_box2_t box);
+
+/* one step of dt seconds, dt should be small and steady. returns the KON_HIT_ flags of the move */
+int kon_platformerStep(kon_platformer_t *p, const kon_tilemap_t *map, const uint8_t *solid, int solidCount, float dt);
+
+/* takes the frame time and runs steps of 1/120 of a second, so the jump feels the same at any frame rate */
+void kon_platformerUpdate(kon_platformer_t *p, const kon_tilemap_t *map, const uint8_t *solid, int solidCount, double dt);
+
+/*** camera ***/
+
+/* x, y is the map pixel at the top left of the view. bounds is the size of the map in pixels, the view never leaves it
+ (and a map smaller than the view is centred) */
+typedef struct kon_camera2 {
+ float x, y;
+ int viewWidth, viewHeight;
+ float boundsWidth, boundsHeight;
+ float stiffness; /* how quickly it catches up, around 6 to 12 feels right, 0 or less follows exactly */
+} kon_camera2_t;
+
+void kon_camera2Init(kon_camera2_t *cam, int viewWidth, int viewHeight, float boundsWidth, float boundsHeight);
+
+/* puts the target in the middle of the view at once */
+void kon_camera2Snap(kon_camera2_t *cam, float targetX, float targetY);
+
+/* eases towards having the target in the middle */
+void kon_camera2Follow(kon_camera2_t *cam, float targetX, float targetY, float dt);
+
+/* whole pixels, what to pass to kon_drawTilemap so nothing shimmers */
+int kon_camera2X(const kon_camera2_t *cam);
+int kon_camera2Y(const kon_camera2_t *cam);
+
+/*** animation ***/
+
+/* plays count frames starting at frame first of a sheet at fps frames a second */
+typedef struct kon_anim {
+ int first, count;
+ float fps;
+ int loop;
+ float time;
+} kon_anim_t;
+
+/* starts over, unless it is already playing the same thing */
+void kon_animPlay(kon_anim_t *anim, int first, int count, float fps, int loop);
+void kon_animStep(kon_anim_t *anim, float dt);
+
+/* the frame to draw, the last one when a non looping animation has finished */
+int kon_animFrame(const kon_anim_t *anim);
+int kon_animDone(const kon_anim_t *anim);
+
+/* draws frame index of a sheet of frameWidth by frameHeight frames with its top left at x, y */
+void kon_drawFrame(kon_framebuffer_t *fb, const kon_image *sheet, int frameWidth, int frameHeight, int index, int x, int y, int flip);
+
+#endif