Compare commits
No commits in common. "d030563e49b89278070b1d7f42df1046b7fff4aa" and "ea7fcae065c2f44644e2b66685f90b8225733a92" have entirely different histories.
d030563e49
...
ea7fcae065
3902
iced-tetris/Cargo.lock
generated
3902
iced-tetris/Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@ -1,13 +1,14 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "iced-tetris"
|
name = "iced-tetris"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
edition = "2021"
|
edition = "2018"
|
||||||
resolver = "2"
|
resolver = "2"
|
||||||
|
|
||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
iced = { version = "0.13.1", features = ["tokio"] }
|
iced = { git = "https://github.com/hecrj/iced", rev = "099981cfc2f61a1f37e84100592d65babb94fb82", features = ["tokio", "canvas"] }
|
||||||
|
iced_native = { git = "https://github.com/hecrj/iced", rev = "099981cfc2f61a1f37e84100592d65babb94fb82"}
|
||||||
chrono = "0.4.19"
|
chrono = "0.4.19"
|
||||||
rand = "0.8.4"
|
rand = "0.8.4"
|
||||||
tetris-logic = { path = "../tetris-logic" }
|
tetris-logic = { path = "../tetris-logic" }
|
||||||
|
@ -1,107 +1,17 @@
|
|||||||
/*
|
|
||||||
use iced::widget::canvas::{self, Path, Stroke, Text};
|
use iced::widget::canvas::{self, Path, Stroke, Text};
|
||||||
use iced::{
|
use iced::{
|
||||||
executor, keyboard, time, Application, Color, Command, Element, Length, Point, Rectangle,
|
executor, keyboard, time, Application, Color, Command, Element, Length, Point, Rectangle,
|
||||||
Settings, Size, Subscription,
|
Settings, Size, Subscription,
|
||||||
};
|
};
|
||||||
use tetris_logic::{BlockGrid, MoveDirection, Tetromino};
|
use iced_native::{event, subscription, Event};
|
||||||
*/
|
|
||||||
|
|
||||||
use iced::{
|
|
||||||
widget::{button, text},
|
|
||||||
Element, Subscription, Task,
|
|
||||||
};
|
|
||||||
use tetris_logic::{BlockGrid, MoveDirection, Tetromino};
|
use tetris_logic::{BlockGrid, MoveDirection, Tetromino};
|
||||||
|
|
||||||
fn main() -> iced::Result {
|
fn main() -> iced::Result {
|
||||||
//Tetris::run(Settings::default())
|
Tetris::run(Settings::default())
|
||||||
iced::application(Tetris::title, update, view)
|
|
||||||
.subscription(subscription)
|
|
||||||
.run_with(|| (Tetris::new(), Task::none()))
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
|
||||||
enum Message {
|
|
||||||
Up,
|
|
||||||
Down,
|
|
||||||
Left,
|
|
||||||
Right,
|
|
||||||
Pause,
|
|
||||||
Tick(chrono::DateTime<chrono::Local>),
|
|
||||||
}
|
|
||||||
|
|
||||||
fn update(state: &mut Tetris, message: Message) {
|
|
||||||
match message {
|
|
||||||
Message::Pause => state.paused = !state.paused,
|
|
||||||
Message::Tick(_) => {
|
|
||||||
if !state.paused {
|
|
||||||
state.ticks += 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Message::Up => {
|
|
||||||
state.blocks.rotate_active_piece();
|
|
||||||
}
|
|
||||||
Message::Down => {
|
|
||||||
state.blocks.move_active_piece(MoveDirection::HardDrop);
|
|
||||||
}
|
|
||||||
Message::Left => {
|
|
||||||
state.blocks.move_active_piece(MoveDirection::Left);
|
|
||||||
}
|
|
||||||
Message::Right => {
|
|
||||||
state.blocks.move_active_piece(MoveDirection::Right);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
if state.blocks.piece_currently_active() {
|
|
||||||
if state.ticks % 10 == 0 && !state.paused {
|
|
||||||
state.blocks.move_active_piece(MoveDirection::SoftDrop);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
let piece: Tetromino = rand::random();
|
|
||||||
state.blocks.drop_piece(piece);
|
|
||||||
}
|
|
||||||
|
|
||||||
let lines_removed = state.blocks.clear_pieces();
|
|
||||||
state.lines_removed += lines_removed;
|
|
||||||
}
|
|
||||||
|
|
||||||
fn subscription(_state: &Tetris) -> Subscription<Message> {
|
|
||||||
let keyboard_subscription = iced::keyboard::on_key_press(|key, _modifiers| {
|
|
||||||
use iced::keyboard::key::{Key, Named};
|
|
||||||
match key {
|
|
||||||
Key::Named(Named::ArrowUp) => Some(Message::Up),
|
|
||||||
Key::Named(Named::ArrowDown) => Some(Message::Down),
|
|
||||||
Key::Named(Named::ArrowLeft) => Some(Message::Left),
|
|
||||||
Key::Named(Named::ArrowRight) => Some(Message::Right),
|
|
||||||
Key::Named(Named::Space) => Some(Message::Pause),
|
|
||||||
_ => None,
|
|
||||||
}
|
|
||||||
});
|
|
||||||
/*
|
|
||||||
let keyboard_subscription = subscription::events_with(|event, status| {
|
|
||||||
if let event::Status::Captured = status {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
|
|
||||||
match event {
|
|
||||||
Event::Keyboard(keyboard::Event::KeyPressed { key_code, .. }) => {
|
|
||||||
handle_keypress(key_code)
|
|
||||||
}
|
|
||||||
_ => None,
|
|
||||||
}
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
|
|
||||||
let time_subscription = iced::time::every(std::time::Duration::from_millis(50))
|
|
||||||
.map(|_| Message::Tick(chrono::Local::now()));
|
|
||||||
Subscription::batch([time_subscription, keyboard_subscription])
|
|
||||||
}
|
|
||||||
|
|
||||||
fn view(_state: &Tetris) -> Element<Message> {
|
|
||||||
button(text("FOO")).on_press(Message::Up).into()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Tetris {
|
struct Tetris {
|
||||||
//background_cache: canvas::Cache,
|
background_cache: canvas::Cache,
|
||||||
blocks: BlockGrid,
|
blocks: BlockGrid,
|
||||||
ticks: usize,
|
ticks: usize,
|
||||||
paused: bool,
|
paused: bool,
|
||||||
@ -109,13 +19,9 @@ struct Tetris {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Tetris {
|
impl Tetris {
|
||||||
fn title(&self) -> String {
|
|
||||||
String::from("Tetris - Iced")
|
|
||||||
}
|
|
||||||
|
|
||||||
fn new() -> Tetris {
|
fn new() -> Tetris {
|
||||||
Tetris {
|
Tetris {
|
||||||
//background_cache: canvas::Cache::default(),
|
background_cache: canvas::Cache::default(),
|
||||||
blocks: BlockGrid::new(),
|
blocks: BlockGrid::new(),
|
||||||
ticks: 0,
|
ticks: 0,
|
||||||
paused: false,
|
paused: false,
|
||||||
@ -124,7 +30,6 @@ impl Tetris {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
impl Application for Tetris {
|
impl Application for Tetris {
|
||||||
type Executor = executor::Default;
|
type Executor = executor::Default;
|
||||||
type Message = Message;
|
type Message = Message;
|
||||||
@ -200,9 +105,7 @@ impl Application for Tetris {
|
|||||||
.into()
|
.into()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
impl<'a> canvas::Program<Message> for Tetris {
|
impl<'a> canvas::Program<Message> for Tetris {
|
||||||
fn draw(&self, bounds: Rectangle, _cursor: canvas::Cursor) -> Vec<canvas::Geometry> {
|
fn draw(&self, bounds: Rectangle, _cursor: canvas::Cursor) -> Vec<canvas::Geometry> {
|
||||||
let game_width = bounds.width / 3.0;
|
let game_width = bounds.width / 3.0;
|
||||||
@ -268,9 +171,7 @@ impl<'a> canvas::Program<Message> for Tetris {
|
|||||||
vec![background, frame.into_geometry()]
|
vec![background, frame.into_geometry()]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
fn handle_keypress(key_code: keyboard::KeyCode) -> Option<Message> {
|
fn handle_keypress(key_code: keyboard::KeyCode) -> Option<Message> {
|
||||||
use keyboard::KeyCode;
|
use keyboard::KeyCode;
|
||||||
|
|
||||||
@ -283,4 +184,13 @@ fn handle_keypress(key_code: keyboard::KeyCode) -> Option<Message> {
|
|||||||
_ => return None,
|
_ => return None,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
enum Message {
|
||||||
|
Up,
|
||||||
|
Down,
|
||||||
|
Left,
|
||||||
|
Right,
|
||||||
|
Pause,
|
||||||
|
Tick(chrono::DateTime<chrono::Local>),
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user