main/
main.rs

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", //window name
15        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    //checking resource loading/unloading
37    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        // load/unload resources
57        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}