Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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 = 5;
  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. current_frame: i32,
  23. }
  24. fn direction_spritesheet_row(direction: Direction) -> i32 {
  25. use self::Direction::*;
  26. match direction {
  27. Up => 3,
  28. Down => 0,
  29. Left => 1,
  30. Right => 2,
  31. }
  32. }
  33. fn render(
  34. canvas: &mut WindowCanvas,
  35. color: Color,
  36. texture: &Texture,
  37. player: &Player
  38. ) -> Result<(), String> {
  39. canvas.set_draw_color(color);
  40. canvas.clear();
  41. let (width, height) = canvas.output_size()?;
  42. let (frame_width, frame_height) = player.sprite.size();
  43. let current_frame = Rect::new(
  44. player.sprite.x() + frame_width as i32 * player.current_frame,
  45. player.sprite.y() + frame_height as i32 * direction_spritesheet_row(player.direction),
  46. frame_width,
  47. frame_height,
  48. );
  49. let screen_position = player.position + Point::new(width as i32 / 2, height as i32 / 2);
  50. let screen_rect = Rect::from_center(screen_position, frame_width, frame_height);
  51. canvas.copy(texture, current_frame, screen_rect)?;
  52. canvas.present();
  53. Ok(())
  54. }
  55. fn update_player(player: &mut Player) {
  56. use self::Direction::*;
  57. match player.direction {
  58. Left => {
  59. player.position = player.position.offset(-player.speed, 0);
  60. },
  61. Right => {
  62. player.position = player.position.offset(player.speed, 0);
  63. },
  64. Up => {
  65. player.position = player.position.offset(0, -player.speed);
  66. },
  67. Down => {
  68. player.position = player.position.offset(0, player.speed);
  69. },
  70. }
  71. if player.speed != 0 {
  72. player.current_frame = (player.current_frame + 1) % 3;
  73. }
  74. }
  75. fn main() -> Result<(), String> {
  76. let sdl_context = sdl2::init()?;
  77. let video_subsystem = sdl_context.video()?;
  78. let _image_context = image::init(InitFlag::PNG | InitFlag::JPG)?;
  79. let window = video_subsystem.window("game tutorial", 800, 600)
  80. .position_centered()
  81. .build()
  82. .expect("could not initialize video subsystem");
  83. let mut canvas = window.into_canvas().build()
  84. .expect("could not make a canvas");
  85. let texture_creator = canvas.texture_creator();
  86. let texture = texture_creator.load_texture("assets/bardo.png")?;
  87. let mut player = Player {
  88. position: Point::new(0,0),
  89. sprite: Rect::new(0, 0, 26, 36),
  90. speed: 0,
  91. direction: Direction::Right,
  92. current_frame: 0,
  93. };
  94. let mut event_pump = sdl_context.event_pump()?;
  95. let mut i = 0;
  96. 'running: loop {
  97. for event in event_pump.poll_iter() {
  98. match event {
  99. Event::Quit {..} |
  100. Event::KeyDown { keycode: Some(Keycode::Escape), .. } => {
  101. break 'running;
  102. },
  103. Event::KeyDown { keycode: Some(Keycode::Left), .. } => {
  104. player.speed = PLAYER_MOVEMENT_SPEED;
  105. player.direction = Direction::Left;
  106. },
  107. Event::KeyDown { keycode: Some(Keycode::Right), .. } => {
  108. player.speed = PLAYER_MOVEMENT_SPEED;
  109. player.direction = Direction::Right;
  110. },
  111. Event::KeyDown { keycode: Some(Keycode::Up), .. } => {
  112. player.speed = PLAYER_MOVEMENT_SPEED;
  113. player.direction = Direction::Up;
  114. },
  115. Event::KeyDown { keycode: Some(Keycode::Down), .. } => {
  116. player.speed = PLAYER_MOVEMENT_SPEED;
  117. player.direction = Direction::Down;
  118. },
  119. Event::KeyUp { keycode: Some(Keycode::Left), repeat: false, .. } |
  120. Event::KeyUp { keycode: Some(Keycode::Right), repeat: false, .. } |
  121. Event::KeyUp { keycode: Some(Keycode::Up), repeat: false, .. } |
  122. Event::KeyUp { keycode: Some(Keycode::Down), repeat: false, .. } => {
  123. player.speed = 0;
  124. },
  125. _ => {}
  126. }
  127. }
  128. i = (i + 1) % 255;
  129. update_player(&mut player);
  130. render(&mut canvas, Color::RGB(i, 64, 255-i), &texture, &player)?;
  131. ::std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 60));
  132. }
  133. Ok(())
  134. }