Add a dice-game with 10-sides and cat-prize for 10
This commit is contained in:
parent
0be133e40a
commit
ad1941c798
136
src/main.rs
136
src/main.rs
@ -13,15 +13,17 @@ use core::ptr::addr_of;
|
||||
use atmega_hal::{
|
||||
Adc, Usart,
|
||||
adc::AdcSettings,
|
||||
delay,
|
||||
spi::{self, Settings},
|
||||
usart::Baudrate,
|
||||
};
|
||||
use embedded_hal::delay::DelayNs;
|
||||
use panic_halt as _;
|
||||
|
||||
use crate::{
|
||||
display::{Display, Rgb565, Vec2},
|
||||
font::{draw_number, draw_text},
|
||||
graphics::{Image, LARGE_CAT_UNSAFE},
|
||||
graphics::{Image, LARGE_CAT_UNSAFE, draw_image},
|
||||
peripherals::{Button, Knob},
|
||||
};
|
||||
|
||||
@ -84,106 +86,100 @@ fn main() -> ! {
|
||||
adc,
|
||||
};
|
||||
|
||||
let mut idx = 0;
|
||||
let images = [Image::from(addr_of!(LARGE_CAT_UNSAFE))];
|
||||
let len = images.len();
|
||||
|
||||
let mut delay = atmega_hal::delay::Delay::<CoreClock>::new();
|
||||
|
||||
let mut position = Vec2 { x: 10, y: 10 };
|
||||
let original_position = position.clone();
|
||||
draw_text(
|
||||
&mut display,
|
||||
"button:\n",
|
||||
"dice:\n",
|
||||
Rgb565::white(),
|
||||
Rgb565::black(),
|
||||
&mut position,
|
||||
3,
|
||||
);
|
||||
let button_pos = position.clone();
|
||||
let mut counter = 0;
|
||||
let number_pos = position.clone();
|
||||
draw_number(
|
||||
&mut display,
|
||||
counter,
|
||||
0,
|
||||
Rgb565::white(),
|
||||
Rgb565::black(),
|
||||
&mut button_pos.clone(),
|
||||
&mut number_pos.clone(),
|
||||
3,
|
||||
);
|
||||
|
||||
draw_text(
|
||||
&mut display,
|
||||
"\nvolume:\n",
|
||||
Rgb565::white(),
|
||||
Rgb565::black(),
|
||||
&mut position,
|
||||
3,
|
||||
);
|
||||
|
||||
let volume_pos = position.clone();
|
||||
let mut last_volume = knob.raw();
|
||||
let mut counter = 0;
|
||||
draw_number(
|
||||
&mut display,
|
||||
last_volume.into(),
|
||||
Rgb565::white(),
|
||||
Rgb565::black(),
|
||||
&mut volume_pos.clone(),
|
||||
3,
|
||||
);
|
||||
|
||||
let mut clock = 0u32;
|
||||
let mut animation = 0;
|
||||
let mut animation_reached = true;
|
||||
let mut cat_received = false;
|
||||
let max_number = 10;
|
||||
loop {
|
||||
let volume = knob.raw();
|
||||
if volume != last_volume {
|
||||
if volume == 0 || last_volume == 0 || last_volume.ilog10() > volume.ilog10() {
|
||||
// Clear previous
|
||||
clock += 1;
|
||||
if button.poll() {
|
||||
animation = 50;
|
||||
animation_reached = false;
|
||||
if cat_received {
|
||||
display.draw_rect(
|
||||
Vec2 { x: 0, y: 0 },
|
||||
Vec2 { x: 240, y: 240 },
|
||||
Rgb565::black().as_color(),
|
||||
);
|
||||
draw_text(
|
||||
&mut display,
|
||||
" ",
|
||||
"dice:\n",
|
||||
Rgb565::white(),
|
||||
Rgb565::black(),
|
||||
&mut volume_pos.clone(),
|
||||
&mut original_position.clone(),
|
||||
3,
|
||||
);
|
||||
cat_received = false;
|
||||
}
|
||||
}
|
||||
if animation > 0 {
|
||||
let modulo = match animation {
|
||||
50..100 => 5,
|
||||
20..50 => 10,
|
||||
0..20 => 20,
|
||||
_ => 10,
|
||||
};
|
||||
animation -= 1;
|
||||
if animation % modulo == 0 {
|
||||
let random = (((clock * 543_128) ^ 7_643_125) & 0b11111111) as f32 / 255f32;
|
||||
let dice = (random * max_number as f32) as u32;
|
||||
draw_number(
|
||||
&mut display,
|
||||
dice,
|
||||
Rgb565::white(),
|
||||
Rgb565::black(),
|
||||
&mut number_pos.clone(),
|
||||
3,
|
||||
);
|
||||
}
|
||||
last_volume = volume;
|
||||
} else if !animation_reached {
|
||||
animation_reached = true;
|
||||
let random = (((clock * 543_128) ^ 7_643_125) & 0b11111111) as f32 / 255f32;
|
||||
let dice = (random * max_number as f32 + 1f32) as u32;
|
||||
draw_number(
|
||||
&mut display,
|
||||
volume.into(),
|
||||
dice,
|
||||
Rgb565::white(),
|
||||
Rgb565::black(),
|
||||
&mut volume_pos.clone(),
|
||||
&mut number_pos.clone(),
|
||||
3,
|
||||
);
|
||||
}
|
||||
|
||||
if button.poll() {
|
||||
counter += 1;
|
||||
draw_number(
|
||||
&mut display,
|
||||
counter,
|
||||
Rgb565::white(),
|
||||
Rgb565::black(),
|
||||
&mut button_pos.clone(),
|
||||
3,
|
||||
);
|
||||
// match draw_image(
|
||||
// &mut serial,
|
||||
// &mut images[idx].iter(),
|
||||
// &mut display,
|
||||
// Vec2 { x: 0, y: 0 },
|
||||
// ) {
|
||||
// Ok(_) => ufmt::uwriteln!(serial, "Successfully read QOI").unwrap(),
|
||||
// Err(e) => ufmt::uwriteln!(serial, "Error: {:?}", e).unwrap(),
|
||||
// }
|
||||
|
||||
// draw_text(
|
||||
// &mut display,
|
||||
// "you just lost the game!",
|
||||
// Rgb565::white(),
|
||||
// Rgb565::black(),
|
||||
// &mut Vec2 { x: 10, y: 10 },
|
||||
// 3,
|
||||
// );
|
||||
|
||||
// idx = (idx + 1) % len;
|
||||
if dice == max_number {
|
||||
delay.delay_ms(1000);
|
||||
draw_image(
|
||||
&mut serial,
|
||||
&mut Image::from(addr_of!(LARGE_CAT_UNSAFE)).iter(),
|
||||
&mut display,
|
||||
Vec2 { x: 0, y: 0 },
|
||||
)
|
||||
.unwrap();
|
||||
cat_received = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user