Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
use boytacean::{gb::GameBoy, ppu::{DISPLAY_WIDTH, DISPLAY_HEIGHT}};
use sdl2::{video::Window, pixels::PixelFormatEnum, VideoSubsystem, TimerSubsystem, EventPump};
/// The base title to be used in the window.
static TITLE: &'static str = "Boytacean";
pub struct Graphics {
window: Window,
video_subsystem: VideoSubsystem,
timer_subsystem: TimerSubsystem,
event_pump: EventPump,
}
fn start_sdl() -> Graphics {
// initializes the SDL sub-system, making it ready to be
// used for display of graphics and audio
let sdl = sdl2::init().unwrap();
let video_subsystem = sdl.video().unwrap();
let timer_subsystem = sdl.timer().unwrap();
let audio_subsystem = sdl.audio().unwrap();
let event_pump = sdl.event_pump().unwrap();
// initialized the fonts context to be used
// in the loading of fonts
let ttf_context = sdl2::ttf::init().unwrap();
// creates the system window that is going to be used to
// show the emulator and sets it to the central are o screen
let mut window = video_subsystem
.window(
TITLE,
2 as u32 * DISPLAY_WIDTH as u32, //@todo check screen scale
2 as u32 * DISPLAY_HEIGHT as u32, //@todo check screen scale
)
.resizable()
.position_centered()
.opengl()
.build()
.unwrap();
Graphics {
window: window,
video_subsystem: video_subsystem,
timer_subsystem: timer_subsystem,
event_pump: event_pump
}
}
let mut graphics = start_sdl();
let mut canvas = graphics.window.into_canvas().accelerated().build().unwrap();
canvas.clear();
canvas.present();
let texture_creator = canvas.texture_creator();
// creates the texture streaming that is going to be used
// as the target for the pixel buffer
let mut texture = texture_creator
.create_texture_streaming(
PixelFormatEnum::RGB24,
DISPLAY_WIDTH as u32,
DISPLAY_HEIGHT as u32,
)
.unwrap();
let mut game_boy = GameBoy::new();
'main: loop {
if counter >= 7000000 {
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
while let Some(event) = graphics.event_pump.poll_event() {
}
let mut counter_ticks = 0u32;
loop {
// limits the number of ticks to the typical number
// of ticks required to do a complete PPU draw
if counter_ticks >= 70224 {
break;
}
// runs the Game Boy clock, this operations should
// include the advance of both the CPU and the PPU
counter_ticks += game_boy.clock() as u32;
}
counter += counter_ticks;
let frame_buffer = game_boy.frame_buffer().as_ref();
texture
.update(None, frame_buffer, DISPLAY_WIDTH as usize * 3)
.unwrap();
canvas.copy(&texture, None, None).unwrap();
// presents the canvas effectively updating the screen
// information presented to the user
canvas.present();
graphics.timer_subsystem.delay(17);
//println!("{:?}", game_boy.frame_buffer().as_ref());