1use nze_game_sdl::map::Map;
2use nze_game_sdl::{
3 Camera, Colour, Render,
4 audio::AudioManager,
5 DrawingArea, Error, GameObject};
6use nze_game_sdl::input::{keyboard::Key, controller, Controls};
7use nze_game_sdl::geometry::{Rect, Vec2};
8
9use std::path::Path;
10
11pub fn main() -> Result<(), Error> {
12
13 let (mut cam, drawing_area, context) = DrawingArea::new(
14 "Game Template", Rect::new(0.0, 0.0, 240.0, 160.0),
16 Vec2::new(240.0 * 4.0, 160.0 * 4.0)
17 )?;
18 let mut render = Render::new(drawing_area, &context)?;
19 let mut controls = Controls::new(&context)?;
20
21 let mono_font = render.font_manager.load_font(
22 Path::new("resources/textures/fonts/FiraCode-Light.ttf"))?;
23
24 let map = Map::new(
25 Path::new("resources/map/test.tmx"), &mut render.texture_manager,
26 Path::new("resources/textures/fonts"), &mut render.font_manager)?;
27
28 let mut audio = AudioManager::new()?;
29
30 let music = audio.music.load(Path::new("resources/audio/test.wav"))?;
31 audio.music.play(music, -1)?;
32
33 let sfx = audio.sfx.load(Path::new("resources/audio/test.mp3"))?;
34 audio.sfx.set_volume(sfx, 0.4)?;
35
36 let mut is_gaia = true;
38 let mut ephemeral_obj = GameObject::new_from_tex(
39 render.texture_manager.load(
40 Path::new("resources/textures/gaia.png"))?);
41
42 let mut text = render
43 .font_manager
44 .load_text_obj(
45 &mono_font,
46 "The Planet Earth",
47 Colour::new(100, 200, 70, 255),
48 Vec2::new(0.0, 0.0), 10.0,
49 Vec2::new(0.0, 0.0)
50 )?;
51
52 while !controls.should_close {
53 cam_controls(&mut render, &mut controls, &mut cam)?;
54 controls.update(&cam);
55
56 if controls.kb.press(Key::L) ||
58 controls.c.press(0, controller::Button::A)
59 {
60 render.texture_manager.unload_from_gameobject(ephemeral_obj);
61 render.font_manager.unload_text_obj(text);
62 if is_gaia {
63 ephemeral_obj = GameObject::new_from_tex(
64 render.texture_manager.load(
65 Path::new("resources/textures/error.png"))?);
66 text = render.font_manager.load_text_obj(
67 &mono_font,
68 "Error Text",
69 Colour::new(200, 100, 70, 255),
70 Vec2::new(100.0, 0.0),
71 10.0,
72 Vec2::new(0.0, 0.0))?;
73 text.parallax = Vec2::new(1.0, 1.0);
74 } else {
75 ephemeral_obj = GameObject::new_from_tex(
76 render.texture_manager.load(
77 Path::new("resources/textures/gaia.png"))?);
78 text = render.font_manager.load_text_obj(
79 &mono_font,
80 "The Planet Earth",
81 Colour::new(100, 200, 70, 255),
82 Vec2::new(0.0, 0.0),
83 10.0,
84 Vec2::new(0.0, 0.0))?;
85 }
86 is_gaia = !is_gaia;
87 }
88
89 ephemeral_obj.rotate += controls.frame_elapsed * 30.0;
90
91 if controls.kb.press(Key::F) {
92 ephemeral_obj.flip_horizontal = !ephemeral_obj.flip_horizontal;
93 }
94
95 if controls.kb.press(Key::P) {
96 audio.sfx.play(sfx)?;
97 }
98
99 if controls.c.press(0, controller::Button::DPadUp) {
100 controls.c.rumble(0, 10000, 20000, 1000);
101 }
102
103 render.start_draw();
104
105 map.draw(&mut cam);
106 cam.draw(&ephemeral_obj);
107 cam.draw_text(&text);
108 cam.draw_disposable_text(
109 &mono_font,
110 format!("Wheel: {}", controls.m.wheel()),
111 40,
112 controls.m.pos(),
113 Colour::white(),
114 Vec2::new(1.0, 1.0));
115 render.end_draw(&mut cam)?;
116 }
117
118 Ok(())
119}
120
121
122fn cam_controls(render: &mut Render, controls: &mut Controls, cam: &mut Camera) -> Result<(), Error> {
123 let prev_frame = controls.frame_elapsed;
124 let mut pos = cam.get_offset();
125 const SPEED : f64 = 500.0;
126 if controls.kb.down(Key::Left) {
127 pos.x -= SPEED * prev_frame;
128 }
129 if controls.kb.down(Key::Right) {
130 pos.x += SPEED * prev_frame;
131 }
132 if controls.kb.down(Key::Up) {
133 pos.y -= SPEED * prev_frame;
134 }
135 if controls.kb.down(Key::Down) {
136 pos.y += SPEED * prev_frame;
137 }
138
139 pos.x += SPEED * controls.m.wheel() as f64 * prev_frame;
140
141 let v = controls.c.joy(0, controller::Side::Left) * SPEED * prev_frame;
142 pos = pos + v;
143
144 cam.set_offset(pos);
145 let mut win_size_update = false;
146 let mut cs = cam.get_window_size();
147
148 if controls.kb.down(Key::Equals) {
149 if cs.x < cam.get_view_size().x {
150 cs.x *= 2.0;
151 cs.y *= 2.0;
152 } else {
153 cs.x += cam.get_view_size().x/2.0;
154 cs.y += cam.get_view_size().y/2.0;
155 }
156 win_size_update = true;
157 }
158 if controls.kb.down(Key::Minus) {
159 if cs.x <= cam.get_view_size().x {
160 cs.x /= 2.0;
161 cs.y /= 2.0;
162 } else {
163 cs.x -= cam.get_view_size().x/2.0;
164 cs.y -= cam.get_view_size().y/2.0;
165 }
166 win_size_update = true;
167 }
168
169 if controls.kb.down(Key::D) {
170 cs.x += SPEED * prev_frame;
171 win_size_update = true;
172 }
173 if controls.kb.down(Key::A) {
174
175 cs.x -= SPEED * prev_frame;
176 win_size_update = true;
177 }
178 if controls.kb.down(Key::W) {
179
180 cs.y += SPEED * prev_frame;
181 win_size_update = true;
182 }
183
184 if controls.kb.down(Key::S) {
185
186 cs.y -= SPEED * prev_frame;
187 win_size_update = true;
188 }
189
190 if controls.kb.press(Key::Num1) {
191 render.toggle_fullscreen(cam)?;
192 }
193
194 if win_size_update {
195 render.set_win_size(cam, cs)?;
196 }
197
198 if controls.kb.down(Key::Escape) {
199 controls.should_close = true;
200 }
201
202 Ok(())
203}