add pipes to the game.
they can move! no collision yet. the numbers still need a bit of tweaking though.
This commit is contained in:
parent
fc7ca18fd7
commit
123d151c57
9 changed files with 143 additions and 52 deletions
BIN
data/pipe-green-flipped.png
Normal file
BIN
data/pipe-green-flipped.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.8 KiB |
BIN
data/pipe-green.png
Normal file
BIN
data/pipe-green.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.7 KiB |
|
@ -12,7 +12,7 @@ add_custom_command(
|
||||||
COMMENT "Creating data_generated.c from the data directory"
|
COMMENT "Creating data_generated.c from the data directory"
|
||||||
)
|
)
|
||||||
|
|
||||||
add_executable(WiiDuktape main.c grrlib_duk.c wii_duk.c game.c data_generated.c)
|
add_executable(WiiDuktape main.c grrlib_duk.c wii_duk.c rgba.c game.c data_generated.c)
|
||||||
target_link_libraries(WiiDuktape duktape)
|
target_link_libraries(WiiDuktape duktape)
|
||||||
target_link_libraries(WiiDuktape GRRLIB)
|
target_link_libraries(WiiDuktape GRRLIB)
|
||||||
ogc_create_dol(WiiDuktape)
|
ogc_create_dol(WiiDuktape)
|
||||||
|
|
121
source/game.js
121
source/game.js
|
@ -1,34 +1,13 @@
|
||||||
/**
|
|
||||||
* returns an RGBA buffer
|
|
||||||
* @param {number} r red
|
|
||||||
* @param {number} g green
|
|
||||||
* @param {number} b blue
|
|
||||||
* @param {number} a alpha
|
|
||||||
* @returns {RGBA}
|
|
||||||
*/
|
|
||||||
function rgba(r, g, b, a) {
|
|
||||||
const buffer = Uint8Array.allocPlain(4);
|
|
||||||
buffer[0] = r;
|
|
||||||
buffer[1] = g;
|
|
||||||
buffer[2] = b;
|
|
||||||
buffer[3] = a;
|
|
||||||
return buffer;
|
|
||||||
}
|
|
||||||
|
|
||||||
const PAD_BUTTON_START = 0x1000;
|
const PAD_BUTTON_START = 0x1000;
|
||||||
const PAD_BUTTON_A = 0x0100;
|
const PAD_BUTTON_A = 0x0100;
|
||||||
const RED_COLOR = rgba(255, 0, 0, 255);
|
const RED_COLOR = wii.rgba(255, 0, 0, 255);
|
||||||
const GREEN_COLOR = rgba(0, 255, 0, 255);
|
const GREEN_COLOR = wii.rgba(0, 255, 0, 255);
|
||||||
const WHITE_COLOR = rgba(255, 255, 255, 255);
|
const WHITE_COLOR = wii.rgba(255, 255, 255, 255);
|
||||||
|
|
||||||
const FALLING_SPEED = 250;
|
const FALLING_SPEED = 250;
|
||||||
const TERMINAL_VELOCITY_SPEED = 500;
|
const TERMINAL_VELOCITY_SPEED = 500;
|
||||||
|
const PIPE_SPAWN_TIME = 4;
|
||||||
function rgba_compare(rgba1, rgba2) {
|
const PIPE_MAX_TIME = 5;
|
||||||
return (rgba1[0] == rgba2[0]) &&
|
|
||||||
(rgba1[1] == rgba2[1]) &&
|
|
||||||
(rgba1[2] == rgba2[2]) &&
|
|
||||||
(rgba1[3] == rgba2[3]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* clamps a number to the min and max values.
|
* clamps a number to the min and max values.
|
||||||
|
@ -41,37 +20,81 @@ function clamp(num, min, max) {
|
||||||
return Math.min(Math.max(num, min), max);
|
return Math.min(Math.max(num, min), max);
|
||||||
}
|
}
|
||||||
|
|
||||||
globalThis.rectangle_color = RED_COLOR;
|
function random_range(min, max) {
|
||||||
|
const minCeiled = Math.ceil(min);
|
||||||
|
const maxFloored = Math.floor(max);
|
||||||
|
return Math.floor(Math.random() * (maxFloored - minCeiled) + minCeiled);
|
||||||
|
}
|
||||||
|
|
||||||
/** @type {GRRLibTexture} */
|
/** @type {GRRLibTexture} */
|
||||||
globalThis.background = null;
|
globalThis.background = null;
|
||||||
|
|
||||||
|
/** @type {DrawableObject} */
|
||||||
|
globalThis.bird = {
|
||||||
|
velocity: 0,
|
||||||
|
position: 0
|
||||||
|
};
|
||||||
|
|
||||||
/** @type {GRRLibTexture} */
|
/** @type {GRRLibTexture} */
|
||||||
globalThis.bird = null;
|
globalThis.pipe = null;
|
||||||
|
|
||||||
globalThis.bird_velocity = 0;
|
/** @type {GRRLibTexture} */
|
||||||
globalThis.bird_position = 0;
|
globalThis.pipe_flipped = null;
|
||||||
|
|
||||||
function swap_colors() {
|
/** @type {Pipe[]} */
|
||||||
if (rgba_compare(rectangle_color, RED_COLOR)) {
|
globalThis.pipes = [];
|
||||||
rectangle_color = GREEN_COLOR;
|
|
||||||
} else if (rgba_compare(rectangle_color, GREEN_COLOR)) {
|
/** @type {number} */
|
||||||
rectangle_color = RED_COLOR;
|
globalThis.timer = 0;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function start() {
|
function start() {
|
||||||
const background = wii.get_file("background-day.png");
|
const background = wii.get_file("background-day.png");
|
||||||
const bird = wii.get_file("yellowbird-midflap.png");
|
const bird = wii.get_file("yellowbird-midflap.png");
|
||||||
|
const pipe = wii.get_file("pipe-green.png");
|
||||||
|
const pipe_flipped = wii.get_file("pipe-green-flipped.png");
|
||||||
|
|
||||||
globalThis.background = wii.grrlib.load_texture(background);
|
globalThis.background = wii.grrlib.load_texture(background);
|
||||||
globalThis.bird = wii.grrlib.load_texture(bird);
|
globalThis.bird.texture = wii.grrlib.load_texture(bird);
|
||||||
|
globalThis.pipe = wii.grrlib.load_texture(pipe);
|
||||||
|
globalThis.pipe_flipped = wii.grrlib.load_texture(pipe_flipped);
|
||||||
}
|
}
|
||||||
|
|
||||||
function update_bird() {
|
function update_bird() {
|
||||||
const deltatime = wii.get_deltatime();
|
const deltatime = wii.get_deltatime();
|
||||||
bird_position -= bird_velocity * deltatime;
|
bird.position -= bird.velocity * deltatime;
|
||||||
bird_velocity = clamp(bird_velocity - (FALLING_SPEED * deltatime), -TERMINAL_VELOCITY_SPEED, TERMINAL_VELOCITY_SPEED);
|
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);
|
wii.grrlib.draw_img(0, bird.position, bird.texture, 0, 1, 1, WHITE_COLOR);
|
||||||
|
}
|
||||||
|
|
||||||
|
function create_pipe() {
|
||||||
|
const top_max = 200;
|
||||||
|
const top_y = random_range(0, top_max);
|
||||||
|
|
||||||
|
wii.grrlib.draw_img(100, -top_y, pipe_flipped, 0, 1, 1, WHITE_COLOR);
|
||||||
|
wii.grrlib.draw_img(100, top_y + 400, pipe, 0, 1, 1, WHITE_COLOR);
|
||||||
|
|
||||||
|
return {
|
||||||
|
top_y: -top_y,
|
||||||
|
bottom_y: -top_y + 400,
|
||||||
|
position: 650,
|
||||||
|
time_active: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {Pipe} pipe
|
||||||
|
*/
|
||||||
|
function update_pipe(pipe) {
|
||||||
|
if (pipe.time_active >= PIPE_MAX_TIME) {
|
||||||
|
const index = pipes.indexOf(pipe);
|
||||||
|
pipes.splice(index, -1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
wii.grrlib.draw_img(pipe.position, pipe.top_y, pipe_flipped, 0, 1, 1, WHITE_COLOR);
|
||||||
|
wii.grrlib.draw_img(pipe.position, pipe.bottom_y, globalThis.pipe, 0, 1, 1, WHITE_COLOR);
|
||||||
|
pipe.position -= 100 * wii.get_deltatime();
|
||||||
|
pipe.time_active += wii.get_deltatime();
|
||||||
}
|
}
|
||||||
|
|
||||||
function update() {
|
function update() {
|
||||||
|
@ -83,10 +106,22 @@ function update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pressed & PAD_BUTTON_A) {
|
if (pressed & PAD_BUTTON_A) {
|
||||||
bird_velocity = FALLING_SPEED;
|
bird.velocity = FALLING_SPEED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timer >= PIPE_SPAWN_TIME) {
|
||||||
|
timer = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (timer == 0) {
|
||||||
|
pipes.push(create_pipe());
|
||||||
}
|
}
|
||||||
|
|
||||||
wii.grrlib.draw_img(0, 0, background, 0, 1, 1, WHITE_COLOR);
|
wii.grrlib.draw_img(0, 0, background, 0, 1, 1, WHITE_COLOR);
|
||||||
update_bird();
|
update_bird();
|
||||||
|
for (var i = 0; i < pipes.length; i++) {
|
||||||
|
update_pipe(pipes[i]);
|
||||||
|
}
|
||||||
wii.print("deltatime: " + wii.get_deltatime())
|
wii.print("deltatime: " + wii.get_deltatime())
|
||||||
|
timer += wii.get_deltatime();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,7 @@
|
||||||
#include "grrlib_duk.h"
|
#include "grrlib_duk.h"
|
||||||
#include "duk_config.h"
|
#include <duktape.h>
|
||||||
#include "duktape.h"
|
|
||||||
#include <grrlib.h>
|
#include <grrlib.h>
|
||||||
|
#include "rgba.h"
|
||||||
static unsigned int get_color(duk_context *ctx, duk_idx_t index) {
|
|
||||||
size_t rgba_size;
|
|
||||||
unsigned char * rgba = duk_get_buffer(ctx, index, &rgba_size);
|
|
||||||
return rgba[0] << 24 | rgba[1] << 16 | rgba[2] << 8 | rgba[3];
|
|
||||||
}
|
|
||||||
|
|
||||||
static duk_ret_t grrlib_fill_screen(duk_context *ctx) {
|
static duk_ret_t grrlib_fill_screen(duk_context *ctx) {
|
||||||
unsigned int color = get_color(ctx, 0);
|
unsigned int color = get_color(ctx, 0);
|
||||||
|
|
36
source/rgba.c
Normal file
36
source/rgba.c
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
#include "rgba.h"
|
||||||
|
|
||||||
|
duk_ret_t compare_rgba(duk_context * ctx) {
|
||||||
|
unsigned int color1 = get_color(ctx, 0);
|
||||||
|
unsigned int color2 = get_color(ctx, 1);
|
||||||
|
|
||||||
|
duk_push_boolean(ctx, color1 == color2);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
duk_ret_t rgba(duk_context * ctx) {
|
||||||
|
int r = duk_get_number(ctx, 0);
|
||||||
|
int g = duk_get_number(ctx, 1);
|
||||||
|
int b = duk_get_number(ctx, 2);
|
||||||
|
int a = duk_get_number(ctx, 3);
|
||||||
|
|
||||||
|
if (r > 255 || g > 255 || b > 255 || a > 255) {
|
||||||
|
return duk_error(ctx, DUK_ERR_ERROR, "You can't use a number bigger then 255.");
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned char * buffer;
|
||||||
|
buffer = duk_push_fixed_buffer(ctx, 4);
|
||||||
|
buffer[0] = r;
|
||||||
|
buffer[1] = g;
|
||||||
|
buffer[2] = b;
|
||||||
|
buffer[3] = a;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int get_color(duk_context * ctx, duk_idx_t index) {
|
||||||
|
size_t rgba_size;
|
||||||
|
unsigned char * rgba = duk_get_buffer(ctx, index, &rgba_size);
|
||||||
|
return rgba[0] << 24 | rgba[1] << 16 | rgba[2] << 8 | rgba[3];
|
||||||
|
}
|
7
source/rgba.h
Normal file
7
source/rgba.h
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#ifndef RGBA_H
|
||||||
|
#define RGBA_H
|
||||||
|
#include <duktape.h>
|
||||||
|
unsigned int get_color(duk_context * ctx, duk_idx_t index);
|
||||||
|
duk_ret_t rgba(duk_context * ctx);
|
||||||
|
duk_ret_t compare_rgba(duk_context * ctx);
|
||||||
|
#endif
|
|
@ -1,6 +1,7 @@
|
||||||
#include "wii_duk.h"
|
#include "wii_duk.h"
|
||||||
#include "data.h"
|
#include "data.h"
|
||||||
#include "grrlib_duk.h"
|
#include "grrlib_duk.h"
|
||||||
|
#include "rgba.h"
|
||||||
|
|
||||||
static GRRLIB_ttfFont * font;
|
static GRRLIB_ttfFont * font;
|
||||||
static bool * running;
|
static bool * running;
|
||||||
|
@ -83,4 +84,10 @@ void define_wii_object(duk_context * ctx, struct GRRLIB_Font * grrlib_font, bool
|
||||||
|
|
||||||
duk_push_c_function(ctx, get_deltatime, 0);
|
duk_push_c_function(ctx, get_deltatime, 0);
|
||||||
duk_put_prop_string(ctx, wii_obj, "get_deltatime");
|
duk_put_prop_string(ctx, wii_obj, "get_deltatime");
|
||||||
|
|
||||||
|
duk_push_c_function(ctx, rgba, 4);
|
||||||
|
duk_put_prop_string(ctx, wii_obj, "rgba");
|
||||||
|
|
||||||
|
duk_push_c_function(ctx, compare_rgba, 2);
|
||||||
|
duk_put_prop_string(ctx, wii_obj, "compare_rgba");
|
||||||
}
|
}
|
||||||
|
|
12
types.d.ts
vendored
12
types.d.ts
vendored
|
@ -1,11 +1,23 @@
|
||||||
declare interface RGBA {}
|
declare interface RGBA {}
|
||||||
declare interface FilePtr {}
|
declare interface FilePtr {}
|
||||||
declare interface GRRLibTexture {}
|
declare interface GRRLibTexture {}
|
||||||
|
declare interface DrawableObject {
|
||||||
|
texture: GRRLibTexture
|
||||||
|
};
|
||||||
|
declare interface Pipe {
|
||||||
|
top_y: number
|
||||||
|
bottom_y: number
|
||||||
|
position: number
|
||||||
|
time_active: number
|
||||||
|
};
|
||||||
|
|
||||||
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
|
function get_deltatime() : number
|
||||||
|
function compare_rgba(color1: RGBA, color2: RGBA) : boolean
|
||||||
|
function print(message: string) : void
|
||||||
|
function rgba(r: number, g: number, b: number, a: number): RGBA
|
||||||
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