/// <summary> /// Performs some basic input handling. /// </summary> private static void HandlePressInput(object sender, InputPressArgs e) { if (!Rendering.MainViewport.HasFocus) { return; } // For now, gameplay and debug actions are bound to static keys. // N toggles noclip. if (e.PressType == InputPressArgs.KeyPressType.Up && e.Key == InputKey.N) { NoclipEnabled = !NoclipEnabled; if (!NoclipEnabled) // just switched to first-person mode again { if (player != null) { player.Character.Body.SetTransformation(mat4.Translate(camera.Position)); } } } // Cam Paths if (NoclipEnabled && e.PressType == InputPressArgs.KeyPressType.Down) { switch (e.Key) { case InputKey.F9: PathPositions.Add(camera.Position); PathDirections.Add(camera.ForwardDirection); PathTmps.Add(vec3.Zero); Console.WriteLine("Point recorded"); break; case InputKey.F12: PathPositions.Clear(); PathTmps.Clear(); PathDirections.Clear(); Console.WriteLine("Path deleted"); break; case InputKey.F10: PathPlaying = !PathPlaying; break; } } }
/// <summary> /// Called on keyboard input. Updates the walking directions of the character. /// </summary> protected void HandleInput(object sender, InputPressArgs e) { if (!Rendering.MainViewport.HasFocus) { return; } if (LocalScript.NoclipEnabled) { return; } if (e.Key == InputKey.F && e.PressType == InputPressArgs.KeyPressType.Down) { Body.SetVelocity(vec3.Zero); mat4 transformation = Body.GetTransformation(); vec3 pos = new vec3(transformation.col3); pos.y += 20f; Body.SetTransformation(mat4.Translate(pos)); } // Let the default WASD-keys control the walking directions. if (e.Key == InputKey.W) { if (e.PressType == InputPressArgs.KeyPressType.Down) { walkDirForward++; } else { walkDirForward--; } } else if (e.Key == InputKey.S) { if (e.PressType == InputPressArgs.KeyPressType.Down) { walkDirForward--; } else { walkDirForward++; } } else if (e.Key == InputKey.D) { if (e.PressType == InputPressArgs.KeyPressType.Down) { walkDirRight++; } else { walkDirRight--; } } else if (e.Key == InputKey.A) { if (e.PressType == InputPressArgs.KeyPressType.Down) { walkDirRight--; } else { walkDirRight++; } } else if (e.Key == InputKey.Space) //Space lets the player jump { if (TouchesGround && jumpCoolDown == 0f) { Body.ApplyImpulse(new vec3(0, 5f * CharacterMass, 0), vec3.Zero); jumpCoolDown = 1f; } } else if (e.Key == InputKey.Shift) // Shift controls running { if (e.PressType == InputPressArgs.KeyPressType.Down) { IsRunning = true; } else { IsRunning = false; } } else if (e.Key == InputKey.O) { Body.SetTransformation(mat4.Translate(new vec3(0, 50f, 0)) * Body.GetTransformation()); Body.SetVelocity(vec3.Zero); } // Clamp the walking directions to [-1, 1]. The values could get out of bound, for example, when we receive two down events without an up event in between. if (walkDirForward < -1) { walkDirForward = -1; } if (walkDirForward > 1) { walkDirForward = 1; } if (walkDirRight < -1) { walkDirRight = -1; } if (walkDirRight > 1) { walkDirRight = 1; } // This hack stops the player movement immediately when we stop walking //TODO: do some actual friction simulation instead if (walkDirRight == 0 && walkDirRight == 0 && TouchesGround && e.PressType == InputPressArgs.KeyPressType.Up) { Body.SetVelocity(vec3.Zero); } }
void HandlePressInput(object sender, InputPressArgs e) { if (!Rendering.MainViewport.HasFocus) { return; } // Scale the area using + and - keys. // Translate it using up down left right (x, z) // and PageUp PageDown (y). if (e.PressType == InputPressArgs.KeyPressType.Down) { switch (e.Key) { case InputKey.Shift: keyModifierShift = true; break; case InputKey.Control: keyModifierControl = true; break; case InputKey.Alt: keyModifierAlt = true; break; case InputKey.F8: Renderer.Opaque.Mesh.DebugWireframe = !Renderer.Opaque.Mesh.DebugWireframe; break; case InputKey.Q: if (Inventory.Selection != null) { DropItem(Inventory.Selection); } break; // F1 resets the player position case InputKey.F1: character.Body.SetTransformation(mat4.Translate(new vec3(0, 10f, 0))); break; // Tab and shift-Tab cycle between digging shapes case InputKey.Tab: if (!keyModifierControl) { int vals = Enum.GetValues(typeof(DiggingShape)).Length; int offset = keyModifierShift ? vals - 1 : 1; CurrentDiggingShape = (DiggingShape)(((uint)CurrentDiggingShape + offset) % vals); } else { int vals = Enum.GetValues(typeof(DiggingAlignment)).Length; int offset = keyModifierShift ? vals - 1 : 1; CurrentDiggingAlignment = (DiggingAlignment)(((uint)CurrentDiggingAlignment + offset) % vals); } // Reselect to refresh shape if (Inventory.Selection != null) { Inventory.Selection.OnDeselect(this); Inventory.Selection.OnSelect(this); } break; default: break; } // Quickaccess items. if (InputKey.Key1 <= e.Key && e.Key <= InputKey.Key9) { Inventory.Select((int)e.Key - (int)InputKey.Key1); } if (e.Key == InputKey.Key0) { Inventory.Select(9); // Special '0'. } } else if (e.PressType == InputPressArgs.KeyPressType.Up) { switch (e.Key) { case InputKey.Shift: keyModifierShift = false; break; case InputKey.Control: keyModifierControl = false; break; case InputKey.Alt: keyModifierAlt = false; break; } } // Following interactions are only possible if UI is not open. if (!Gui.IsInventoryOpen) { float minRayQueryRange; float maxRayQueryRange; if (!LocalScript.NoclipEnabled) { minRayQueryRange = minRayQueryDistancePlayer; maxRayQueryRange = maxRayQueryDistancePlayer; } else { minRayQueryRange = minRayQueryDistanceNoClip; maxRayQueryRange = maxRayQueryDistanceNoClip; } // If left mouse click is detected, we want to execute a rayquery and report a "OnUse" to the selected item. if (Inventory.Selection != null && e.Key == InputKey.MouseLeft && e.PressType == InputPressArgs.KeyPressType.Down) { // Send a ray query to find the position on the terrain we are looking at. ContainingWorld.Physics.RayQuery(camera.Position + camera.ForwardDirection * minRayQueryRange, camera.Position + camera.ForwardDirection * maxRayQueryRange, delegate(bool _hit, vec3 _position, vec3 _normal, RigidBody _body, bool _hasTerrainCollision) { // Receiving the async ray query result here if (_hit) { Entity _hitEntity = null; if (_body != null && _body.RefComponent != null) { _hitEntity = _body.RefComponent.Entity; } /// Subtract a few cm toward camera to increase stability near constraints. _position -= camera.ForwardDirection * .04f; // Use currently selected item. if (e.Key == InputKey.MouseLeft) { Item selection = Inventory.Selection; if (selection != null) { selection.OnUse(this, _position, _normal, _hitEntity); } } } }); } if (e.Key == InputKey.E && e.PressType == InputPressArgs.KeyPressType.Down) { ContainingWorld.Physics.RayQuery(camera.Position + camera.ForwardDirection * minRayQueryRange, camera.Position + camera.ForwardDirection * maxRayQueryRange, delegate(bool _hit, vec3 _position, vec3 _normal, RigidBody _body, bool _hasTerrainCollision) { // Receiving the async ray query result here if (_body != null && _body.RefComponent != null) { Entity entity = _body.RefComponent.Entity; if (entity != null) { TriggerId trigger = TriggerId.getIdByName("Interaction"); entity[trigger] |= new InteractionMessage(thisEntity); } } }); } } }