summaryrefslogtreecommitdiff
path: root/arm9/source/template.c
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/source/template.c')
-rw-r--r--arm9/source/template.c160
1 files changed, 160 insertions, 0 deletions
diff --git a/arm9/source/template.c b/arm9/source/template.c
new file mode 100644
index 0000000..ca4f43e
--- /dev/null
+++ b/arm9/source/template.c
@@ -0,0 +1,160 @@
+/* DS Homebrew demo.
+ * Written by mr b0nk 500 <b0nk@b0nk.xyz>.
+ */
+
+
+#include <nds.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+struct vec2d {
+ float x;
+ float y;
+};
+
+struct player {
+ struct vec2d pos;
+ struct vec2d delta;
+ float max_vel;
+ float accel;
+ int w;
+ int h;
+};
+
+void init_player(struct player *p, float x, float y, float max_vel, float accel, int w, int h) {
+ p->pos.x = x;
+ p->pos.y = y;
+ p->delta.x = 0;
+ p->delta.y = 0;
+ p->max_vel = max_vel;
+ p->accel = accel;
+ p->w = w;
+ p->h = h;
+}
+
+int main() {
+ touchPosition old_touch;
+ touchPosition touch;
+
+ memset(&old_touch, 0, sizeof(old_touch));
+ memset(&touch, 0, sizeof(touch));
+
+ videoSetMode(MODE_0_2D);
+ videoSetModeSub(MODE_0_2D);
+
+ vramSetBankC(VRAM_C_MAIN_BG);
+ vramSetBankD(VRAM_D_SUB_SPRITE);
+
+ /*oamInit(&oamMain, SpriteMapping_1D_32, false);*/
+ oamInit(&oamSub, SpriteMapping_1D_32, false);
+
+ /*u16 *main_gfx = oamAllocateGfx(&oamMain, SpriteSize_16x16, SpriteColorFormat_256Color);*/
+ u16 *sub_gfx = oamAllocateGfx(&oamSub, SpriteSize_16x16, SpriteColorFormat_256Color);
+
+ videoSetMode(MODE_0_2D);
+
+ for (int i = 0; i < (16*16)/2; i++) {
+ /*main_gfx[i] = 1 | BIT(8);*/
+ sub_gfx[i] = 1 | BIT(8);
+ }
+
+ /*SPRITE_PALETTE[1] = RGB15(31,0,0);*/
+ SPRITE_PALETTE_SUB[1] = RGB15(0,31,0);
+ consoleInit(0, 0, BgType_Text4bpp, BgSize_T_256x256, 31, 0, true, true);
+
+ struct player ply;
+ struct vec2d drag_speed = {0, 0};
+ int max_x = 256;
+ int min_x = 0;
+ int max_y = 192;
+ int min_y = 0;
+ int frame_step = 0;
+ int pause = 0;
+ init_player(&ply, 100, 100, 5.25f, 0.25f, 16, 16);
+ min_x -= ply.w;
+ min_y -= ply.h;
+
+ for (;;) {
+ scanKeys();
+ int pressed = keysDown();
+ int held = keysHeld();
+
+ frame_step = (pressed & KEY_R) ? !frame_step : frame_step;
+ pause = (pressed & KEY_SELECT) ? !pause : pause;
+ frame_step = (pressed & KEY_SELECT) ? 0 : frame_step;
+ pause = (frame_step) ? 1 : pause;
+
+ if (!pause || frame_step) {
+ int up = held & KEY_UP;
+ int down = held & KEY_DOWN;
+ int left = held & KEY_LEFT;
+ int right = held & KEY_RIGHT;
+ int is_decel_x = (!left && ply.delta.x < 0) || (!right && ply.delta.x > 0);
+ int is_decel_y = (!up && ply.delta.y < 0) || (!down && ply.delta.y > 0);
+
+ if (held & KEY_TOUCH) {
+ touchRead(&touch);
+ touch.px = (touch.px >= max_x+ply.w) ? max_x+ply.w : touch.px;
+ touch.py = (touch.py >= max_y+ply.h) ? max_y+ply.h : touch.py;
+ drag_speed.x = (touch.px - old_touch.px)/2;
+ drag_speed.y = (touch.py - old_touch.py)/2;
+ ply.delta = drag_speed;
+ /*ply.delta.x = drag_speed.x;
+ ply.delta.y = drag_speed.y;*/
+ ply.pos.x = touch.px;
+ ply.pos.y = touch.py;
+ old_touch = touch;
+ }
+
+ if (is_decel_x) {
+ int opposite_x = (right && ply.delta.x < 0) || (left && ply.delta.x > 0);
+ float tmp_accel = ply.accel*(opposite_x+1);
+ ply.delta.x += (ply.delta.x > 0) ? -tmp_accel : tmp_accel;
+ } else if (left || right) {
+ ply.delta.x += (right) ? ply.accel : -ply.accel;
+ }
+
+ if (is_decel_y) {
+ int opposite_y = (down && ply.delta.y < 0) || (up && ply.delta.y > 0);
+ float tmp_accel = ply.accel*(opposite_y+1);
+ ply.delta.y += (ply.delta.y > 0) ? -tmp_accel : tmp_accel;
+ } else if (up || down) {
+ ply.delta.y += (down) ? ply.accel : -ply.accel;
+ }
+
+
+
+ ply.delta.x = (ply.delta.x > ply.max_vel) ? ply.max_vel : ply.delta.x;
+ ply.delta.y = (ply.delta.y > ply.max_vel) ? ply.max_vel : ply.delta.y;
+ ply.delta.x = (ply.delta.x < -ply.max_vel) ? -ply.max_vel : ply.delta.x;
+ ply.delta.y = (ply.delta.y < -ply.max_vel) ? -ply.max_vel : ply.delta.y;
+ ply.pos.x += ply.delta.x;
+ ply.pos.y += ply.delta.y;
+ ply.pos.x = (ply.pos.x > max_x) ? min_x+(ply.delta.x-1) : ply.pos.x;
+ ply.pos.y = (ply.pos.y > max_y) ? min_y+(ply.delta.y-1) : ply.pos.y;
+ ply.pos.x = (ply.pos.x < min_x) ? max_x+(ply.delta.x+1) : ply.pos.x;
+ ply.pos.y = (ply.pos.y < min_y) ? max_y+(ply.delta.y+1) : ply.pos.y;
+ frame_step = 0;
+ }
+ if (held & KEY_START) {
+ break;
+ }
+
+ /*oamSet(&oamMain, 0, x, y, 0, 0, SpriteSize_16x16, SpriteColorFormat_256Color, main_gfx, -1, false, false, false, false, false);*/
+
+ oamSet(&oamSub, 0, (int)ply.pos.x, (int)ply.pos.y, 0, 0, SpriteSize_16x16, SpriteColorFormat_256Color, sub_gfx, -1, false, false, false, false, false);
+
+ swiWaitForVBlank();
+
+ printf("\x1B[5Hx: % 4.5f, y: % 4.5f\n", ply.pos.x, ply.pos.y);
+ printf("dx: % 3.5f, dy: % 3.5f\n", ply.delta.x, ply.delta.y);
+ iprintf("pause: %i, frame_step: %i\n", pause, frame_step);
+
+ /*oamUpdate(&oamMain);*/
+ oamUpdate(&oamSub);
+ }
+
+ return 0;
+}