mirror of
https://github.com/italicsjenga/agb.git
synced 2024-12-24 00:31:34 +11:00
added documentation
This commit is contained in:
parent
0b2472484f
commit
d85590bff6
|
@ -46,6 +46,9 @@ pub enum BackgroundSize {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[non_exhaustive]
|
#[non_exhaustive]
|
||||||
|
/// The map background is the method of drawing game maps to the screen. It
|
||||||
|
/// automatically handles copying the correct portion of a provided map to the
|
||||||
|
/// assigned block depending on given coordinates.
|
||||||
pub struct Background<'a> {
|
pub struct Background<'a> {
|
||||||
background: u8,
|
background: u8,
|
||||||
block: u8,
|
block: u8,
|
||||||
|
@ -73,6 +76,13 @@ impl<'a> Background<'a> {
|
||||||
background
|
background
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sets the internal map to the provided map. Dimensions should be the
|
||||||
|
/// dimensions of the map. The mapping between coordinate and index is given
|
||||||
|
/// by `y * dim_x + x`. The length of the map slice should be `dim_x *
|
||||||
|
/// dim_y`, or panics may occur.
|
||||||
|
///
|
||||||
|
/// The portion of this map that is in view is copied to the map block
|
||||||
|
/// assigned to this background.
|
||||||
pub fn set_map(&mut self, map: &'a [u16], dim_x: u32, dim_y: u32) {
|
pub fn set_map(&mut self, map: &'a [u16], dim_x: u32, dim_y: u32) {
|
||||||
self.map = Some(map);
|
self.map = Some(map);
|
||||||
self.map_dim_x = dim_x;
|
self.map_dim_x = dim_x;
|
||||||
|
@ -82,6 +92,8 @@ impl<'a> Background<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Background<'_> {
|
impl Background<'_> {
|
||||||
|
/// Sets the background to be shown on screen. Requires the background to
|
||||||
|
/// have a map enabled otherwise a panic is caused.
|
||||||
pub fn show(&mut self) {
|
pub fn show(&mut self) {
|
||||||
assert!(self.map.is_some(), "map should be set before showing");
|
assert!(self.map.is_some(), "map should be set before showing");
|
||||||
let mode = DISPLAY_CONTROL.get();
|
let mode = DISPLAY_CONTROL.get();
|
||||||
|
@ -89,6 +101,7 @@ impl Background<'_> {
|
||||||
DISPLAY_CONTROL.set(new_mode);
|
DISPLAY_CONTROL.set(new_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Hides the background, nothing from this background is rendered to screen.
|
||||||
pub fn hide(&mut self) {
|
pub fn hide(&mut self) {
|
||||||
let mode = DISPLAY_CONTROL.get();
|
let mode = DISPLAY_CONTROL.get();
|
||||||
let new_mode = mode | !(1 << (self.background + 0x08));
|
let new_mode = mode | !(1 << (self.background + 0x08));
|
||||||
|
@ -111,6 +124,8 @@ impl Background<'_> {
|
||||||
reg.write_volatile(new_control);
|
reg.write_volatile(new_control);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sets priority of the background layer. Backgrounds with higher priority
|
||||||
|
/// are drawn (above/below) backgrounds with lower priority.
|
||||||
pub fn set_priority(&mut self, p: Prioriry) {
|
pub fn set_priority(&mut self, p: Prioriry) {
|
||||||
unsafe { self.set_bits(0, 2, p as u16) }
|
unsafe { self.set_bits(0, 2, p as u16) }
|
||||||
}
|
}
|
||||||
|
@ -142,6 +157,10 @@ impl Background<'_> {
|
||||||
unsafe { *((0x0400_0012 + 4 * self.background as usize) as *mut u16) = y }
|
unsafe { *((0x0400_0012 + 4 * self.background as usize) as *mut u16) = y }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Forces the portion of the map in current view to be copied to the map
|
||||||
|
/// block assigned to this background. This is currently unnecesary to call.
|
||||||
|
/// Setting position already updates the drawn map, and changing map forces
|
||||||
|
/// an update.
|
||||||
pub fn draw_full_map(&mut self) {
|
pub fn draw_full_map(&mut self) {
|
||||||
let x_map_space = self.pos_x / 8;
|
let x_map_space = self.pos_x / 8;
|
||||||
let y_map_space = self.pos_y / 8;
|
let y_map_space = self.pos_y / 8;
|
||||||
|
@ -161,6 +180,9 @@ impl Background<'_> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Sets the position of the map to be shown on screen. This automatically
|
||||||
|
/// manages copying the correct portion to the map block and moving the map
|
||||||
|
/// registers.
|
||||||
pub fn set_position(&mut self, x: i32, y: i32) {
|
pub fn set_position(&mut self, x: i32, y: i32) {
|
||||||
let x_map_space = x / 8;
|
let x_map_space = x / 8;
|
||||||
let y_map_space = y / 8;
|
let y_map_space = y / 8;
|
||||||
|
@ -260,12 +282,14 @@ impl Tiled0 {
|
||||||
TILE_BACKGROUND.set(index as usize, data);
|
TILE_BACKGROUND.set(index as usize, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Copies raw palettes to the background palette without any checks.
|
||||||
pub fn set_sprite_palette(&mut self, colour: &[u16]) {
|
pub fn set_sprite_palette(&mut self, colour: &[u16]) {
|
||||||
for (index, &entry) in colour.iter().enumerate() {
|
for (index, &entry) in colour.iter().enumerate() {
|
||||||
self.set_sprite_palette_entry(index.try_into().unwrap(), entry)
|
self.set_sprite_palette_entry(index.try_into().unwrap(), entry)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Copies raw palettes to the background palette without any checks.
|
||||||
pub fn set_background_palette_raw(&mut self, palette: &[u16]) {
|
pub fn set_background_palette_raw(&mut self, palette: &[u16]) {
|
||||||
for (index, &colour) in palette.iter().enumerate() {
|
for (index, &colour) in palette.iter().enumerate() {
|
||||||
PALETTE_BACKGROUND.set(index, colour);
|
PALETTE_BACKGROUND.set(index, colour);
|
||||||
|
@ -278,18 +302,21 @@ impl Tiled0 {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Copies palettes to the background palettes without any checks.
|
||||||
pub fn set_background_palettes(&mut self, palettes: &[palette16::Palette16]) {
|
pub fn set_background_palettes(&mut self, palettes: &[palette16::Palette16]) {
|
||||||
for (palette_index, entry) in palettes.iter().enumerate() {
|
for (palette_index, entry) in palettes.iter().enumerate() {
|
||||||
self.set_background_palette(palette_index as u8, entry)
|
self.set_background_palette(palette_index as u8, entry)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Copies tiles to the sprite tilemap without any checks.
|
||||||
pub fn set_sprite_tilemap(&mut self, tiles: &[u32]) {
|
pub fn set_sprite_tilemap(&mut self, tiles: &[u32]) {
|
||||||
for (index, &tile) in tiles.iter().enumerate() {
|
for (index, &tile) in tiles.iter().enumerate() {
|
||||||
self.set_sprite_tilemap_entry(index as u32, tile)
|
self.set_sprite_tilemap_entry(index as u32, tile)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Gets a map background if possible and assigns an unused block to it.
|
||||||
pub fn get_background(&mut self) -> Result<Background, &'static str> {
|
pub fn get_background(&mut self) -> Result<Background, &'static str> {
|
||||||
if self.num_backgrounds >= 4 {
|
if self.num_backgrounds >= 4 {
|
||||||
return Err("too many backgrounds created, maximum is 4");
|
return Err("too many backgrounds created, maximum is 4");
|
||||||
|
@ -320,6 +347,8 @@ impl Tiled0 {
|
||||||
Ok(unsafe { Background::new(background, availiable_block) })
|
Ok(unsafe { Background::new(background, availiable_block) })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Copies tiles to tilemap starting at the starting tile. Cannot overwrite
|
||||||
|
/// blocks that are already written to, panic is caused if this is attempted.
|
||||||
pub fn set_background_tilemap(&mut self, start_tile: u32, tiles: &[u32]) {
|
pub fn set_background_tilemap(&mut self, start_tile: u32, tiles: &[u32]) {
|
||||||
let u32_per_block = 512;
|
let u32_per_block = 512;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue