Wall drawing works
This commit is contained in:
		
							parent
							
								
									0ef034f14f
								
							
						
					
					
						commit
						51419ff0b8
					
				
							
								
								
									
										11
									
								
								.idea/el_diabolo.iml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								.idea/el_diabolo.iml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | <?xml version="1.0" encoding="UTF-8"?> | ||||||
|  | <module type="EMPTY_MODULE" version="4"> | ||||||
|  |   <component name="NewModuleRootManager"> | ||||||
|  |     <content url="file://$MODULE_DIR$"> | ||||||
|  |       <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" /> | ||||||
|  |       <excludeFolder url="file://$MODULE_DIR$/target" /> | ||||||
|  |     </content> | ||||||
|  |     <orderEntry type="inheritedJdk" /> | ||||||
|  |     <orderEntry type="sourceFolder" forTests="false" /> | ||||||
|  |   </component> | ||||||
|  | </module> | ||||||
							
								
								
									
										40
									
								
								src/level.rs
									
									
									
									
									
								
							
							
						
						
									
										40
									
								
								src/level.rs
									
									
									
									
									
								
							| @ -1,5 +1,8 @@ | |||||||
|  | pub const LEVEL_WIDTH: usize = 50; | ||||||
|  | pub const LEVEL_HEIGHT: usize = 25; | ||||||
|  | 
 | ||||||
| #[derive(Copy, Clone, Debug, PartialEq)] | #[derive(Copy, Clone, Debug, PartialEq)] | ||||||
| enum LevelElement { | pub enum LevelElement { | ||||||
|     Wall, |     Wall, | ||||||
|     Floor, |     Floor, | ||||||
|     StairDown, |     StairDown, | ||||||
| @ -8,23 +11,42 @@ enum LevelElement { | |||||||
| 
 | 
 | ||||||
| #[derive(Copy, Clone, Debug, PartialEq)] | #[derive(Copy, Clone, Debug, PartialEq)] | ||||||
| pub struct Level { | pub struct Level { | ||||||
|     structure: [[LevelElement; 25]; 80], |     structure: [[LevelElement; LEVEL_HEIGHT]; LEVEL_WIDTH], | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl Level { | impl Level { | ||||||
|     pub fn new() -> Level { |     pub fn new() -> Level { | ||||||
|         let mut s = [[LevelElement::Wall; 25]; 80]; |         let mut s = [[LevelElement::Floor; LEVEL_HEIGHT]; LEVEL_WIDTH]; | ||||||
|  |         for i in 0..LEVEL_WIDTH { | ||||||
|  |             s[i][0] = LevelElement::Wall; | ||||||
|  |             s[i][LEVEL_HEIGHT-1] = LevelElement::Wall; | ||||||
|  |         } | ||||||
|  |         for i in 0..LEVEL_HEIGHT { | ||||||
|  |             s[0][i] = LevelElement::Wall; | ||||||
|  |             s[LEVEL_WIDTH-1][i] = LevelElement::Wall; | ||||||
|  |         } | ||||||
|  |         s[10][10] = LevelElement::Wall; | ||||||
|  |         s[11][10] = LevelElement::Wall; | ||||||
|  |         s[10][11] = LevelElement::Wall; | ||||||
|  |         s[11][11] = LevelElement::Wall; | ||||||
|  |         s[1][20]  = LevelElement::Wall; | ||||||
|  |         s[20][1]  = LevelElement::Wall; | ||||||
|  |         s[20][LEVEL_HEIGHT-2]  = LevelElement::Wall; | ||||||
|  |         s[LEVEL_WIDTH-2][20] = LevelElement::Wall; | ||||||
|         s[4][4] = LevelElement::StairDown; |         s[4][4] = LevelElement::StairDown; | ||||||
|         s[75][20] = LevelElement::StairUp; |         s[45][20] = LevelElement::StairUp; | ||||||
|         Level { |         Level { | ||||||
|             structure: s |             structure: s | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|     pub fn get_element(&self, x: usize, y: usize) -> Option<LevelElement> { |     pub fn get_element(&self, x: i16, y: i16) -> Option<LevelElement> { | ||||||
|         if x >= 80 || y >= 25 { |         if x < 0 || y < 0 { | ||||||
|             return None; |             return None; | ||||||
|         } |         } | ||||||
|         Some(self.structure[x][y]) |         if x >= LEVEL_WIDTH as i16 || y >= LEVEL_HEIGHT as i16 { | ||||||
|  |             return None; | ||||||
|  |         } | ||||||
|  |         Some(self.structure[x as usize][y as usize]) | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -33,6 +55,6 @@ fn test_get_element() { | |||||||
|     let l = Level::new(); |     let l = Level::new(); | ||||||
|     assert_eq!(l.get_element(0, 0).unwrap(), LevelElement::Wall); |     assert_eq!(l.get_element(0, 0).unwrap(), LevelElement::Wall); | ||||||
|     assert_eq!(l.get_element(4, 4).unwrap(), LevelElement::StairDown); |     assert_eq!(l.get_element(4, 4).unwrap(), LevelElement::StairDown); | ||||||
|     assert_eq!(l.get_element(79, 24).unwrap(), LevelElement::Wall); |     assert_eq!(l.get_element(49, 24).unwrap(), LevelElement::Wall); | ||||||
|     assert_eq!(l.get_element(80, 25), None); |     assert_eq!(l.get_element(50, 25), None); | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										76
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										76
									
								
								src/main.rs
									
									
									
									
									
								
							| @ -1,16 +1,86 @@ | |||||||
|  | use crossterm::{ | ||||||
|  |     event::{self, KeyCode, KeyEventKind}, | ||||||
|  |     terminal::{disable_raw_mode, enable_raw_mode, EnterAlternateScreen, LeaveAlternateScreen}, | ||||||
|  |     ExecutableCommand, | ||||||
|  | }; | ||||||
|  | use ratatui::{ | ||||||
|  |     prelude::{CrosstermBackend, Stylize, Terminal}, | ||||||
|  |     widgets::Paragraph, | ||||||
|  | }; | ||||||
|  | use std::io::{stdout, Result}; | ||||||
|  | use ratatui::prelude::*; | ||||||
|  | use ratatui::widgets::Block; | ||||||
|  | 
 | ||||||
| use crate::game::Game; | use crate::game::Game; | ||||||
| use crate::level::Level; | use crate::level::Level; | ||||||
|  | use crate::level_widget::LevelWidget; | ||||||
| use crate::player::Player; | use crate::player::Player; | ||||||
| 
 | 
 | ||||||
| mod game; | mod game; | ||||||
| mod player; | mod player; | ||||||
| mod level; | mod level; | ||||||
| mod position; | mod position; | ||||||
|  | mod level_widget; | ||||||
| 
 | 
 | ||||||
| fn main() { | fn main() -> Result<()> { | ||||||
|     let g = Game { |     let g = Game { | ||||||
|         player: Player::new("Teddy Tester", 10), |         player: Player::new("Teddy Tester", 10), | ||||||
|         levels: [Level::new();25] |         levels: [Level::new(); 25], | ||||||
|     }; |     }; | ||||||
|     println!("{}",g.player.get_name()); | 
 | ||||||
|  |     stdout().execute(EnterAlternateScreen)?; | ||||||
|  |     enable_raw_mode()?; | ||||||
|  |     let mut terminal = Terminal::new(CrosstermBackend::new(stdout()))?; | ||||||
|  |     terminal.clear()?; | ||||||
|  | 
 | ||||||
|  |     loop { | ||||||
|  |         terminal.draw(|frame| { | ||||||
|  |             let mut area = frame.size(); | ||||||
|  |             frame.render_widget(Block::default().style(Style::default().bg(Color::Green)), area); | ||||||
|  | 
 | ||||||
|  |             if area.width > 80 { | ||||||
|  |                 area.x = (area.width - 80) / 2; | ||||||
|  |                 area.width = 80; | ||||||
|  |             } | ||||||
|  |             if area.height > 25 { | ||||||
|  |                 area.y = (area.height - 25) / 2; | ||||||
|  |                 area.height = 25; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             let map_area = Rect { | ||||||
|  |                 x: area.x, | ||||||
|  |                 y: area.y, | ||||||
|  |                 width: level::LEVEL_WIDTH as u16, | ||||||
|  |                 height: level::LEVEL_HEIGHT as u16, | ||||||
|  |             }; | ||||||
|  |             frame.render_widget(LevelWidget { content: g.levels[0] }, map_area); | ||||||
|  | 
 | ||||||
|  |             let stats_area = Rect { | ||||||
|  |                 x: area.x + 50, | ||||||
|  |                 y: area.y, | ||||||
|  |                 width: 30, | ||||||
|  |                 height: 25, | ||||||
|  |             }; | ||||||
|  |             frame.render_widget( | ||||||
|  |                 Paragraph::new(format!("{}\nHealth: {}/{}", | ||||||
|  |                                        g.player.get_name(), | ||||||
|  |                                        g.player.get_life(), | ||||||
|  |                                        g.player.get_max_life())) | ||||||
|  |                     .white() | ||||||
|  |                     .on_blue(), | ||||||
|  |                 stats_area, | ||||||
|  |             ); | ||||||
|  |         })?; | ||||||
|  |         if event::poll(std::time::Duration::from_millis(16))? { | ||||||
|  |             if let event::Event::Key(key) = event::read()? { | ||||||
|  |                 if key.kind == KeyEventKind::Press && key.code == KeyCode::Char('q') { | ||||||
|  |                     break; | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     stdout().execute(LeaveAlternateScreen)?; | ||||||
|  |     disable_raw_mode()?; | ||||||
|  |     Ok(()) | ||||||
| } | } | ||||||
|  | |||||||
| @ -20,6 +20,8 @@ impl Player { | |||||||
|     pub fn get_name(&self) -> String { |     pub fn get_name(&self) -> String { | ||||||
|         return self.name.clone(); |         return self.name.clone(); | ||||||
|     } |     } | ||||||
|  |     pub fn get_life(&self) -> i16 {self.life} | ||||||
|  |     pub fn get_max_life(&self) -> i16 {self.max_life} | ||||||
|     pub fn change_life(&mut self, by: i16) { |     pub fn change_life(&mut self, by: i16) { | ||||||
|         self.life = max(0, min(self.max_life, self.life + by)); |         self.life = max(0, min(self.max_life, self.life + by)); | ||||||
|     } |     } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user