From 897c2b826755a1412b88e900f379b0b66759db3d Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Mon, 3 Mar 2014 22:14:59 -0800 Subject: [PATCH] Add sounds for gun, reticle, mouse look firing --- examples/gun.js | 149 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 117 insertions(+), 32 deletions(-) diff --git a/examples/gun.js b/examples/gun.js index e7cd2973e2..17587e3810 100644 --- a/examples/gun.js +++ b/examples/gun.js @@ -3,16 +3,30 @@ // hifi // // Created by Brad Hefta-Gaub on 12/31/13. +// Modified by Philip on 3/3/14 // Copyright (c) 2013 HighFidelity, Inc. All rights reserved. // -// This is an example script that turns the hydra controllers into a particle gun. +// This is an example script that turns the hydra controllers and mouse into a particle gun. // It reads the controller, watches for trigger pulls, and launches particles. -// The particles it creates have a script that when they collide with Voxels, the -// particle will change it's color to match the voxel it hits, and then delete the -// voxel. +// When particles collide with voxels they blow little holes out of the voxels. // // +var lastX = 0; +var lastY = 0; +var yawFromMouse = 0; +var pitchFromMouse = 0; +var isMouseDown = false; + +var BULLET_VELOCITY = 5.0; + +// Load some sound to use for loading and firing +var fireSound = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/Guns/GUN-SHOT2.raw"); +var loadSound = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/Guns/Gun_Reload_Weapon22.raw"); +var impactSound = new Sound("https://s3-us-west-1.amazonaws.com/highfidelity-public/sounds/Guns/BulletImpact2.raw"); +var audioOptions = new AudioInjectionOptions(); +audioOptions.volume = 0.9; + // initialize our triggers var triggerPulled = new Array(); var numberOfTriggers = Controller.getNumberOfTriggers(); @@ -20,7 +34,60 @@ for (t = 0; t < numberOfTriggers; t++) { triggerPulled[t] = false; } -function checkController() { +// Create a reticle image in center of screen +var screenSize = Controller.getViewportDimensions(); +var reticle = Overlays.addOverlay("image", { + x: screenSize.x / 2 - 16, + y: screenSize.y / 2 - 16, + width: 32, + height: 32, + imageURL: "https://s3-us-west-1.amazonaws.com/highfidelity-public/images/reticle.png", + color: { red: 255, green: 255, blue: 255}, + alpha: 1 + }); + +function shootBullet(position, velocity) { + var BULLET_SIZE = 0.02; + Particles.addParticle( + { position: position, + radius: BULLET_SIZE, + color: { red: 200, green: 0, blue: 0 }, + velocity: velocity, + gravity: { x: 0, y: -0.1, z: 0 }, + damping: 0 }); + + // Play firing sounds + audioOptions.position = position; + Audio.playSound(fireSound, audioOptions); +} + +function particleCollisionWithVoxel(particle, voxel) { + var HOLE_SIZE = 0.25; + var particleProperties = Particles.getParticleProperties(particle); + var position = particleProperties.position; + Particles.deleteParticle(particle); + // Make a hole in this voxel + Voxels.eraseVoxel(position.x, position.y, position.z, HOLE_SIZE); + //audioOptions.position = position; + audioOptions.position = Vec3.sum(Camera.getPosition(), Quat.getFront(Camera.getOrientation())); + Audio.playSound(impactSound, audioOptions); +} + +function update() { + + // Check for mouseLook movement, update rotation + // rotate body yaw for yaw received from mouse + var newOrientation = Quat.multiply(MyAvatar.orientation, Quat.fromVec3( { x: 0, y: yawFromMouse, z: 0 } )); + MyAvatar.orientation = newOrientation; + yawFromMouse = 0; + + // apply pitch from mouse + var newPitch = MyAvatar.headPitch + pitchFromMouse; + MyAvatar.headPitch = newPitch; + pitchFromMouse = 0; + + // Check hydra controller for trigger press + var numberOfTriggers = Controller.getNumberOfTriggers(); var numberOfSpatialControls = Controller.getNumberOfSpatialControls(); var controllersPerTrigger = numberOfSpatialControls / numberOfTriggers; @@ -45,6 +112,7 @@ function checkController() { } if (shootABullet) { + var palmController = t * controllersPerTrigger; var palmPosition = Controller.getSpatialControlPosition(palmController); @@ -67,36 +135,53 @@ function checkController() { y: palmToFingerTipVector.y * linearVelocity, z: palmToFingerTipVector.z * linearVelocity }; - // This is the script for the particles that this gun shoots. - var script = - " function collisionWithVoxel(voxel) { " + - " print('collisionWithVoxel(voxel)... '); " + - " print('myID=' + Particle.getID() + '\\n'); " + - " var voxelColor = { red: voxel.red, green: voxel.green, blue: voxel.blue };" + - " var voxelAt = { x: voxel.x, y: voxel.y, z: voxel.z };" + - " var voxelScale = voxel.s;" + - " print('voxelColor=' + voxel.red + ', ' + voxel.green + ', ' + voxel.blue + '\\n'); " + - " var myColor = Particle.getColor();" + - " print('myColor=' + myColor.red + ', ' + myColor.green + ', ' + myColor.blue + '\\n'); " + - " Particle.setColor(voxelColor); " + - " Voxels.eraseVoxel(voxelAt.x, voxelAt.y, voxelAt.z, voxelScale); " + - " print('Voxels.eraseVoxel(' + voxelAt.x + ', ' + voxelAt.y + ', ' + voxelAt.z + ', ' + voxelScale + ')... \\n'); " + - " } " + - " Particle.collisionWithVoxel.connect(collisionWithVoxel); "; - - Particles.addParticle( - { position: position, - radius: 0.05, - color: { red: 128, green: 128, blue: 128 }, - velocity: velocity, - gravity: { x: 0, y: -0.1, z: 0 }, - damping: 0, - script: script }); + shootBullet(position, velocity); } } } } +function mousePressEvent(event) { + isMouseDown = true; + lastX = event.x; + lastY = event.y; + audioOptions.position = Vec3.sum(Camera.getPosition(), Quat.getFront(Camera.getOrientation())); + Audio.playSound(loadSound, audioOptions); +} + +function mouseReleaseEvent(event) { + // position + var DISTANCE_FROM_CAMERA = 2.0; + var camera = Camera.getPosition(); + var forwardVector = Quat.getFront(Camera.getOrientation()); + var newPosition = Vec3.sum(camera, Vec3.multiply(forwardVector, DISTANCE_FROM_CAMERA)); + var velocity = Vec3.multiply(forwardVector, BULLET_VELOCITY); + shootBullet(newPosition, velocity); + isMouseDown = false; +} + +function mouseMoveEvent(event) { + if (isMouseDown) { + var MOUSE_YAW_SCALE = -0.25; + var MOUSE_PITCH_SCALE = -12.5; + var FIXED_MOUSE_TIMESTEP = 0.016; + yawFromMouse += ((event.x - lastX) * MOUSE_YAW_SCALE * FIXED_MOUSE_TIMESTEP); + pitchFromMouse += ((event.y - lastY) * MOUSE_PITCH_SCALE * FIXED_MOUSE_TIMESTEP); + lastX = event.x; + lastY = event.y; + } +} + +function scriptEnding() { + Overlays.deleteOverlay(reticle); +} + +Particles.particleCollisionWithVoxel.connect(particleCollisionWithVoxel); +Script.scriptEnding.connect(scriptEnding); +Script.willSendVisualDataCallback.connect(update); +Controller.mousePressEvent.connect(mousePressEvent); +Controller.mouseReleaseEvent.connect(mouseReleaseEvent); +Controller.mouseMoveEvent.connect(mouseMoveEvent); + + -// register the call back so it fires before each data send -Script.willSendVisualDataCallback.connect(checkController);