Expose hflip, vflip, priority, position (#566)

This exposes expose the `hflip`, `vflip`, `priority` and `position`
object attribute to remove the need for storing them in separate
variables.
I think it might also be worth to update the pong tutorial and maybe
some of the examples to highlight this.

- [x] Changelog updated / no changelog update needed
This commit is contained in:
Corwin 2024-02-17 16:51:34 +00:00 committed by GitHub
commit f99da581da
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 135 additions and 14 deletions

View file

@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added ### Added
- Added `.priority()`, `.set_priority()` and `.is_visible()` to `RegularMap`, `AffineMap` and `InfiniteScrolledMap`. - Added `.priority()`, `.set_priority()` and `.is_visible()` to `RegularMap`, `AffineMap` and `InfiniteScrolledMap`.
- Replaced `.show()` and `.hide()` with `.set_visible()`in `RegularMap`, `AffineMap` and `InfiniteScrolledMap`. - Replaced `.show()` and `.hide()` with `.set_visible()`in `RegularMap`, `AffineMap` and `InfiniteScrolledMap`.
- Added `.hflip()`, `.vflip()`, `.priority()`, `.position()` to `ObjectUnmanaged` and `Object`.
## [0.18.1] - 2024/02/06 ## [0.18.1] - 2024/02/06

View file

@ -396,6 +396,7 @@ impl Object<'_> {
} }
/// Sets the horizontal flip, note that this only has a visible affect in Normal mode. /// Sets the horizontal flip, note that this only has a visible affect in Normal mode.
/// Use [hflip](Self::hflip) to get the value
pub fn set_hflip(&mut self, flip: bool) -> &mut Self { pub fn set_hflip(&mut self, flip: bool) -> &mut Self {
// safety: only have one of these, doesn't modify slotmap // safety: only have one of these, doesn't modify slotmap
unsafe { self.object().set_hflip(flip) }; unsafe { self.object().set_hflip(flip) };
@ -403,7 +404,15 @@ impl Object<'_> {
self self
} }
/// Returns the horizontal flip
/// Use [set_hflip](Self::set_hflip) to set the value
#[must_use]
pub fn hflip(&self) -> bool {
unsafe { self.object_shared().hflip() }
}
/// Sets the vertical flip, note that this only has a visible affect in Normal mode. /// Sets the vertical flip, note that this only has a visible affect in Normal mode.
/// Use [vflip](Self::vflip) to get the value
pub fn set_vflip(&mut self, flip: bool) -> &mut Self { pub fn set_vflip(&mut self, flip: bool) -> &mut Self {
// safety: only have one of these, doesn't modify slotmap // safety: only have one of these, doesn't modify slotmap
unsafe { self.object().set_vflip(flip) }; unsafe { self.object().set_vflip(flip) };
@ -411,7 +420,15 @@ impl Object<'_> {
self self
} }
/// Returns the vertical flip
/// Use [set_vflip](Self::set_vflip) to set the value
#[must_use]
pub fn vflip(&self) -> bool {
unsafe { self.object_shared().vflip() }
}
/// Sets the priority of the object relative to the backgrounds priority. /// Sets the priority of the object relative to the backgrounds priority.
/// Use [priority](Self::priority) to get the value
pub fn set_priority(&mut self, priority: Priority) -> &mut Self { pub fn set_priority(&mut self, priority: Priority) -> &mut Self {
// safety: only have one of these, doesn't modify slotmap // safety: only have one of these, doesn't modify slotmap
unsafe { self.object().set_priority(priority) }; unsafe { self.object().set_priority(priority) };
@ -419,6 +436,13 @@ impl Object<'_> {
self self
} }
/// Returns the priority of the object
/// Use [set_priority](Self::set_priority) to set the value
#[must_use]
pub fn priority(&self) -> Priority {
unsafe { self.object_shared().priority() }
}
/// Changes the sprite mode to be hidden, can be changed to Normal or Affine /// Changes the sprite mode to be hidden, can be changed to Normal or Affine
/// modes using [`show`][Object::show] and /// modes using [`show`][Object::show] and
/// [`show_affine`][Object::show_affine] respectively. /// [`show_affine`][Object::show_affine] respectively.
@ -430,6 +454,8 @@ impl Object<'_> {
} }
/// Sets the x position of the object. /// Sets the x position of the object.
/// Use [x](Self::x) to get the value
/// Use [set_position](Self::set_position) to set both `x` and `y`
pub fn set_x(&mut self, x: u16) -> &mut Self { pub fn set_x(&mut self, x: u16) -> &mut Self {
// safety: only have one of these, doesn't modify slotmap // safety: only have one of these, doesn't modify slotmap
unsafe { self.object().set_x(x) }; unsafe { self.object().set_x(x) };
@ -437,7 +463,16 @@ impl Object<'_> {
self self
} }
/// Returns the x position of the object
/// Use [set_x](Self::set_x) to set the value
#[must_use]
pub fn x(&self) -> u16 {
unsafe { self.object_shared().x() }
}
/// Sets the y position of the object. /// Sets the y position of the object.
/// Use [y](Self::y) to get the value
/// Use [set_position](Self::set_position) to set both `x` and `y`
pub fn set_y(&mut self, y: u16) -> &mut Self { pub fn set_y(&mut self, y: u16) -> &mut Self {
// safety: only have one of these, doesn't modify slotmap // safety: only have one of these, doesn't modify slotmap
unsafe { self.object().set_y(y) }; unsafe { self.object().set_y(y) };
@ -445,7 +480,15 @@ impl Object<'_> {
self self
} }
/// Returns the y position of the object
/// Use [set_y](Self::set_y) to set the value
#[must_use]
pub fn y(&self) -> u16 {
unsafe { self.object_shared().y() }
}
/// Sets the position of the object. /// Sets the position of the object.
/// Use [position](Self::position) to get the value
pub fn set_position(&mut self, position: Vector2D<i32>) -> &mut Self { pub fn set_position(&mut self, position: Vector2D<i32>) -> &mut Self {
// safety: only have one of these, doesn't modify slotmap // safety: only have one of these, doesn't modify slotmap
unsafe { self.object().set_position(position) }; unsafe { self.object().set_position(position) };
@ -453,6 +496,13 @@ impl Object<'_> {
self self
} }
/// Returns the position of the object
/// Use [set_position](Self::set_position) to set the value
#[must_use]
pub fn position(&self) -> Vector2D<i32> {
unsafe { self.object_shared().position() }
}
/// Sets the affine matrix. This only has an affect in Affine mode. /// Sets the affine matrix. This only has an affect in Affine mode.
pub fn set_affine_matrix(&mut self, affine_matrix: AffineMatrixInstance) -> &mut Self { pub fn set_affine_matrix(&mut self, affine_matrix: AffineMatrixInstance) -> &mut Self {
// safety: only have one of these, doesn't modify slotmap // safety: only have one of these, doesn't modify slotmap

View file

@ -81,12 +81,20 @@ impl Attributes {
self self
} }
pub fn hflip(self) -> bool {
self.a1s.horizontal_flip()
}
pub fn set_vflip(&mut self, flip: bool) -> &mut Self { pub fn set_vflip(&mut self, flip: bool) -> &mut Self {
self.a1s.set_vertical_flip(flip); self.a1s.set_vertical_flip(flip);
self self
} }
pub fn vflip(self) -> bool {
self.a1s.vertical_flip()
}
pub fn set_x(&mut self, x: u16) -> &mut Self { pub fn set_x(&mut self, x: u16) -> &mut Self {
self.a1a.set_x(u9::new(x.rem_euclid(1 << 9))); self.a1a.set_x(u9::new(x.rem_euclid(1 << 9)));
self.a1s.set_x(u9::new(x.rem_euclid(1 << 9))); self.a1s.set_x(u9::new(x.rem_euclid(1 << 9)));
@ -94,12 +102,20 @@ impl Attributes {
self self
} }
pub fn x(self) -> u16 {
u16::from(self.a1a.x())
}
pub fn set_priority(&mut self, priority: Priority) -> &mut Self { pub fn set_priority(&mut self, priority: Priority) -> &mut Self {
self.a2.set_priority(priority); self.a2.set_priority(priority);
self self
} }
pub fn priority(self) -> Priority {
self.a2.priority()
}
pub fn hide(&mut self) -> &mut Self { pub fn hide(&mut self) -> &mut Self {
self.a0.set_object_mode(ObjectMode::Disabled); self.a0.set_object_mode(ObjectMode::Disabled);
@ -112,6 +128,10 @@ impl Attributes {
self self
} }
pub fn y(self) -> u16 {
u16::from(self.a0.y())
}
pub fn set_palette(&mut self, palette_id: u16) -> &mut Self { pub fn set_palette(&mut self, palette_id: u16) -> &mut Self {
self.a2.set_palette_bank(u4::new(palette_id as u8)); self.a2.set_palette_bank(u4::new(palette_id as u8));

View file

@ -258,26 +258,50 @@ impl ObjectUnmanaged {
} }
/// Sets the horizontal flip, note that this only has a visible affect in Normal mode. /// Sets the horizontal flip, note that this only has a visible affect in Normal mode.
/// Use [hflip](Self::hflip) to get the value
pub fn set_hflip(&mut self, flip: bool) -> &mut Self { pub fn set_hflip(&mut self, flip: bool) -> &mut Self {
self.attributes.set_hflip(flip); self.attributes.set_hflip(flip);
self self
} }
/// Returns the horizontal flip
/// Use [set_hflip](Self::set_hflip) to set the value
#[must_use]
pub fn hflip(&self) -> bool {
self.attributes.hflip()
}
/// Sets the vertical flip, note that this only has a visible affect in Normal mode. /// Sets the vertical flip, note that this only has a visible affect in Normal mode.
/// Use [vflip](Self::vflip) to get the value
pub fn set_vflip(&mut self, flip: bool) -> &mut Self { pub fn set_vflip(&mut self, flip: bool) -> &mut Self {
self.attributes.set_vflip(flip); self.attributes.set_vflip(flip);
self self
} }
/// Returns the vertical flip
/// Use [set_vflip](Self::set_vflip) to set the value
#[must_use]
pub fn vflip(&self) -> bool {
self.attributes.vflip()
}
/// Sets the priority of the object relative to the backgrounds priority. /// Sets the priority of the object relative to the backgrounds priority.
/// Use [priority](Self::priority) to get the value
pub fn set_priority(&mut self, priority: Priority) -> &mut Self { pub fn set_priority(&mut self, priority: Priority) -> &mut Self {
self.attributes.set_priority(priority); self.attributes.set_priority(priority);
self self
} }
/// Returns the priority of the object
/// Use [set_priority](Self::set_priority) to set the value
#[must_use]
pub fn priority(&self) -> Priority {
self.attributes.priority()
}
/// Changes the sprite mode to be hidden, can be changed to Normal or Affine /// Changes the sprite mode to be hidden, can be changed to Normal or Affine
/// modes using [`show`][ObjectUnmanaged::show] and /// modes using [`show`][ObjectUnmanaged::show] and
/// [`show_affine`][ObjectUnmanaged::show_affine] respectively. /// [`show_affine`][ObjectUnmanaged::show_affine] respectively.
@ -288,20 +312,39 @@ impl ObjectUnmanaged {
} }
/// Sets the x position of the object. /// Sets the x position of the object.
/// Use [x](Self::x) to get the value
/// Use [set_position](Self::set_position) to set both `x` and `y`
pub fn set_x(&mut self, x: u16) -> &mut Self { pub fn set_x(&mut self, x: u16) -> &mut Self {
self.attributes.set_x(x); self.attributes.set_x(x);
self self
} }
/// Returns the x position of the object
/// Use [set_x](Self::set_x) to set the value
#[must_use]
pub fn x(&self) -> u16 {
self.attributes.x()
}
/// Sets the y position of the object. /// Sets the y position of the object.
/// Use [y](Self::y) to get the value
/// Use [set_position](Self::set_position) to set both `x` and `y`
pub fn set_y(&mut self, y: u16) -> &mut Self { pub fn set_y(&mut self, y: u16) -> &mut Self {
self.attributes.set_y(y); self.attributes.set_y(y);
self self
} }
/// Returns the y position of the object
/// Use [set_y](Self::set_y) to set the value
#[must_use]
pub fn y(&self) -> u16 {
self.attributes.y()
}
/// Sets the position of the object. /// Sets the position of the object.
/// Use [position](Self::position) to get the value
pub fn set_position(&mut self, position: Vector2D<i32>) -> &mut Self { pub fn set_position(&mut self, position: Vector2D<i32>) -> &mut Self {
self.set_y(position.y.rem_euclid(1 << 9) as u16); self.set_y(position.y.rem_euclid(1 << 9) as u16);
self.set_x(position.x.rem_euclid(1 << 9) as u16); self.set_x(position.x.rem_euclid(1 << 9) as u16);
@ -309,6 +352,13 @@ impl ObjectUnmanaged {
self self
} }
/// Returns the position of the object
/// Use [set_position](Self::set_position) to set the value
#[must_use]
pub fn position(&self) -> Vector2D<i32> {
Vector2D::new(self.x() as i32, self.y() as i32)
}
/// Sets the affine matrix. This only has an affect in Affine mode. /// Sets the affine matrix. This only has an affect in Affine mode.
pub fn set_affine_matrix(&mut self, affine_matrix: AffineMatrixInstance) -> &mut Self { pub fn set_affine_matrix(&mut self, affine_matrix: AffineMatrixInstance) -> &mut Self {
let vram = affine_matrix.vram(); let vram = affine_matrix.vram();