Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

main.rs 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. # This will likely be the final update since this tutorial is unfinished and abandoned.
  2. # sunjay.dev/learn-game-dev is the url.
  3. mod components;
  4. mod physics;
  5. mod animator;
  6. mod keyboard;
  7. mod renderer;
  8. use sdl2::pixels::Color;
  9. use sdl2::event::Event;
  10. use sdl2::keyboard::Keycode;
  11. use sdl2::rect::{Point, Rect};
  12. use sdl2::image::{self, LoadTexture, InitFlag};
  13. use specs::prelude::*;
  14. use std::time::Duration;
  15. use crate::components::*;
  16. pub enum MovementCommand {
  17. Stop,
  18. Move(Direction),
  19. }
  20. fn direction_spritesheet_row(direction: Direction) -> i32 {
  21. use self::Direction::*;
  22. match direction {
  23. Up => 3,
  24. Down => 0,
  25. Left => 1,
  26. Right => 2,
  27. }
  28. }
  29. fn character_animation_frames(spritesheet: usize, top_left_frame: Rect, direction: Direction) -> Vec<Sprite> {
  30. let (frame_width, frame_height) = top_left_frame.size();
  31. let y_offset = top_left_frame.y() + frame_height as i32 * direction_spritesheet_row(direction);
  32. let mut frames = Vec::new();
  33. for i in 0..3 {
  34. frames.push(Sprite {
  35. spritesheet,
  36. region: Rect::new(
  37. top_left_frame.x() + frame_width as i32 * i,
  38. y_offset,
  39. frame_width,
  40. frame_height,
  41. )
  42. })
  43. }
  44. return frames
  45. }
  46. fn main() -> Result<(), String> {
  47. let sdl_context = sdl2::init()?;
  48. let video_subsystem = sdl_context.video()?;
  49. let _image_content = image::init(InitFlag::PNG | InitFlag::JPG)?;
  50. let window = video_subsystem.window("game tutorial", 800, 600)
  51. .position_centered()
  52. .build()
  53. .expect("could not initialize video subsystem");
  54. let mut canvas = window.into_canvas().build().expect("could not make a canvas");
  55. let texture_creator = canvas.texture_creator();
  56. let mut dispatcher = DispatcherBuilder::new()
  57. .with(keyboard::Keyboard, "Keyboard", &[])
  58. .with(physics::Physics, "Physics", &["Keyboard"])
  59. .with(animator::Animator, "Animator", &["Keyboard"])
  60. .build();
  61. let mut world = World::new();
  62. dispatcher.setup(&mut world.res);
  63. renderer::SystemData::setup(&mut world.res);
  64. let movement_command: Option<MovementCommand> = None;
  65. world.add_resource(movement_command);
  66. let textures = [
  67. texture_creator.load_texture("assets/bardo.png")?,
  68. ];
  69. let player_spritesheet = 0;
  70. let player_top_left_frame = Rect::new(0, 0, 26, 36);
  71. let player_animation = MovementAnimation {
  72. current_frame: 0,
  73. up_frames: character_animation_frames(player_spritesheet, player_top_left_frame, Direction::Up),
  74. down_frames: character_animation_frames(player_spritesheet, player_top_left_frame, Direction::Down),
  75. left_frames: character_animation_frames(player_spritesheet, player_top_left_frame, Direction::Left),
  76. right_frames: character_animation_frames(player_spritesheet, player_top_left_frame, Direction::Right),
  77. };
  78. world.create_entity()
  79. .with(KeyboardControlled)
  80. .with(Position(Point::new(0, 0)))
  81. .with(Velocity {speed: 0, direction: Direction::Right})
  82. .with(player_animation.right_frames[0].clone())
  83. .with(player_animation)
  84. .build();
  85. let mut event_pump = sdl_context.event_pump()?;
  86. let mut i = 0;
  87. 'running: loop {
  88. let mut movement_command = None;
  89. for event in event_pump.poll_iter() {
  90. match event {
  91. Event::Quit {..} |
  92. Event::KeyDown { keycode: Some(Keycode::Escape), .. } => {
  93. break 'running;
  94. },
  95. Event::KeyDown { keycode: Some(Keycode::Left), repeat: false, .. } => {
  96. movement_command = Some(MovementCommand::Move(Direction::Left));
  97. },
  98. Event::KeyDown { keycode: Some(Keycode::Right), repeat: false, .. } => {
  99. movement_command = Some(MovementCommand::Move(Direction::Right));
  100. },
  101. Event::KeyDown { keycode: Some(Keycode::Up), repeat: false, .. } => {
  102. movement_command = Some(MovementCommand::Move(Direction::Up));
  103. },
  104. Event::KeyDown { keycode: Some(Keycode::Down), repeat: false, .. } => {
  105. movement_command = Some(MovementCommand::Move(Direction::Down));
  106. },
  107. Event::KeyUp { keycode: Some(Keycode::Left), repeat: false, .. } |
  108. Event::KeyUp { keycode: Some(Keycode::Right), repeat: false, .. } |
  109. Event::KeyUp { keycode: Some(Keycode::Up), repeat: false, .. } |
  110. Event::KeyUp { keycode: Some(Keycode::Down), repeat: false, .. } => {
  111. movement_command = Some(MovementCommand::Stop);
  112. },
  113. _ => {}
  114. }
  115. }
  116. *world.write_resource() = movement_command;
  117. i = (i + 1) % 255;
  118. dispatcher.dispatch(&mut world.res);
  119. world.maintain();
  120. renderer::render(&mut canvas, Color::RGB(i, 64, 255 - i), &textures, world.system_data())?;
  121. ::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 20));
  122. }
  123. Ok(())
  124. }