get the bird to jump!
i added deltatime so the bird should hopefully have the same speed if the framerate drops or if you play in PAL 50hz mode.
This commit is contained in:
parent
3362687710
commit
fc7ca18fd7
6 changed files with 56 additions and 14 deletions
Binary file not shown.
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 7.3 KiB |
|
@ -20,6 +20,8 @@ const PAD_BUTTON_A = 0x0100;
|
||||||
const RED_COLOR = rgba(255, 0, 0, 255);
|
const RED_COLOR = rgba(255, 0, 0, 255);
|
||||||
const GREEN_COLOR = rgba(0, 255, 0, 255);
|
const GREEN_COLOR = rgba(0, 255, 0, 255);
|
||||||
const WHITE_COLOR = rgba(255, 255, 255, 255);
|
const WHITE_COLOR = rgba(255, 255, 255, 255);
|
||||||
|
const FALLING_SPEED = 250;
|
||||||
|
const TERMINAL_VELOCITY_SPEED = 500;
|
||||||
|
|
||||||
function rgba_compare(rgba1, rgba2) {
|
function rgba_compare(rgba1, rgba2) {
|
||||||
return (rgba1[0] == rgba2[0]) &&
|
return (rgba1[0] == rgba2[0]) &&
|
||||||
|
@ -28,13 +30,26 @@ function rgba_compare(rgba1, rgba2) {
|
||||||
(rgba1[3] == rgba2[3]);
|
(rgba1[3] == rgba2[3]);
|
||||||
}
|
}
|
||||||
|
|
||||||
globalThis.rectangle_color = RED_COLOR;
|
/**
|
||||||
|
* clamps a number to the min and max values.
|
||||||
|
* @param {number} num
|
||||||
|
* @param {number} min
|
||||||
|
* @param {number} max
|
||||||
|
* @returns a clamped number
|
||||||
|
*/
|
||||||
|
function clamp(num, min, max) {
|
||||||
|
return Math.min(Math.max(num, min), max);
|
||||||
|
}
|
||||||
|
|
||||||
|
globalThis.rectangle_color = RED_COLOR;
|
||||||
/** @type {GRRLibTexture} */
|
/** @type {GRRLibTexture} */
|
||||||
globalThis.background = null;
|
globalThis.background = null;
|
||||||
/** @type {GRRLibTexture} */
|
/** @type {GRRLibTexture} */
|
||||||
globalThis.bird = null;
|
globalThis.bird = null;
|
||||||
|
|
||||||
|
globalThis.bird_velocity = 0;
|
||||||
|
globalThis.bird_position = 0;
|
||||||
|
|
||||||
function swap_colors() {
|
function swap_colors() {
|
||||||
if (rgba_compare(rectangle_color, RED_COLOR)) {
|
if (rgba_compare(rectangle_color, RED_COLOR)) {
|
||||||
rectangle_color = GREEN_COLOR;
|
rectangle_color = GREEN_COLOR;
|
||||||
|
@ -51,6 +66,14 @@ function start() {
|
||||||
globalThis.bird = wii.grrlib.load_texture(bird);
|
globalThis.bird = wii.grrlib.load_texture(bird);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function update_bird() {
|
||||||
|
const deltatime = wii.get_deltatime();
|
||||||
|
bird_position -= bird_velocity * deltatime;
|
||||||
|
bird_velocity = clamp(bird_velocity - (FALLING_SPEED * deltatime), -TERMINAL_VELOCITY_SPEED, TERMINAL_VELOCITY_SPEED);
|
||||||
|
|
||||||
|
wii.grrlib.draw_img(0, bird_position, bird, 0, 1, 1, WHITE_COLOR);
|
||||||
|
}
|
||||||
|
|
||||||
function update() {
|
function update() {
|
||||||
const pressed = wii.pad.buttons_down();
|
const pressed = wii.pad.buttons_down();
|
||||||
|
|
||||||
|
@ -60,11 +83,10 @@ function update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pressed & PAD_BUTTON_A) {
|
if (pressed & PAD_BUTTON_A) {
|
||||||
wii.print("a pressed");
|
bird_velocity = FALLING_SPEED;
|
||||||
swap_colors();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wii.grrlib.fill_screen(WHITE_COLOR);
|
|
||||||
wii.grrlib.draw_img(0, 0, background, 0, 1, 1, WHITE_COLOR);
|
wii.grrlib.draw_img(0, 0, background, 0, 1, 1, WHITE_COLOR);
|
||||||
wii.grrlib.draw_img(0, 0, bird, 0, 1, 1, WHITE_COLOR);
|
update_bird();
|
||||||
|
wii.print("deltatime: " + wii.get_deltatime())
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,14 +2,18 @@
|
||||||
#include <duktape.h>
|
#include <duktape.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <ogc/lwp_watchdog.h>
|
||||||
|
|
||||||
#include "data.h"
|
#include "data.h"
|
||||||
#include "wii_duk.h"
|
#include "wii_duk.h"
|
||||||
|
|
||||||
|
const float MICROSECOND = 0.000001f;
|
||||||
|
|
||||||
extern const char * program;
|
extern const char * program;
|
||||||
static bool running = true;
|
static bool running = true;
|
||||||
static GRRLIB_ttfFont * font;
|
static GRRLIB_ttfFont * font;
|
||||||
static unsigned int green = RGBA(0, 255, 0, 255);
|
static unsigned int green = RGBA(0, 255, 0, 255);
|
||||||
|
static float deltatime = 1.0f/60;
|
||||||
|
|
||||||
static void duk_fatal_error(void *udata, const char *msg) {
|
static void duk_fatal_error(void *udata, const char *msg) {
|
||||||
const char * err_message_format = "an error has occured: %s";
|
const char * err_message_format = "an error has occured: %s";
|
||||||
|
@ -36,7 +40,7 @@ int main(int argc, char **argv) {
|
||||||
duk_context * ctx = duk_create_heap(NULL, NULL, NULL, NULL, duk_fatal_error);
|
duk_context * ctx = duk_create_heap(NULL, NULL, NULL, NULL, duk_fatal_error);
|
||||||
|
|
||||||
// create a wii object on the global object (globalThis)
|
// create a wii object on the global object (globalThis)
|
||||||
define_wii_object(ctx, font, &running);
|
define_wii_object(ctx, font, &running, &deltatime);
|
||||||
duk_put_global_string(ctx, "wii");
|
duk_put_global_string(ctx, "wii");
|
||||||
|
|
||||||
// evaluate functions from game.js
|
// evaluate functions from game.js
|
||||||
|
@ -48,6 +52,8 @@ int main(int argc, char **argv) {
|
||||||
duk_pop(ctx);
|
duk_pop(ctx);
|
||||||
|
|
||||||
while (running) {
|
while (running) {
|
||||||
|
const unsigned int beginningOfFrame = ticks_to_microsecs(gettime());
|
||||||
|
|
||||||
PAD_ScanPads();
|
PAD_ScanPads();
|
||||||
|
|
||||||
// call update function
|
// call update function
|
||||||
|
@ -56,6 +62,9 @@ int main(int argc, char **argv) {
|
||||||
duk_pop(ctx);
|
duk_pop(ctx);
|
||||||
|
|
||||||
GRRLIB_Render();
|
GRRLIB_Render();
|
||||||
|
|
||||||
|
const unsigned int endOfFrame = ticks_to_microsecs(gettime());
|
||||||
|
deltatime = (endOfFrame - beginningOfFrame) * MICROSECOND;
|
||||||
}
|
}
|
||||||
|
|
||||||
duk_destroy_heap(ctx);
|
duk_destroy_heap(ctx);
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
static GRRLIB_ttfFont * font;
|
static GRRLIB_ttfFont * font;
|
||||||
static bool * running;
|
static bool * running;
|
||||||
static unsigned int green = RGBA(0, 255, 0, 255);
|
static unsigned int green = RGBA(0, 255, 0, 255);
|
||||||
|
static float * deltatime;
|
||||||
|
|
||||||
static duk_ret_t native_print(duk_context * ctx) {
|
static duk_ret_t native_print(duk_context * ctx) {
|
||||||
GRRLIB_PrintfTTF(0, 0, font, duk_to_string(ctx, 0), 32, green);
|
GRRLIB_PrintfTTF(0, 0, font, duk_to_string(ctx, 0), 32, green);
|
||||||
|
@ -17,7 +18,7 @@ static duk_ret_t native_exit(duk_context *ctx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static duk_ret_t pad_buttons_down(duk_context * ctx) {
|
static duk_ret_t pad_buttons_down(duk_context * ctx) {
|
||||||
u32 pressed = PAD_ButtonsDown(0);
|
unsigned int pressed = PAD_ButtonsDown(0);
|
||||||
duk_push_number(ctx, pressed);
|
duk_push_number(ctx, pressed);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -46,6 +47,11 @@ static duk_ret_t get_file(duk_context *ctx) {
|
||||||
return duk_error(ctx, DUK_ERR_ERROR, "Error trying to get the file %s.", filename);
|
return duk_error(ctx, DUK_ERR_ERROR, "Error trying to get the file %s.", filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static duk_ret_t get_deltatime(duk_context * ctx) {
|
||||||
|
duk_push_number(ctx, *deltatime);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
static void define_pad_object(duk_context *ctx) {
|
static void define_pad_object(duk_context *ctx) {
|
||||||
duk_idx_t pad_obj = duk_push_object(ctx);
|
duk_idx_t pad_obj = duk_push_object(ctx);
|
||||||
|
|
||||||
|
@ -53,9 +59,10 @@ static void define_pad_object(duk_context *ctx) {
|
||||||
duk_put_prop_string(ctx, pad_obj, "buttons_down");
|
duk_put_prop_string(ctx, pad_obj, "buttons_down");
|
||||||
}
|
}
|
||||||
|
|
||||||
void define_wii_object(duk_context *ctx, struct GRRLIB_Font * grrlib_font, bool * global_running) {
|
void define_wii_object(duk_context * ctx, struct GRRLIB_Font * grrlib_font, bool * global_running, float * global_deltatime) {
|
||||||
font = grrlib_font;
|
font = grrlib_font;
|
||||||
running = global_running;
|
running = global_running;
|
||||||
|
deltatime = global_deltatime;
|
||||||
|
|
||||||
duk_idx_t wii_obj = duk_push_object(ctx);
|
duk_idx_t wii_obj = duk_push_object(ctx);
|
||||||
|
|
||||||
|
@ -73,4 +80,7 @@ void define_wii_object(duk_context *ctx, struct GRRLIB_Font * grrlib_font, bool
|
||||||
|
|
||||||
duk_push_c_function(ctx, get_file, 1);
|
duk_push_c_function(ctx, get_file, 1);
|
||||||
duk_put_prop_string(ctx, wii_obj, "get_file");
|
duk_put_prop_string(ctx, wii_obj, "get_file");
|
||||||
|
|
||||||
|
duk_push_c_function(ctx, get_deltatime, 0);
|
||||||
|
duk_put_prop_string(ctx, wii_obj, "get_deltatime");
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,5 +2,5 @@
|
||||||
#define WII_DUK_H
|
#define WII_DUK_H
|
||||||
#include <duktape.h>
|
#include <duktape.h>
|
||||||
#include <grrlib.h>
|
#include <grrlib.h>
|
||||||
void define_wii_object(duk_context * ctx, struct GRRLIB_Font * grrlib_font, bool * global_running);
|
void define_wii_object(duk_context * ctx, struct GRRLIB_Font * grrlib_font, bool * global_running, float * global_deltatime);
|
||||||
#endif
|
#endif
|
||||||
|
|
1
types.d.ts
vendored
1
types.d.ts
vendored
|
@ -5,6 +5,7 @@ declare interface GRRLibTexture {}
|
||||||
declare namespace wii {
|
declare namespace wii {
|
||||||
function exit(): void
|
function exit(): void
|
||||||
function get_file(filename: string) : FilePtr
|
function get_file(filename: string) : FilePtr
|
||||||
|
function get_deltatime() : number
|
||||||
namespace grrlib {
|
namespace grrlib {
|
||||||
function load_texture(file: FilePtr) : GRRLibTexture
|
function load_texture(file: FilePtr) : GRRLibTexture
|
||||||
function fill_screen(color: RGBA): void
|
function fill_screen(color: RGBA): void
|
||||||
|
|
Loading…
Reference in a new issue