2024-06-19 07:39:01 +00:00
|
|
|
const PAD_BUTTON_START = 0x1000;
|
|
|
|
const PAD_BUTTON_A = 0x0100;
|
2024-06-25 00:37:38 +00:00
|
|
|
const RED_COLOR = wii.rgba(255, 0, 0, 255);
|
|
|
|
const GREEN_COLOR = wii.rgba(0, 255, 0, 255);
|
|
|
|
const WHITE_COLOR = wii.rgba(255, 255, 255, 255);
|
|
|
|
|
2024-06-22 05:57:08 +00:00
|
|
|
const FALLING_SPEED = 250;
|
|
|
|
const TERMINAL_VELOCITY_SPEED = 500;
|
2024-06-25 00:37:38 +00:00
|
|
|
const PIPE_SPAWN_TIME = 4;
|
|
|
|
const PIPE_MAX_TIME = 5;
|
2024-06-20 06:37:41 +00:00
|
|
|
|
2024-06-25 01:31:56 +00:00
|
|
|
/**
|
|
|
|
* throws if input is nullish.
|
|
|
|
* @template T
|
|
|
|
* @param {T | null | undefined} value
|
|
|
|
* @returns {T}
|
|
|
|
*/
|
|
|
|
function nonNull(value) {
|
|
|
|
if (value == null) {
|
|
|
|
throw new Error("unexpected " + (value === null ? 'null' : 'undefined'))
|
|
|
|
}
|
|
|
|
return value
|
|
|
|
}
|
|
|
|
|
2024-06-22 05:57:08 +00:00
|
|
|
/**
|
|
|
|
* 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);
|
|
|
|
}
|
2024-06-21 07:45:28 +00:00
|
|
|
|
2024-06-25 01:31:56 +00:00
|
|
|
/**
|
|
|
|
* picks a random number between the min and max values.
|
|
|
|
* @param {number} min
|
|
|
|
* @param {number} max
|
|
|
|
* @returns a random number
|
|
|
|
*/
|
2024-06-25 00:37:38 +00:00
|
|
|
function random_range(min, max) {
|
|
|
|
const minCeiled = Math.ceil(min);
|
|
|
|
const maxFloored = Math.floor(max);
|
|
|
|
return Math.floor(Math.random() * (maxFloored - minCeiled) + minCeiled);
|
|
|
|
}
|
|
|
|
|
2024-06-25 01:31:56 +00:00
|
|
|
/** @type {GRRLibTexture | null} */
|
2024-06-21 01:41:49 +00:00
|
|
|
globalThis.background = null;
|
2024-06-25 00:37:38 +00:00
|
|
|
|
2024-06-25 01:31:56 +00:00
|
|
|
/** @type {{velocity: number, position: number, texture?: GRRLibTexture}} */
|
2024-06-25 00:37:38 +00:00
|
|
|
globalThis.bird = {
|
|
|
|
velocity: 0,
|
|
|
|
position: 0
|
|
|
|
};
|
|
|
|
|
2024-06-25 01:31:56 +00:00
|
|
|
/** @type {GRRLibTexture | null} */
|
2024-06-25 00:37:38 +00:00
|
|
|
globalThis.pipe = null;
|
2024-06-20 06:37:41 +00:00
|
|
|
|
2024-06-25 01:31:56 +00:00
|
|
|
/** @type {GRRLibTexture | null} */
|
2024-06-25 00:37:38 +00:00
|
|
|
globalThis.pipe_flipped = null;
|
2024-06-22 05:57:08 +00:00
|
|
|
|
2024-06-25 00:37:38 +00:00
|
|
|
/** @type {Pipe[]} */
|
|
|
|
globalThis.pipes = [];
|
|
|
|
|
|
|
|
/** @type {number} */
|
|
|
|
globalThis.timer = 0;
|
2024-06-19 07:39:01 +00:00
|
|
|
|
2024-06-20 04:08:16 +00:00
|
|
|
function start() {
|
2024-06-21 01:41:49 +00:00
|
|
|
const background = wii.get_file("background-day.png");
|
|
|
|
const bird = wii.get_file("yellowbird-midflap.png");
|
2024-06-25 00:37:38 +00:00
|
|
|
const pipe = wii.get_file("pipe-green.png");
|
|
|
|
const pipe_flipped = wii.get_file("pipe-green-flipped.png");
|
2024-06-21 01:41:49 +00:00
|
|
|
|
|
|
|
globalThis.background = wii.grrlib.load_texture(background);
|
2024-06-25 00:37:38 +00:00
|
|
|
globalThis.bird.texture = wii.grrlib.load_texture(bird);
|
|
|
|
globalThis.pipe = wii.grrlib.load_texture(pipe);
|
|
|
|
globalThis.pipe_flipped = wii.grrlib.load_texture(pipe_flipped);
|
2024-06-20 04:08:16 +00:00
|
|
|
}
|
2024-06-19 07:39:01 +00:00
|
|
|
|
2024-06-22 05:57:08 +00:00
|
|
|
function update_bird() {
|
|
|
|
const deltatime = wii.get_deltatime();
|
2024-06-25 00:37:38 +00:00
|
|
|
bird.position -= bird.velocity * deltatime;
|
|
|
|
bird.velocity = clamp(bird.velocity - (FALLING_SPEED * deltatime), -TERMINAL_VELOCITY_SPEED, TERMINAL_VELOCITY_SPEED);
|
2024-06-25 01:31:56 +00:00
|
|
|
|
|
|
|
wii.grrlib.draw_img(0, bird.position, nonNull(bird.texture), 0, 1, 1, WHITE_COLOR);
|
2024-06-25 00:37:38 +00:00
|
|
|
}
|
|
|
|
|
2024-06-25 01:50:57 +00:00
|
|
|
function Pipe() {
|
2024-06-25 00:37:38 +00:00
|
|
|
const top_max = 200;
|
|
|
|
const top_y = random_range(0, top_max);
|
|
|
|
|
2024-06-25 01:31:56 +00:00
|
|
|
wii.grrlib.draw_img(100, -top_y, nonNull(pipe_flipped), 0, 1, 1, WHITE_COLOR);
|
|
|
|
wii.grrlib.draw_img(100, top_y + 400, nonNull(pipe), 0, 1, 1, WHITE_COLOR);
|
2024-06-25 00:37:38 +00:00
|
|
|
|
2024-06-25 01:50:57 +00:00
|
|
|
this.top_y = -top_y
|
|
|
|
this.bottom_y = -top_y + 400
|
|
|
|
this.position = 650
|
|
|
|
this.time_active = 0
|
2024-06-25 00:37:38 +00:00
|
|
|
}
|
|
|
|
|
2024-06-25 01:50:57 +00:00
|
|
|
Pipe.prototype.update = function () {
|
|
|
|
if (this.time_active >= PIPE_MAX_TIME) {
|
|
|
|
const index = pipes.indexOf(this);
|
2024-06-25 00:37:38 +00:00
|
|
|
pipes.splice(index, -1);
|
|
|
|
return;
|
|
|
|
}
|
2024-06-25 01:50:57 +00:00
|
|
|
wii.grrlib.draw_img(this.position, this.top_y, nonNull(pipe_flipped), 0, 1, 1, WHITE_COLOR);
|
|
|
|
wii.grrlib.draw_img(this.position, this.bottom_y, nonNull(pipe), 0, 1, 1, WHITE_COLOR);
|
|
|
|
this.position -= 100 * wii.get_deltatime();
|
|
|
|
this.time_active += wii.get_deltatime();
|
2024-06-22 05:57:08 +00:00
|
|
|
}
|
|
|
|
|
2024-06-20 04:08:16 +00:00
|
|
|
function update() {
|
2024-06-19 07:39:01 +00:00
|
|
|
const pressed = wii.pad.buttons_down();
|
|
|
|
|
|
|
|
if (pressed & PAD_BUTTON_START) {
|
|
|
|
wii.print("exiting from js");
|
|
|
|
wii.exit();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (pressed & PAD_BUTTON_A) {
|
2024-06-25 00:37:38 +00:00
|
|
|
bird.velocity = FALLING_SPEED;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (timer >= PIPE_SPAWN_TIME) {
|
2024-06-25 01:31:56 +00:00
|
|
|
globalThis.timer = 0;
|
2024-06-25 00:37:38 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (timer == 0) {
|
2024-06-25 01:50:57 +00:00
|
|
|
pipes.push(new Pipe());
|
2024-06-19 07:39:01 +00:00
|
|
|
}
|
|
|
|
|
2024-06-25 01:31:56 +00:00
|
|
|
wii.grrlib.draw_img(0, 0, nonNull(background), 0, 1, 1, WHITE_COLOR);
|
2024-06-22 05:57:08 +00:00
|
|
|
update_bird();
|
2024-06-25 00:37:38 +00:00
|
|
|
for (var i = 0; i < pipes.length; i++) {
|
2024-06-25 01:50:57 +00:00
|
|
|
pipes[i].update();
|
2024-06-25 00:37:38 +00:00
|
|
|
}
|
2024-06-22 05:57:08 +00:00
|
|
|
wii.print("deltatime: " + wii.get_deltatime())
|
2024-06-25 01:31:56 +00:00
|
|
|
globalThis.timer += wii.get_deltatime();
|
2024-06-19 07:39:01 +00:00
|
|
|
}
|