put control stuff in StyleModifiers
This commit is contained in:
parent
f72acaf2d4
commit
5914db3599
109
src/body.rs
109
src/body.rs
@ -220,43 +220,6 @@ impl Camera {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const CONTROL_MOVEFORWARD:u32 = 0b00000001;
|
|
||||||
const CONTROL_MOVEBACK:u32 = 0b00000010;
|
|
||||||
const CONTROL_MOVERIGHT:u32 = 0b00000100;
|
|
||||||
const CONTROL_MOVELEFT:u32 = 0b00001000;
|
|
||||||
const CONTROL_MOVEUP:u32 = 0b00010000;
|
|
||||||
const CONTROL_MOVEDOWN:u32 = 0b00100000;
|
|
||||||
const CONTROL_JUMP:u32 = 0b01000000;
|
|
||||||
const CONTROL_ZOOM:u32 = 0b10000000;
|
|
||||||
|
|
||||||
const FORWARD_DIR:glam::Vec3 = glam::Vec3::new(0.0,0.0,-1.0);
|
|
||||||
const RIGHT_DIR:glam::Vec3 = glam::Vec3::new(1.0,0.0,0.0);
|
|
||||||
const UP_DIR:glam::Vec3 = glam::Vec3::new(0.0,1.0,0.0);
|
|
||||||
|
|
||||||
fn get_control_dir(controls: u32) -> glam::Vec3{
|
|
||||||
//don't get fancy just do it
|
|
||||||
let mut control_dir:glam::Vec3 = glam::Vec3::new(0.0,0.0,0.0);
|
|
||||||
if controls & CONTROL_MOVEFORWARD == CONTROL_MOVEFORWARD {
|
|
||||||
control_dir+=FORWARD_DIR;
|
|
||||||
}
|
|
||||||
if controls & CONTROL_MOVEBACK == CONTROL_MOVEBACK {
|
|
||||||
control_dir+=-FORWARD_DIR;
|
|
||||||
}
|
|
||||||
if controls & CONTROL_MOVELEFT == CONTROL_MOVELEFT {
|
|
||||||
control_dir+=-RIGHT_DIR;
|
|
||||||
}
|
|
||||||
if controls & CONTROL_MOVERIGHT == CONTROL_MOVERIGHT {
|
|
||||||
control_dir+=RIGHT_DIR;
|
|
||||||
}
|
|
||||||
if controls & CONTROL_MOVEUP == CONTROL_MOVEUP {
|
|
||||||
control_dir+=UP_DIR;
|
|
||||||
}
|
|
||||||
if controls & CONTROL_MOVEDOWN == CONTROL_MOVEDOWN {
|
|
||||||
control_dir+=-UP_DIR;
|
|
||||||
}
|
|
||||||
return control_dir
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct GameMechanicsState{
|
pub struct GameMechanicsState{
|
||||||
pub spawn_id:u32,
|
pub spawn_id:u32,
|
||||||
//jump_counts:HashMap<u32,u32>,
|
//jump_counts:HashMap<u32,u32>,
|
||||||
@ -286,7 +249,7 @@ pub struct StyleModifiers{
|
|||||||
impl std::default::Default for StyleModifiers{
|
impl std::default::Default for StyleModifiers{
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self{
|
Self{
|
||||||
controls_mask: !0&!(CONTROL_MOVEUP|CONTROL_MOVEDOWN),
|
controls_mask: !0&!(Self::CONTROL_MOVEUP|Self::CONTROL_MOVEDOWN),
|
||||||
controls_held: 0,
|
controls_held: 0,
|
||||||
strafe_tick_num: 100,//100t
|
strafe_tick_num: 100,//100t
|
||||||
strafe_tick_den: 1_000_000_000,
|
strafe_tick_den: 1_000_000_000,
|
||||||
@ -299,6 +262,54 @@ impl std::default::Default for StyleModifiers{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
impl StyleModifiers{
|
||||||
|
const CONTROL_MOVEFORWARD:u32 = 0b00000001;
|
||||||
|
const CONTROL_MOVEBACK:u32 = 0b00000010;
|
||||||
|
const CONTROL_MOVERIGHT:u32 = 0b00000100;
|
||||||
|
const CONTROL_MOVELEFT:u32 = 0b00001000;
|
||||||
|
const CONTROL_MOVEUP:u32 = 0b00010000;
|
||||||
|
const CONTROL_MOVEDOWN:u32 = 0b00100000;
|
||||||
|
const CONTROL_JUMP:u32 = 0b01000000;
|
||||||
|
const CONTROL_ZOOM:u32 = 0b10000000;
|
||||||
|
|
||||||
|
const FORWARD_DIR:glam::Vec3 = glam::Vec3::NEG_Z;
|
||||||
|
const RIGHT_DIR:glam::Vec3 = glam::Vec3::X;
|
||||||
|
const UP_DIR:glam::Vec3 = glam::Vec3::Y;
|
||||||
|
|
||||||
|
fn get_control(&self,control:u32,controls:u32)->bool{
|
||||||
|
controls&self.controls_mask&control!=0
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_control_dir(&self,controls:u32)->glam::Vec3{
|
||||||
|
//don't get fancy just do it
|
||||||
|
let mut control_dir:glam::Vec3 = glam::Vec3::ZERO;
|
||||||
|
//Disallow strafing if held controls are not held
|
||||||
|
if controls&self.controls_held!=self.controls_held{
|
||||||
|
return control_dir;
|
||||||
|
}
|
||||||
|
//Apply mask after held check so you can require non-allowed keys to be held for some reason
|
||||||
|
let controls=controls&self.controls_mask;
|
||||||
|
if controls & Self::CONTROL_MOVEFORWARD == Self::CONTROL_MOVEFORWARD {
|
||||||
|
control_dir+=Self::FORWARD_DIR;
|
||||||
|
}
|
||||||
|
if controls & Self::CONTROL_MOVEBACK == Self::CONTROL_MOVEBACK {
|
||||||
|
control_dir+=-Self::FORWARD_DIR;
|
||||||
|
}
|
||||||
|
if controls & Self::CONTROL_MOVELEFT == Self::CONTROL_MOVELEFT {
|
||||||
|
control_dir+=-Self::RIGHT_DIR;
|
||||||
|
}
|
||||||
|
if controls & Self::CONTROL_MOVERIGHT == Self::CONTROL_MOVERIGHT {
|
||||||
|
control_dir+=Self::RIGHT_DIR;
|
||||||
|
}
|
||||||
|
if controls & Self::CONTROL_MOVEUP == Self::CONTROL_MOVEUP {
|
||||||
|
control_dir+=Self::UP_DIR;
|
||||||
|
}
|
||||||
|
if controls & Self::CONTROL_MOVEDOWN == Self::CONTROL_MOVEDOWN {
|
||||||
|
control_dir+=-Self::UP_DIR;
|
||||||
|
}
|
||||||
|
return control_dir
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub struct PhysicsState{
|
pub struct PhysicsState{
|
||||||
pub time:TIME,
|
pub time:TIME,
|
||||||
@ -1000,7 +1011,7 @@ impl crate::instruction::InstructionConsumer<PhysicsInstruction> for PhysicsStat
|
|||||||
let mut v=self.body.velocity;
|
let mut v=self.body.velocity;
|
||||||
self.contact_constrain_velocity(&mut v);
|
self.contact_constrain_velocity(&mut v);
|
||||||
self.body.velocity=v;
|
self.body.velocity=v;
|
||||||
if self.grounded&&self.controls&CONTROL_JUMP!=0{
|
if self.grounded&&self.style.get_control(StyleModifiers::CONTROL_JUMP,self.controls){
|
||||||
self.jump();
|
self.jump();
|
||||||
}
|
}
|
||||||
self.refresh_walk_target();
|
self.refresh_walk_target();
|
||||||
@ -1021,7 +1032,7 @@ impl crate::instruction::InstructionConsumer<PhysicsInstruction> for PhysicsStat
|
|||||||
},
|
},
|
||||||
PhysicsInstruction::StrafeTick => {
|
PhysicsInstruction::StrafeTick => {
|
||||||
let camera_mat=self.camera.simulate_move_rotation_y(self.mouse_interpolation.interpolated_position(self.time).x-self.mouse_interpolation.mouse0.x);
|
let camera_mat=self.camera.simulate_move_rotation_y(self.mouse_interpolation.interpolated_position(self.time).x-self.mouse_interpolation.mouse0.x);
|
||||||
let control_dir=camera_mat*get_control_dir(self.controls);
|
let control_dir=camera_mat*self.style.get_control_dir(self.controls);
|
||||||
let d=self.body.velocity.dot(control_dir);
|
let d=self.body.velocity.dot(control_dir);
|
||||||
if d<self.style.mv {
|
if d<self.style.mv {
|
||||||
let mut v=self.body.velocity+(self.style.mv-d)*control_dir;
|
let mut v=self.body.velocity+(self.style.mv-d)*control_dir;
|
||||||
@ -1047,21 +1058,21 @@ impl crate::instruction::InstructionConsumer<PhysicsInstruction> for PhysicsStat
|
|||||||
self.camera.angles=self.camera.simulate_move_angles(self.mouse_interpolation.mouse1-self.mouse_interpolation.mouse0);
|
self.camera.angles=self.camera.simulate_move_angles(self.mouse_interpolation.mouse1-self.mouse_interpolation.mouse0);
|
||||||
self.mouse_interpolation.move_mouse(self.time,m);
|
self.mouse_interpolation.move_mouse(self.time,m);
|
||||||
},
|
},
|
||||||
InputInstruction::MoveForward(s) => self.set_control(CONTROL_MOVEFORWARD,s),
|
InputInstruction::MoveForward(s) => self.set_control(StyleModifiers::CONTROL_MOVEFORWARD,s),
|
||||||
InputInstruction::MoveLeft(s) => self.set_control(CONTROL_MOVELEFT,s),
|
InputInstruction::MoveLeft(s) => self.set_control(StyleModifiers::CONTROL_MOVELEFT,s),
|
||||||
InputInstruction::MoveBack(s) => self.set_control(CONTROL_MOVEBACK,s),
|
InputInstruction::MoveBack(s) => self.set_control(StyleModifiers::CONTROL_MOVEBACK,s),
|
||||||
InputInstruction::MoveRight(s) => self.set_control(CONTROL_MOVERIGHT,s),
|
InputInstruction::MoveRight(s) => self.set_control(StyleModifiers::CONTROL_MOVERIGHT,s),
|
||||||
InputInstruction::MoveUp(s) => self.set_control(CONTROL_MOVEUP,s),
|
InputInstruction::MoveUp(s) => self.set_control(StyleModifiers::CONTROL_MOVEUP,s),
|
||||||
InputInstruction::MoveDown(s) => self.set_control(CONTROL_MOVEDOWN,s),
|
InputInstruction::MoveDown(s) => self.set_control(StyleModifiers::CONTROL_MOVEDOWN,s),
|
||||||
InputInstruction::Jump(s) => {
|
InputInstruction::Jump(s) => {
|
||||||
self.set_control(CONTROL_JUMP,s);
|
self.set_control(StyleModifiers::CONTROL_JUMP,s);
|
||||||
if self.grounded{
|
if self.grounded{
|
||||||
self.jump();
|
self.jump();
|
||||||
}
|
}
|
||||||
refresh_walk_target_velocity=false;
|
refresh_walk_target_velocity=false;
|
||||||
},
|
},
|
||||||
InputInstruction::Zoom(s) => {
|
InputInstruction::Zoom(s) => {
|
||||||
self.set_control(CONTROL_ZOOM,s);
|
self.set_control(StyleModifiers::CONTROL_ZOOM,s);
|
||||||
refresh_walk_target=false;
|
refresh_walk_target=false;
|
||||||
},
|
},
|
||||||
InputInstruction::Reset => {
|
InputInstruction::Reset => {
|
||||||
@ -1081,7 +1092,7 @@ impl crate::instruction::InstructionConsumer<PhysicsInstruction> for PhysicsStat
|
|||||||
//calculate walk target velocity
|
//calculate walk target velocity
|
||||||
if refresh_walk_target_velocity{
|
if refresh_walk_target_velocity{
|
||||||
let camera_mat=self.camera.simulate_move_rotation_y(self.mouse_interpolation.interpolated_position(self.time).x-self.mouse_interpolation.mouse0.x);
|
let camera_mat=self.camera.simulate_move_rotation_y(self.mouse_interpolation.interpolated_position(self.time).x-self.mouse_interpolation.mouse0.x);
|
||||||
let control_dir=camera_mat*get_control_dir(self.controls);
|
let control_dir=camera_mat*self.style.get_control_dir(self.controls);
|
||||||
self.walk.target_velocity=self.style.walkspeed*control_dir;
|
self.walk.target_velocity=self.style.walkspeed*control_dir;
|
||||||
}
|
}
|
||||||
self.refresh_walk_target();
|
self.refresh_walk_target();
|
||||||
|
Loading…
Reference in New Issue
Block a user