diff --git a/src/main.rs b/src/main.rs index cd31cfe..0532dc6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -56,7 +56,7 @@ impl Application for ExampleApp { fn init(canvas: &mut Canvas) -> Result { use canvas::{ utils::Size, - sprite::Sprite, + sprite::{Sprite, Center}, }; //// 20 x 20 sprite of a picture @@ -64,7 +64,7 @@ impl Application for ExampleApp { .unwrap(); let mut tex_sprite = canvas.create_texture_sprite(Size {w: 1280, h: 720}); tex_sprite.set_texture(texture.clone(), Some(Position {x: 0, y: 0}), 1.0); - tex_sprite.set_center(Position {x:-1280/2, y:-720/2}); + tex_sprite.set_center(Center::BotLeft); tex_sprite.set_position(Position {x: 0, y: 0}); let mut sub_sprite = canvas.create_texture_sprite(Size {w: 100, h: 100}); @@ -74,12 +74,12 @@ impl Application for ExampleApp { let mut sub_sprite2 = canvas.create_texture_sprite(Size {w: 200, h: 200}); sub_sprite2.set_texture(texture.clone(), Some(Position {x: 100, y: 0}), 1.0); - sub_sprite2.set_center(Position {x:100, y:100}); + sub_sprite2.set_center(Center::Custom(Position {x:100, y:100})); sub_sprite2.set_rotation(0.0); sub_sprite2.set_position(Position {x: 100, y: 100}); let mut txt_sprite = canvas.create_text_sprite("00", Size {w: 100, h: 100}, 22.0); - txt_sprite.set_center(Position {x:-50, y:50}); + txt_sprite.set_center(Center::BotLeft); txt_sprite.set_position(Position {x:100, y:100}); txt_sprite.set_scale(1.0); diff --git a/src/sprite.rs b/src/sprite.rs index 47af0b3..813f035 100644 --- a/src/sprite.rs +++ b/src/sprite.rs @@ -19,6 +19,16 @@ use crate::{ //--External imports-------------------------------------------------------------------------------- +//--Center enum------------------------------------------------------------------------------------- +pub enum Center { + Geometric, + TopLeft, + TopRight, + BotLeft, + BotRight, + Custom(Position), +} + //--Sprite trait------------------------------------------------------------------------------------ /// The interface for everything that can be rendered by the engine. @@ -31,7 +41,7 @@ pub trait Sprite { fn set_position(&mut self, position: Position); /// Sets the center of the [`Sprite`] for rotations as well as translations - fn set_center(&mut self, center: Position); + fn set_center(&mut self, center: Center); /// Sets the rotation of the [`Sprite`] on the screen fn set_rotation(&mut self, rotation: f32); diff --git a/src/sprite/shape_sprite.rs b/src/sprite/shape_sprite.rs index cfcb1e4..28fd027 100644 --- a/src/sprite/shape_sprite.rs +++ b/src/sprite/shape_sprite.rs @@ -5,7 +5,7 @@ use log::{debug, error, info, trace, warn}; use crate::{ renderer::WgpuRenderer, - sprite::Sprite, + sprite::{Sprite, Center}, shape::Shape, utils::{Pixel, Position, Size}, }; @@ -39,7 +39,7 @@ impl Sprite for ShapeSprite { todo!(); } - fn set_center(&mut self, _center: Position) { + fn set_center(&mut self, _center: Center) { todo!(); } diff --git a/src/sprite/text_sprite.rs b/src/sprite/text_sprite.rs index 5a3f62d..d9a7c45 100644 --- a/src/sprite/text_sprite.rs +++ b/src/sprite/text_sprite.rs @@ -5,7 +5,7 @@ use log::{debug, error, info, trace, warn}; use crate::{ renderer::WgpuRenderer, - sprite::Sprite, + sprite::{Sprite, Center}, utils::{Pixel, Color, Position, Size}, }; use super::TextureSprite; @@ -149,7 +149,7 @@ impl Sprite for TextSprite { self.texture_sprite.set_position(position); } - fn set_center(&mut self, center: Position) { + fn set_center(&mut self, center: Center) { self.texture_sprite.set_center(center); } diff --git a/src/sprite/texture_sprite.rs b/src/sprite/texture_sprite.rs index c9e822f..2794dd6 100644 --- a/src/sprite/texture_sprite.rs +++ b/src/sprite/texture_sprite.rs @@ -3,7 +3,7 @@ use log::{debug, error, info, trace, warn}; //--Internal imports-------------------------------------------------------------------------------- -use super::Sprite; +use super::{Sprite, Center}; use crate::{ texture::TextureHandle, @@ -148,8 +148,28 @@ impl Sprite for TextureSprite { self.matrix.set_position(position); } - fn set_center(&mut self, center: Position) { - self.matrix.set_center(center); + fn set_center(&mut self, center: Center) { + let center_pos = match center { + Center::Geometric => Position {x: 0, y: 0}, + Center::TopLeft => Position { + x: -(self.inner_size.w as i32) / 2, + y: (self.inner_size.h as i32) / 2 + }, + Center::TopRight => Position { + x: (self.inner_size.w as i32) / 2, + y: (self.inner_size.h as i32) / 2 + }, + Center::BotLeft => Position { + x: -(self.inner_size.w as i32) / 2, + y: -(self.inner_size.h as i32) / 2 + }, + Center::BotRight => Position { + x: (self.inner_size.w as i32) / 2, + y: -(self.inner_size.h as i32) / 2 + }, + Center::Custom(pos) => pos, + }; + self.matrix.set_center(center_pos); } fn set_rotation(&mut self, rotation: f32) {