/*************************************************** BG ビットマップ転送 ***************************************************/ void lord_bg_bitmap (u16 *data, int len) { u16 *screen = (u16 *) VRAM; CpuSet ( data, screen, (COPY16 | len)); }
// reset screen attributes void setup() { // callbacks vblank_handler_set(0); hblank_handler_set(0); set_callback2((super_callback)0x812EB11); // BGs overworld_free_bgmaps(); gpu_tile_bg_drop_all_sets(0); int src_zero = 0; CpuSet(&src_zero, (void *)0x6000000, (uint)0x5006000); // pals pal_fade_control_and_dead_struct_reset(); palette_bg_faded_fill_black(); pal_fade_control_and_dead_struct_reset(); gpu_pal_allocator_reset(); *gpu_pal_tag_search_lower_boundary = 0; // objs obj_and_aux_reset_all(); // tasks tasks_init(); // more BG setup superstate.callback_vblank = vblank_cb; setup_ioregs_bg(); bgid_mod_x_offset(0, 0, 0); bgid_mod_y_offset(0, 0, 0); bgid_mod_x_offset(1, 0, 0); bgid_mod_y_offset(1, 0, 0); bgid_mod_x_offset(2, 0, 0); bgid_mod_y_offset(2, 0, 0); bgid_mod_x_offset(3, 0, 0); bgid_mod_y_offset(3, 0, 0); remoboxes_acknowledge(); rboxes_free(); }
/*************************************************** キャラクタ初期化 ***************************************************/ void init_sprite_chr (void) { u16 *oam = DEF_MODE < MODE_3 ? OBJ_BASE_ADR : BITMAP_OBJ_BASE_ADR;// スプライトデータ u16 *pal = OBJ_COLORS; // スプライトパレット // 共通パレット転送 CpuSet (sprite_point1Pal, pal, (COPY16 | sprite_point1PalLen / 2)); // データ転送 CpuSet ( sprite_point1Tiles, oam, (COPY16 | sprite_point1TilesLen / 2)); CpuSet ( sprite_point2Tiles, oam + sprite_point1TilesLen / 2, (COPY16 | sprite_point1TilesLen / 2)); CpuSet ( sprite_point3Tiles, oam + sprite_point1TilesLen / 2 * 2, (COPY16 | sprite_point1TilesLen / 2)); CpuSet ( sprite_point4Tiles, oam + sprite_point1TilesLen / 2 * 3, (COPY16 | sprite_point1TilesLen / 2)); CpuSet ( sprite_point_endTiles, oam + sprite_point1TilesLen / 2 * 4, (COPY16 | sprite_point1TilesLen / 2)); CpuSet ( sprite_upTiles, oam + sprite_point1TilesLen / 2 * 5, (COPY16 | sprite_point1TilesLen / 2)); CpuSet ( sprite_downTiles, oam + sprite_point1TilesLen / 2 * 6, (COPY16 | sprite_point1TilesLen / 2)); CpuSet ( sprite_drillTiles, oam + sprite_point1TilesLen / 2 * 7, (COPY16 | sprite_point1TilesLen / 2)); CpuSet ( sprite_arrowTiles, oam + sprite_point1TilesLen / 2 * 8, (COPY16 | sprite_point1TilesLen / 2)); CpuSet ( sprite_youTiles, oam + sprite_point1TilesLen / 2 * 9, (COPY16 | sprite_youTilesLen / 2)); CpuSet ( sprite_you2Tiles, oam + sprite_point1TilesLen / 2 * 9 + sprite_youTilesLen/2, (COPY16 | sprite_youTilesLen / 2)); }
int main() { irqInit(); SetMode((LCDC_BITS)(MODE_1 | BG0_ON | BG2_ON | OBJ_ENABLE)); irqSet(IRQ_VBLANK, vblank); irqEnable(IRQ_VBLANK); float xpos = 0; float ypos = 0; float xdir = 0; float ydir = 0; int dir = 0; BG_COLORS[0] = RGB5(31, 0, 31); CpuFastSet(tileset_img, OBJ_BASE_ADR, COPY32 | (256 * 16) / 4); CpuFastSet(tileset_pal, OBJ_COLORS, COPY32 | (256 / 4)); CpuFastSet(tileset_img, PATRAM4(0, 0), COPY32 | (256 * 16) / 4); CpuFastSet(tileset_pal, BG_COLORS, COPY32 | (256 / 4)); // mock up a map /* ((vu16*)MAP_BASE_ADR(MAP_BASE_BLOCK))[0] = 0; ((vu16*)MAP_BASE_ADR(MAP_BASE_BLOCK))[1] = 1; ((vu16*)MAP_BASE_ADR(MAP_BASE_BLOCK))[32] = 32; ((vu16*)MAP_BASE_ADR(MAP_BASE_BLOCK))[33] = 33; ((vu16*)MAP_BASE_ADR(MAP_BASE_BLOCK))[64] = 64; ((vu16*)MAP_BASE_ADR(MAP_BASE_BLOCK))[65] = 65; */ for (int y = 0; y < 32; ++y) { for (int x = 0; x < 32; ++x) { ((vu16*)MAP_BASE_ADR(MAP_BASE_BLOCK + 1))[x + y * 32] = 5; } } for (int x = 0; x < 32; ++x) ((vu8*)MAP_BASE_ADR(MAP_BASE_BLOCK + 1))[x] = 16; for (int x = 0; x < 32; ++x) ((vu8*)MAP_BASE_ADR(MAP_BASE_BLOCK + 1))[31 * 32 + x] = 16; for (int y = 0; y < 32; ++y) ((vu8*)MAP_BASE_ADR(MAP_BASE_BLOCK + 1))[y * 32] = 16; for (int y = 0; y < 32; ++y) ((vu8*)MAP_BASE_ADR(MAP_BASE_BLOCK + 1))[y * 32 + 31] = 16; BGCTRL[0] = SCREEN_BASE(MAP_BASE_BLOCK + 0) | CHAR_BASE(0) | BG_SIZE_0 | BG_16_COLOR | BG_PRIORITY(1); // | CHAR_PALETTE(1); BGCTRL[2] = SCREEN_BASE(MAP_BASE_BLOCK + 1) | CHAR_BASE(0) | BG_SIZE_1 | BG_16_COLOR | BG_PRIORITY(0); // | CHAR_PALETTE(1); float rot = 0.0f; float last_rot = rot; float bg_scroll = 0; int frame = 0; while (1) { int sprite_frame = (int(floor(bg_scroll)) >> 3) & 1; if (fabs(xdir) < 1e-1) sprite_frame = 0; // if (ypos > 0) sprite_frame = 2; int tile_start = sprite_frame * 2; int pal = 0; for (int i = 0; i < 128; ++i) { sprites[i].attr0 = ATTR0_DISABLED; } int sprite = 0; // sprites[sprite].attr0 = OBJ_Y(int(ypos) + 80 - 8) | ATTR0_COLOR_16 | ATTR0_WIDE; // sprites[sprite].attr1 = OBJ_X(int(xpos) + 120) | OBJ_SIZE(Sprite_16x8) | (dir ? ATTR1_FLIP_X : 0); sprites[sprite].attr0 = OBJ_Y(int(0) + 80 - 16) | ATTR0_COLOR_16 | ATTR0_WIDE; sprites[sprite].attr1 = OBJ_X(int(0) + 120 - 8) | OBJ_SIZE(Sprite_16x8) | (dir ? ATTR1_FLIP_X : 0); sprites[sprite].attr2 = OBJ_CHAR(tile_start) | ATTR2_PALETTE(pal); // | OBJ_TRANSLUCENT; sprite++; // sprites[sprite].attr0 = OBJ_Y(int(ypos) + 80) | ATTR0_COLOR_16 | ATTR0_SQUARE; // sprites[sprite].attr1 = OBJ_X(int(xpos) + 120) | OBJ_SIZE(Sprite_16x16) | (dir ? ATTR1_FLIP_X : 0); sprites[sprite].attr0 = OBJ_Y(int(0) + 80 - 8) | ATTR0_COLOR_16 | ATTR0_SQUARE; sprites[sprite].attr1 = OBJ_X(int(0) + 120 - 8) | OBJ_SIZE(Sprite_16x16) | (dir ? ATTR1_FLIP_X : 0); sprites[sprite].attr2 = OBJ_CHAR(tile_start + 32) | ATTR2_PALETTE(pal); // | OBJ_TRANSLUCENT; sprite++; float st = sin(last_rot); float ct = cos(last_rot); last_rot = last_rot + (rot - last_rot) * 0.1; int pa = int(0x100 * ct); int pb =-int(0x100 * st); int pc = int(0x100 * st); int pd = int(0x100 * ct); // don't setup any hw-regs until vblank VBlankIntrWait(); // setup bg0 scroll REG_BG0HOFS = int(bg_scroll) & 0xFFFF; // setup bg2 transform REG_BG2PA = pa; REG_BG2PB = pb; REG_BG2PC = pc; REG_BG2PD = pd; REG_BG2X = (int(xpos) << 8) - (pa * 120 + pb * 80); REG_BG2Y = (int(ypos) << 8) - (pc * 120 + pd * 80); ++frame; CpuSet(sprites, OAM, (128 * sizeof(OAM[0])) / 2); scanKeys(); u32 held = keysHeld(); u32 down = keysDown(); u32 up = keysUp(); float upx = sin(rot); float upy = -cos(rot); float leftx = upy; float lefty = -upx; if (KEY_UP & down) { xdir = upx * 5; ydir = upy * 5; } if (KEY_L & down) { rot += M_PI / 2; } if (KEY_R & down) { rot -= M_PI / 2; } /* if (KEY_L & up) { rot += M_PI / 4; } if (KEY_R & up) { rot -= M_PI / 4; } */ // external forces #if 0 xdir *= 0.95; // friction ydir *= 0.95; // friction #else float a = leftx * xdir + lefty * ydir; // dot(dir, left) float b = upx * xdir + upy * ydir; // dot(dir, up) float new_xdir = upx * b + 0.85 * leftx * a; float new_ydir = upy * b + 0.85 * lefty * a; xdir = new_xdir; ydir = new_ydir; #endif if (fabs(xdir) < 1e-1) xdir = 0; if (fabs(ydir) < 1e-1) ydir = 0; if (KEY_RIGHT & held) { xdir -= leftx * 0.5f; ydir -= lefty * 0.5f; dir = 0; } if (KEY_LEFT & held) { xdir += leftx * 0.5f; ydir += lefty * 0.5f; dir = 1; } xdir -= upx * 0.25; // gravity ydir -= upy * 0.25; // gravity float last_xpos = xpos; float last_ypos = ypos; // apply forces xpos += xdir; ypos += ydir; // resolve constraints if (xpos < 0) xpos = 0; if (xpos > 255) xpos = 255; if (ypos < 0) ypos = 0; if (ypos > 255) ypos = 255; float delta_xpos = last_xpos - xpos; float delta_ypos = last_ypos - ypos; bg_scroll += (delta_xpos * leftx + delta_ypos * lefty) * 0.5f; } return 0; }
/*************************************************** キャラクタ初期化 ***************************************************/ void init_sprite_chr (void) { u16 *oam = DEF_MODE < MODE_3 ? OBJ_BASE_ADR : BITMAP_OBJ_BASE_ADR; // スプライトデータ u16 *pal = OBJ_COLORS; // スプライトパレット // 共通パレット転送 CpuSet (shipPal, pal, (COPY16 | shipPalLen / 2)); // データ転送 // 自機 CpuSet ( SHIP_TILE, oam, (COPY16 | SHIP_TILE_LEN)); // 照準 CpuSet ( AIM_TILE, oam + SHIP_TILE_LEN, (COPY16 | AIM_TILE_LEN)); // タイル ショット CpuSet ( SHOT_TILE, oam + SHIP_TILE_LEN + AIM_TILE_LEN, (COPY16 | SHOT_TILE_LEN)); // タイル ショット2 CpuSet ( SHOT2_TILE, oam + SHIP_TILE_LEN + AIM_TILE_LEN + SHOT_TILE_LEN, (COPY16 | SHOT2_TILE_LEN)); // タイル コメット CpuSet ( COMET_TILE, oam + SHIP_TILE_LEN + AIM_TILE_LEN + SHOT_TILE_LEN + SHOT2_TILE_LEN, (COPY16 | COMET_TILE_LEN)); // タイル コメット2 CpuSet ( COMET2_TILE, oam + SHIP_TILE_LEN + AIM_TILE_LEN + SHOT_TILE_LEN + SHOT2_TILE_LEN + COMET_TILE_LEN, (COPY16 | COMET2_TILE_LEN)); // タイル コメット3 CpuSet ( COMET3_TILE, oam + SHIP_TILE_LEN + AIM_TILE_LEN + SHOT_TILE_LEN + SHOT2_TILE_LEN + COMET_TILE_LEN + COMET2_TILE_LEN, (COPY16 | COMET3_TILE_LEN)); // タイル 自機異常1 CpuSet ( SHIP_COMET_TILE, oam + SHIP_TILE_LEN + AIM_TILE_LEN + SHOT_TILE_LEN + SHOT2_TILE_LEN + COMET_TILE_LEN + COMET2_TILE_LEN + COMET3_TILE_LEN, (COPY16 | SHIP_COMET_TILE_LEN)); // タイル 自機異常2 CpuSet ( SHIP_COMET2_TILE, oam + SHIP_TILE_LEN + AIM_TILE_LEN + SHOT_TILE_LEN + SHOT2_TILE_LEN + COMET_TILE_LEN + COMET2_TILE_LEN + COMET3_TILE_LEN + SHIP_COMET_TILE_LEN, (COPY16 | SHIP_COMET2_TILE_LEN)); // タイル 自機異常3 CpuSet ( SHIP_COMET3_TILE, oam + SHIP_TILE_LEN + AIM_TILE_LEN + SHOT_TILE_LEN + SHOT2_TILE_LEN + COMET_TILE_LEN + COMET2_TILE_LEN + COMET3_TILE_LEN + SHIP_COMET_TILE_LEN + SHIP_COMET2_TILE_LEN, (COPY16 | SHIP_COMET3_TILE_LEN)); // タイル ショットアイコン CpuSet ( ICON_SHOT_TILE, oam + SHIP_TILE_LEN + AIM_TILE_LEN + SHOT_TILE_LEN + SHOT2_TILE_LEN + COMET_TILE_LEN + COMET2_TILE_LEN + COMET3_TILE_LEN + SHIP_COMET_TILE_LEN + SHIP_COMET2_TILE_LEN + SHIP_COMET3_TILE_LEN, (COPY16 | ICON_TILE_LEN)); // タイル ストップアイコン CpuSet ( ICON_STOP_TILE, oam + SHIP_TILE_LEN + AIM_TILE_LEN + SHOT_TILE_LEN + SHOT2_TILE_LEN + COMET_TILE_LEN + COMET2_TILE_LEN + COMET3_TILE_LEN + SHIP_COMET_TILE_LEN + SHIP_COMET2_TILE_LEN + SHIP_COMET3_TILE_LEN + ICON_TILE_LEN, (COPY16 | ICON_TILE_LEN)); // タイル ボーナスアイコン CpuSet ( ICON_BONUS_TILE, oam + SHIP_TILE_LEN + AIM_TILE_LEN + SHOT_TILE_LEN + SHOT2_TILE_LEN + COMET_TILE_LEN + COMET2_TILE_LEN + COMET3_TILE_LEN + SHIP_COMET_TILE_LEN + SHIP_COMET2_TILE_LEN + SHIP_COMET3_TILE_LEN + ICON_TILE_LEN * 2, (COPY16 | ICON_TILE_LEN)); }