diff options
Diffstat (limited to 'kon/kon2d.h')
| -rw-r--r-- | kon/kon2d.h | 112 |
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 |
