Initial implementation of camera controls
This commit is contained in:
parent
217ec33413
commit
7364dc41c3
37
src/main.rs
37
src/main.rs
|
@ -75,6 +75,7 @@ pub struct Game {
|
||||||
mouse_pos: (i32, i32),
|
mouse_pos: (i32, i32),
|
||||||
|
|
||||||
server: server::Server,
|
server: server::Server,
|
||||||
|
focused: bool,
|
||||||
chunk_builder: chunk_builder::ChunkBuilder,
|
chunk_builder: chunk_builder::ChunkBuilder,
|
||||||
|
|
||||||
connect_reply: Option<mpsc::Receiver<Result<server::Server, protocol::Error>>>,
|
connect_reply: Option<mpsc::Receiver<Result<server::Server, protocol::Error>>>,
|
||||||
|
@ -94,9 +95,9 @@ impl Game {
|
||||||
|
|
||||||
pub fn tick(&mut self, delta: f64) {
|
pub fn tick(&mut self, delta: f64) {
|
||||||
if !self.server.is_connected() {
|
if !self.server.is_connected() {
|
||||||
self.renderer.camera.yaw += 0.005 * delta;
|
self.server.yaw += 0.005 * delta;
|
||||||
if self.renderer.camera.yaw > ::std::f64::consts::PI * 2.0 {
|
if self.server.yaw > ::std::f64::consts::PI * 2.0 {
|
||||||
self.renderer.camera.yaw = 0.0;
|
self.server.yaw = 0.0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let mut clear_reply = false;
|
let mut clear_reply = false;
|
||||||
|
@ -108,6 +109,7 @@ impl Game {
|
||||||
self.screen_sys.pop_screen();
|
self.screen_sys.pop_screen();
|
||||||
self.renderer.clear_chunks();
|
self.renderer.clear_chunks();
|
||||||
self.chunk_builder.wait_for_builders();
|
self.chunk_builder.wait_for_builders();
|
||||||
|
self.focused = true;
|
||||||
self.server = val;
|
self.server = val;
|
||||||
},
|
},
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
|
@ -186,6 +188,7 @@ fn main() {
|
||||||
let textures = renderer.get_textures();
|
let textures = renderer.get_textures();
|
||||||
let mut game = Game {
|
let mut game = Game {
|
||||||
server: server::Server::dummy_server(resource_manager.clone(), con.clone()),
|
server: server::Server::dummy_server(resource_manager.clone(), con.clone()),
|
||||||
|
focused: false,
|
||||||
renderer: renderer,
|
renderer: renderer,
|
||||||
screen_sys: screen_sys,
|
screen_sys: screen_sys,
|
||||||
resource_manager: resource_manager,
|
resource_manager: resource_manager,
|
||||||
|
@ -233,21 +236,42 @@ fn handle_window_event(window: &glutin::Window,
|
||||||
ui_container: &mut ui::Container,
|
ui_container: &mut ui::Container,
|
||||||
event: glutin::Event) {
|
event: glutin::Event) {
|
||||||
use glutin::{Event, VirtualKeyCode};
|
use glutin::{Event, VirtualKeyCode};
|
||||||
|
use std::f64::consts::PI;
|
||||||
match event {
|
match event {
|
||||||
Event::Closed => game.should_close = true,
|
Event::Closed => game.should_close = true,
|
||||||
|
|
||||||
Event::MouseMoved((x, y)) => {
|
Event::MouseMoved((x, y)) => {
|
||||||
game.mouse_pos = (x, y);
|
game.mouse_pos = (x, y);
|
||||||
let (width, height) = window.get_inner_size_pixels().unwrap();
|
let (width, height) = window.get_inner_size_pixels().unwrap();
|
||||||
|
if game.focused {
|
||||||
|
window.set_cursor_position((width/2) as i32, (height/2) as i32).unwrap();
|
||||||
|
let s = 2000.0 + 0.01;
|
||||||
|
let (rx, ry) = ((x-(width/2) as i32) as f64 / s, (y-(height/2) as i32) as f64 / s);
|
||||||
|
game.server.yaw -= rx;
|
||||||
|
game.server.pitch -= ry;
|
||||||
|
if game.server.pitch < (PI/2.0) + 0.01 {
|
||||||
|
game.server.pitch = (PI/2.0) + 0.01;
|
||||||
|
}
|
||||||
|
if game.server.pitch > (PI/2.0)*3.0 - 0.01 {
|
||||||
|
game.server.pitch = (PI/2.0)*3.0 - 0.01;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
ui_container.hover_at(game, x as f64, y as f64, width as f64, height as f64);
|
ui_container.hover_at(game, x as f64, y as f64, width as f64, height as f64);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
Event::MouseInput(glutin::ElementState::Released, glutin::MouseButton::Left) => {
|
Event::MouseInput(glutin::ElementState::Released, glutin::MouseButton::Left) => {
|
||||||
let (x, y) = game.mouse_pos;
|
let (x, y) = game.mouse_pos;
|
||||||
let (width, height) = window.get_inner_size_pixels().unwrap();
|
let (width, height) = window.get_inner_size_pixels().unwrap();
|
||||||
|
|
||||||
|
if game.server.is_connected() && !game.focused {
|
||||||
|
game.focused = true;
|
||||||
|
window.set_cursor_position((width/2) as i32, (height/2) as i32).unwrap();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if !game.focused {
|
||||||
ui_container.click_at(game, x as f64, y as f64, width as f64, height as f64);
|
ui_container.click_at(game, x as f64, y as f64, width as f64, height as f64);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
Event::MouseWheel(delta) => {
|
Event::MouseWheel(delta) => {
|
||||||
let (x, y) = match delta {
|
let (x, y) = match delta {
|
||||||
glutin::MouseScrollDelta::LineDelta(x, y) => (x, y),
|
glutin::MouseScrollDelta::LineDelta(x, y) => (x, y),
|
||||||
|
@ -256,6 +280,11 @@ fn handle_window_event(window: &glutin::Window,
|
||||||
|
|
||||||
game.screen_sys.on_scroll(x as f64, y as f64);
|
game.screen_sys.on_scroll(x as f64, y as f64);
|
||||||
}
|
}
|
||||||
|
Event::KeyboardInput(glutin::ElementState::Released, _, Some(VirtualKeyCode::Escape)) => {
|
||||||
|
if game.focused {
|
||||||
|
game.focused = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
Event::KeyboardInput(glutin::ElementState::Pressed, _, Some(VirtualKeyCode::Grave)) => {
|
Event::KeyboardInput(glutin::ElementState::Pressed, _, Some(VirtualKeyCode::Grave)) => {
|
||||||
game.console.lock().unwrap().toggle();
|
game.console.lock().unwrap().toggle();
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,11 @@ pub struct Server {
|
||||||
console: Arc<Mutex<console::Console>>,
|
console: Arc<Mutex<console::Console>>,
|
||||||
version: usize,
|
version: usize,
|
||||||
|
|
||||||
position: cgmath::Vector3<f64>,
|
pub position: cgmath::Vector3<f64>,
|
||||||
|
pub yaw: f64,
|
||||||
|
pub pitch: f64,
|
||||||
|
|
||||||
|
tick_timer: f64,
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! handle_packet {
|
macro_rules! handle_packet {
|
||||||
|
@ -141,7 +145,12 @@ impl Server {
|
||||||
resources: resources,
|
resources: resources,
|
||||||
console: console,
|
console: console,
|
||||||
version: version,
|
version: version,
|
||||||
|
|
||||||
position: cgmath::Vector3::zero(),
|
position: cgmath::Vector3::zero(),
|
||||||
|
yaw: 0.0,
|
||||||
|
pitch: 0.0,
|
||||||
|
|
||||||
|
tick_timer: 0.0,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,7 +174,12 @@ impl Server {
|
||||||
version: version,
|
version: version,
|
||||||
resources: resources,
|
resources: resources,
|
||||||
console: console,
|
console: console,
|
||||||
|
|
||||||
position: cgmath::Vector3::new(0.5, 13.2, 0.5),
|
position: cgmath::Vector3::new(0.5, 13.2, 0.5),
|
||||||
|
yaw: 0.0,
|
||||||
|
pitch: 0.0,
|
||||||
|
|
||||||
|
tick_timer: 0.0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -173,7 +187,7 @@ impl Server {
|
||||||
self.conn.is_some()
|
self.conn.is_some()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn tick(&mut self, renderer: &mut render::Renderer, _delta: f64) {
|
pub fn tick(&mut self, renderer: &mut render::Renderer, delta: f64) {
|
||||||
let version = self.resources.read().unwrap().version();
|
let version = self.resources.read().unwrap().version();
|
||||||
if version != self.version {
|
if version != self.version {
|
||||||
self.version = version;
|
self.version = version;
|
||||||
|
@ -196,8 +210,30 @@ impl Server {
|
||||||
self.read_queue = Some(rx);
|
self.read_queue = Some(rx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
self.tick_timer += delta;
|
||||||
|
while self.tick_timer >= 3.0 && self.is_connected() {
|
||||||
|
self.minecraft_tick();
|
||||||
|
self.tick_timer -= 3.0;
|
||||||
|
}
|
||||||
|
|
||||||
// Copy to camera
|
// Copy to camera
|
||||||
renderer.camera.pos = cgmath::Point::from_vec(self.position + cgmath::Vector3::new(0.0, 1.8, 0.0));
|
renderer.camera.pos = cgmath::Point::from_vec(self.position + cgmath::Vector3::new(0.0, 1.8, 0.0));
|
||||||
|
renderer.camera.yaw = self.yaw;
|
||||||
|
renderer.camera.pitch = self.pitch;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn minecraft_tick(&mut self) {
|
||||||
|
|
||||||
|
// Sync our position to the server
|
||||||
|
let packet = packet::play::serverbound::PlayerPositionLook {
|
||||||
|
x: self.position.x,
|
||||||
|
y: self.position.y,
|
||||||
|
z: self.position.z,
|
||||||
|
yaw: self.yaw as f32,
|
||||||
|
pitch: self.pitch as f32,
|
||||||
|
on_ground: false,
|
||||||
|
};
|
||||||
|
self.write_packet(packet);
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn write_packet<T: protocol::PacketType>(&mut self, p: T) {
|
pub fn write_packet<T: protocol::PacketType>(&mut self, p: T) {
|
||||||
|
@ -215,6 +251,8 @@ impl Server {
|
||||||
self.position.x = teleport.x;
|
self.position.x = teleport.x;
|
||||||
self.position.y = teleport.y;
|
self.position.y = teleport.y;
|
||||||
self.position.z = teleport.z;
|
self.position.z = teleport.z;
|
||||||
|
self.yaw = teleport.yaw as f64;
|
||||||
|
self.pitch = teleport.pitch as f64;
|
||||||
|
|
||||||
self.write_packet(packet::play::serverbound::PlayerPositionLook {
|
self.write_packet(packet::play::serverbound::PlayerPositionLook {
|
||||||
x: teleport.x,
|
x: teleport.x,
|
||||||
|
|
Loading…
Reference in New Issue