agb/book/games/pong/src/main.rs

60 lines
2 KiB
Rust
Raw Normal View History

// Games made using `agb` are no_std which means you don't have access to the standard
// rust library. This is because the game boy advance doesn't really have an operating
// system, so most of the content of the standard library doesn't apply.
//
// Provided you haven't disabled it, agb does provide an allocator, so it is possible
// to use both the `core` and the `alloc` built in crates.
2022-01-02 09:37:39 +11:00
#![no_std]
// `agb` defines its own `main` function, so you must declare your game's main function
// using the #[agb::entry] proc macro. Failing to do so will cause failure in linking
// which won't be a particularly clear error message.
2022-01-02 09:37:39 +11:00
#![no_main]
// This is required in order to ensure that the panic handler defined in `agb` is set
// up correctly.
2022-01-02 09:37:39 +11:00
extern crate agb;
2022-01-02 11:40:34 +11:00
use agb::display::object::Size;
use agb::Gba;
// Put all the graphics related code in the gfx module
2022-01-02 11:21:59 +11:00
mod gfx {
use agb::display::object::ObjectControl;
// Import the sprites into this module. This will create a `sprites` module
// and within that will be a constant called `sprites` which houses all the
// palette and tile data.
2022-01-02 11:21:59 +11:00
agb::include_gfx!("gfx/sprites.toml");
// Loads the sprites tile data and palette data into VRAM
pub fn load_sprite_data(object: &mut ObjectControl) {
object.set_sprite_palettes(sprites::sprites.palettes);
object.set_sprite_tilemap(sprites::sprites.tiles);
}
2022-01-02 11:21:59 +11:00
}
// The main function must take 0 arguments and never return. The agb::entry decorator
// ensures that everything is in order. `agb` will call this after setting up the stack
// and interrupt handlers correctly.
2022-01-02 09:37:39 +11:00
#[agb::entry]
fn main() -> ! {
let mut gba = Gba::new();
2022-01-02 09:37:39 +11:00
2022-01-02 11:40:34 +11:00
let _tiled = gba.display.video.tiled0();
2022-01-02 11:21:59 +11:00
let mut object = gba.display.object.get();
gfx::load_sprite_data(&mut object);
2022-01-02 11:40:34 +11:00
object.enable();
let mut ball = object.get_object_standard();
2022-01-02 22:14:18 +11:00
ball.set_x(50)
.set_y(50)
.set_sprite_size(Size::S16x16)
.set_tile_id(4 * 2)
2022-01-02 22:27:26 +11:00
.show();
ball.commit();
2022-01-02 11:21:59 +11:00
loop {}
2022-01-02 09:37:39 +11:00
}