You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

main.rs 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. use sdl2::pixels::Color;
  2. use sdl2::event::Event;
  3. use sdl2::keyboard::Keycode;
  4. use sdl2::render::{WindowCanvas, Texture};
  5. use sdl2::image::{self, LoadTexture, InitFlag};
  6. use sdl2::rect::{Point, Rect};
  7. use std::time::Duration;
  8. const PLAYER_MOVEMENT_SPEED: i32 = 10;
  9. #[derive(Debug, Clone, Copy, PartialEq, Eq)]
  10. enum Direction {
  11. Up,
  12. Down,
  13. Left,
  14. Right,
  15. }
  16. #[derive(Debug)]
  17. struct Player {
  18. position: Point,
  19. sprite: Rect,
  20. speed: i32,
  21. direction: Direction,
  22. }
  23. fn render(
  24. canvas: &mut WindowCanvas,
  25. color: Color,
  26. texture: &Texture,
  27. player: &Player
  28. ) -> Result<(), String> {
  29. canvas.set_draw_color(color);
  30. canvas.clear();
  31. let (width, height) = canvas.output_size()?;
  32. let screen_position = player.position + Point::new(width as i32 / 2, height as i32 / 2);
  33. let screen_rect = Rect::from_center(screen_position, player.sprite.width(), player.sprite.height());
  34. canvas.copy(texture, player.sprite, screen_rect)?;
  35. canvas.present();
  36. Ok(())
  37. }
  38. fn update_player(player: &mut Player) {
  39. use self::Direction::*;
  40. match player.direction {
  41. Left => {
  42. player.position = player.position.offset(-player.speed, 0);
  43. },
  44. Right => {
  45. player.position = player.position.offset(player.speed, 0);
  46. },
  47. Up => {
  48. player.position = player.position.offset(0, -player.speed);
  49. },
  50. Down => {
  51. player.position = player.position.offset(0, player.speed);
  52. },
  53. }
  54. }
  55. fn main() -> Result<(), String> {
  56. let sdl_context = sdl2::init()?;
  57. let video_subsystem = sdl_context.video()?;
  58. let _image_context = image::init(InitFlag::PNG | InitFlag::JPG)?;
  59. let window = video_subsystem.window("game tutorial", 800, 600)
  60. .position_centered()
  61. .build()
  62. .expect("could not initialize video subsystem");
  63. let mut canvas = window.into_canvas().build()
  64. .expect("could not make a canvas");
  65. let texture_creator = canvas.texture_creator();
  66. let texture = texture_creator.load_texture("assets/bardo.png")?;
  67. let mut player = Player {
  68. position: Point::new(0,0),
  69. sprite: Rect::new(0, 0, 26, 36),
  70. speed: 0,
  71. direction: Direction::Right,
  72. };
  73. let mut event_pump = sdl_context.event_pump()?;
  74. let mut i = 0;
  75. 'running: loop {
  76. for event in event_pump.poll_iter() {
  77. match event {
  78. Event::Quit {..} |
  79. Event::KeyDown { keycode: Some(Keycode::Escape), .. } => {
  80. break 'running;
  81. },
  82. Event::KeyDown { keycode: Some(Keycode::Left), .. } => {
  83. player.speed = PLAYER_MOVEMENT_SPEED;
  84. player.direction = Direction::Left;
  85. },
  86. Event::KeyDown { keycode: Some(Keycode::Right), .. } => {
  87. player.speed = PLAYER_MOVEMENT_SPEED;
  88. player.direction = Direction::Right;
  89. },
  90. Event::KeyDown { keycode: Some(Keycode::Up), .. } => {
  91. player.speed = PLAYER_MOVEMENT_SPEED;
  92. player.direction = Direction::Up;
  93. },
  94. Event::KeyDown { keycode: Some(Keycode::Down), .. } => {
  95. player.speed = PLAYER_MOVEMENT_SPEED;
  96. player.direction = Direction::Down;
  97. },
  98. Event::KeyUp { keycode: Some(Keycode::Left), repeat: false, .. } |
  99. Event::KeyUp { keycode: Some(Keycode::Right), repeat: false, .. } |
  100. Event::KeyUp { keycode: Some(Keycode::Up), repeat: false, .. } |
  101. Event::KeyUp { keycode: Some(Keycode::Down), repeat: false, .. } => {
  102. player.speed = 0;
  103. },
  104. _ => {}
  105. }
  106. }
  107. i = (i + 1) % 255;
  108. update_player(&mut player);
  109. render(&mut canvas, Color::RGB(i, 64, 255-i), &texture, &player)?;
  110. ::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 60));
  111. }
  112. Ok(())
  113. }