extern crate sdl2;
use sdl2::event::Event;
use sdl2::keyboard::Keycode;
use sdl2::pixels::Color;
use sdl2::render::{Texture, TextureCreator};
use sdl2::rect::Rect;
use std::time::Duration;
fn main() {
// 初始化SDL2
let sdl_context = sdl2::init().expect("SDL initialization failed");
let video_subsystem = sdl_context.video().expect("Couldn't get SDL video subsystem");
// 创建窗口和画布
let window = video_subsystem
.window("Tetris", 800, 600)
.position_centered()
.build()
.expect("Failed to create window");
let mut canvas = window.into_canvas()
.target_texture()
.present_vsync()
.build()
.expect("Couldn't get window's canvas");
let texture_creator: TextureCreator<_> = canvas.texture_creator();
const TEXTURE_SIZE: u32 = 32;
// create a texture with a 32*32 size
let mut square_texture: Texture = texture_creator.create_texture_target(None, TEXTURE_SIZE, TEXTURE_SIZE)
.expect("Failed to create a texture");
// use the canvas to draw into our square texture.
canvas.with_texture_canvas(&mut square_texture, |texture| {
// set the draw color to green
texture.set_draw_color(Color::RGB(0, 255, 0));
texture.clear();
}).expect("Failed to clear a texture");
// 创建事件处理器
let mut event_pump = sdl_context.event_pump().expect("Failed to get SDL event pump");
// 主循环
'runningloop: loop {
for event in event_pump.poll_iter() {
match event {
Event::Quit { .. } | Event::KeyDown { keycode: Some(Keycode::Escape), .. } => {
break 'runningloop;
}
_ => {}
}
}
// We set fulfill our window with red
canvas.set_draw_color(Color::RGB(255, 0, 0));
// We draw it
canvas.clear();
// Copy our texture into the window
canvas.copy(&square_texture, None, Rect::new(0, 0, TEXTURE_SIZE, TEXTURE_SIZE))
.expect("Couldn't copy texture into window");
canvas.present();
// 添加延迟以控制帧率
std::thread::sleep(Duration::new(0, 1_000_000_000u32 / 60));
}
}