From adbd995695ee199f371f834a5b1632d8202c5a25 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Thu, 16 Jul 2015 11:18:37 -0700 Subject: [PATCH 1/4] updated sword script so users can grab sword with hydra to adjust relative rotation of sword --- examples/example/games/sword.js | 449 ++++++++++++++++++++------------ 1 file changed, 284 insertions(+), 165 deletions(-) diff --git a/examples/example/games/sword.js b/examples/example/games/sword.js index 178a48f35a..6504bd0494 100644 --- a/examples/example/games/sword.js +++ b/examples/example/games/sword.js @@ -14,16 +14,46 @@ var Script, Entities, MyAvatar, Window, Overlays, Controller, Vec3, Quat, print, ToolBar, Settings; // Referenced globals provided by High Fidelity. Script.include("http://s3.amazonaws.com/hifi-public/scripts/libraries/toolBars.js"); -var hand = Settings.getValue("highfidelity.sword.hand", "right"); +var zombieFight; + +var hand = "right"; + var nullActionID = "00000000-0000-0000-0000-000000000000"; var controllerID; var controllerActive; var stickID = null; var actionID = nullActionID; -var targetIDs = []; -var dimensions = { x: 0.3, y: 0.15, z: 2.0 }; +var dimensions = { + x: 0.3, + y: 0.15, + z: 2.0 +}; var BUTTON_SIZE = 32; +var Y_AXIS = { + x: 0, + y: 1, + z: 0 +}; +var X_AXIS = { + x: 1, + y: 0, + z: 0 +}; + +var theta = 0.0; + +var RAD_TO_DEG = 180.0 / Math.PI; + +function orientationOf(vector) { + var direction, yaw, pitch; + direction = Vec3.normalize(vector); + yaw = Quat.angleAxis(Math.atan2(direction.x, direction.z) * RAD_TO_DEG, Y_AXIS); + pitch = Quat.angleAxis(Math.asin(-direction.y) * RAD_TO_DEG, X_AXIS); + return Quat.multiply(yaw, pitch); +} + + var stickModel = "https://hifi-public.s3.amazonaws.com/eric/models/stick.fbx"; var swordModel = "https://hifi-public.s3.amazonaws.com/ozan/props/sword/sword.fbx"; var swordCollisionShape = "https://hifi-public.s3.amazonaws.com/ozan/props/sword/sword.obj"; @@ -32,14 +62,16 @@ var avatarCollisionSoundURL = "https://s3.amazonaws.com/hifi-public/sounds/Colli var whichModel = "sword"; var originalAvatarCollisionSound; -var toolBar = new ToolBar(0, 0, ToolBar.vertical, "highfidelity.sword.toolbar", function () { - return {x: 100, y: 380}; +var toolBar = new ToolBar(0, 0, ToolBar.vertical, "highfidelity.sword.toolbar", function() { + return { + x: 100, + y: 380 + }; }); -var SWORD_IMAGE = "http://s3.amazonaws.com/hifi-public/images/billiardsReticle.png"; // Toggle between brandishing/sheathing sword (creating if necessary) -var TARGET_IMAGE = "http://s3.amazonaws.com/hifi-public/images/puck.png"; // Create a target dummy +var SWORD_IMAGE = "https://hifi-public.s3.amazonaws.com/images/sword/sword.svg"; // Toggle between brandishing/sheathing sword (creating if necessary) +var TARGET_IMAGE = "https://hifi-public.s3.amazonaws.com/images/sword/dummy2.svg"; // Create a target dummy var CLEANUP_IMAGE = "http://s3.amazonaws.com/hifi-public/images/delete.png"; // Remove sword and all target dummies.f -var SWITCH_HANDS_IMAGE = "http://s3.amazonaws.com/hifi-public/images/up-arrow.svg"; // Toggle left vs right hand. Persists in settings. var swordButton = toolBar.addOverlay("image", { width: BUTTON_SIZE, height: BUTTON_SIZE, @@ -52,12 +84,7 @@ var targetButton = toolBar.addOverlay("image", { imageURL: TARGET_IMAGE, alpha: 1 }); -var switchHandsButton = toolBar.addOverlay("image", { - width: BUTTON_SIZE, - height: BUTTON_SIZE, - imageURL: SWITCH_HANDS_IMAGE, - alpha: 1 -}); + var cleanupButton = toolBar.addOverlay("image", { width: BUTTON_SIZE, height: BUTTON_SIZE, @@ -66,6 +93,24 @@ var cleanupButton = toolBar.addOverlay("image", { }); var flasher; + +var leftTriggerButton = 0; +var leftTriggerValue = 0; +var prevLeftTriggerValue = 0; + + +var LEFT = 0; +var RIGHT = 1; + +var leftPalm = 2 * LEFT; +var rightPalm = 2 * RIGHT; +var rightTriggerButton = 1; +var prevRightTriggerValue = 0; +var rightTriggerValue = 0; +var TRIGGER_THRESHOLD = 0.2; + +var swordHeld = false; + function clearFlash() { if (!flasher) { return; @@ -74,6 +119,7 @@ function clearFlash() { Overlays.deleteOverlay(flasher.overlay); flasher = null; } + function flash(color) { clearFlash(); flasher = {}; @@ -88,40 +134,73 @@ function flash(color) { var health = 100; var display2d, display3d; + function trackAvatarWithText() { Entities.editEntity(display3d, { - position: Vec3.sum(MyAvatar.position, {x: 0, y: 1.5, z: 0}), + position: Vec3.sum(MyAvatar.position, { + x: 0, + y: 1.5, + z: 0 + }), rotation: Quat.multiply(MyAvatar.orientation, Quat.fromPitchYawRollDegrees(0, 180, 0)) }); } + function updateDisplay() { var text = health.toString(); if (!display2d) { health = 100; display2d = Overlays.addOverlay("text", { text: text, - font: { size: 20 }, - color: {red: 0, green: 255, blue: 0}, - backgroundColor: {red: 100, green: 100, blue: 100}, // Why doesn't this and the next work? + font: { + size: 20 + }, + color: { + red: 0, + green: 255, + blue: 0 + }, + backgroundColor: { + red: 100, + green: 100, + blue: 100 + }, // Why doesn't this and the next work? backgroundAlpha: 0.9, x: toolBar.x - 5, // I'd like to add the score to the toolBar and have it drag with it, but toolBar doesn't support text (just buttons). y: toolBar.y - 30 // So next best thing is to position it each time as if it were on top. }); display3d = Entities.addEntity({ name: MyAvatar.displayName + " score", - textColor: {red: 255, green: 255, blue: 255}, + textColor: { + red: 255, + green: 255, + blue: 255 + }, type: "Text", text: text, lineHeight: 0.14, - backgroundColor: {red: 64, green: 64, blue: 64}, - dimensions: {x: 0.3, y: 0.2, z: 0.01}, + backgroundColor: { + red: 64, + green: 64, + blue: 64 + }, + dimensions: { + x: 0.3, + y: 0.2, + z: 0.01 + }, }); Script.update.connect(trackAvatarWithText); } else { - Overlays.editOverlay(display2d, {text: text}); - Entities.editEntity(display3d, {text: text}); + Overlays.editOverlay(display2d, { + text: text + }); + Entities.editEntity(display3d, { + text: text + }); } } + function removeDisplay() { if (display2d) { Overlays.deleteOverlay(display2d); @@ -131,42 +210,176 @@ function removeDisplay() { display3d = null; } } -function computeEnergy(collision, entityID) { - var id = entityID || collision.idA || collision.idB; - var entity = id && Entities.getEntityProperties(id); - var mass = entity ? (entity.density * entity.dimensions.x * entity.dimensions.y * entity.dimensions.z) : 1; - var linearVelocityChange = Vec3.length(collision.velocityChange); - var energy = 0.5 * mass * linearVelocityChange * linearVelocityChange; - return Math.min(Math.max(1.0, Math.round(energy)), 20); -} + + function gotHit(collision) { - var energy = computeEnergy(collision); - print("Got hit - " + energy + " from " + collision.idA + " " + collision.idB); - health -= energy; - flash({red: 255, green: 0, blue: 0}); - updateDisplay(); -} -function scoreHit(idA, idB, collision) { - var energy = computeEnergy(collision, idA); - print("Score + " + energy + " from " + JSON.stringify(idA) + " " + JSON.stringify(idB)); - health += energy; - flash({red: 0, green: 255, blue: 0}); + health -= 1; + flash({ + red: 255, + green: 0, + blue: 0 + }); updateDisplay(); } + function isFighting() { return stickID && (actionID !== nullActionID); } -function initControls() { - print("Sword hand is " + hand); + +var inHand = false; + + +function isControllerActive() { + // I don't think the hydra API provides any reliable way to know whether a particular controller is active. Ask for both. + controllerActive = (Vec3.length(Controller.getSpatialControlPosition(3)) > 0) || Vec3.length(Controller.getSpatialControlPosition(4)) > 0; + return controllerActive; +} + + +function removeSword() { + if (stickID) { + print('deleting action ' + actionID + ' and entity ' + stickID); + Entities.deleteAction(stickID, actionID); + Entities.deleteEntity(stickID); + stickID = null; + actionID = nullActionID; + Controller.mouseMoveEvent.disconnect(mouseMoveEvent); + MyAvatar.collisionWithEntity.disconnect(gotHit); + // removeEventhHandler happens automatically when the entity is deleted. + } + inHand = false; + if (originalAvatarCollisionSound !== undefined) { + MyAvatar.collisionSoundURL = originalAvatarCollisionSound; + } + removeDisplay(); + swordHeld = false; +} + +function cleanUp(leaveButtons) { + if (!leaveButtons) { + toolBar.cleanup(); + } + removeSword(); + zombieFight.cleanup(); +} + +function makeSword() { + var swordPosition = Vec3.sum(MyAvatar.position, Vec3.multiply(5, Quat.getFront(MyAvatar.orientation))); + var orientationAdjustment = Quat.fromPitchYawRollDegrees(90, 0, 0); + + stickID = Entities.addEntity({ + type: "Model", + name: "sword", + modelURL: swordModel, + compoundShapeURL: swordCollisionShape, + dimensions: dimensions, + position: swordPosition, + rotation: Quat.fromPitchYawRollDegrees(90, 0, 0), + damping: 0.1, + collisionSoundURL: swordCollisionSoundURL, + restitution: 0.01, + collisionsWillMove: true, + collideWithMyAvatar: true + }); + + if (originalAvatarCollisionSound === undefined) { + originalAvatarCollisionSound = MyAvatar.collisionSoundURL; // We won't get MyAvatar.collisionWithEntity unless there's a sound URL. (Bug.) + SoundCache.getSound(avatarCollisionSoundURL); // Interface does not currently "preload" this? (Bug?) + } + + if(!isControllerActive()) { + grabSword("right"); + } + MyAvatar.collisionSoundURL = avatarCollisionSoundURL; + Controller.mouseMoveEvent.connect(mouseMoveEvent); + MyAvatar.collisionWithEntity.connect(gotHit); + updateDisplay(); +} + + + +function grabSword(hand) { + var handRotation; if (hand === "right") { - controllerID = 3; // right handed + handRotation = MyAvatar.getRightPalmRotation(); + + } else if (hand === "left") { + handRotation = MyAvatar.getLeftPalmRotation(); + } + var swordRotation = Entities.getEntityProperties(stickID).rotation; + var offsetRotation = Quat.multiply(Quat.inverse(handRotation), swordRotation); + actionID = Entities.addAction("hold", stickID, { + relativePosition: { + x: 0.0, + y: 0.0, + z: -dimensions.z * 0.7 + }, + relativeRotation:offsetRotation, + hand: hand, + timeScale: 0.05 + }); + if (actionID === nullActionID) { + print('*** FAILED TO MAKE SWORD ACTION ***'); + cleanUp(); } else { - controllerID = 4; // left handed + swordHeld = true; } } -var inHand = false; + +function releaseSword() { + Entities.deleteAction(stickID, actionID); + actionID = nullActionID; + Entities.editEntity(stickID, { + velocity: { + x: 0, + y: 0, + z: 0 + }, + angularVelocity: { + x: 0, + y: 0, + z: 0 + } + }); + swordHeld = false; +} + +function update() { + updateControllerState(); + +} + +function updateControllerState() { + rightTriggerValue = Controller.getTriggerValue(rightTriggerButton); + leftTriggerValue = Controller.getTriggerValue(leftTriggerButton); + + if (rightTriggerValue > TRIGGER_THRESHOLD && !swordHeld) { + grabSword("right") + } else if (rightTriggerValue < TRIGGER_THRESHOLD && prevRightTriggerValue > TRIGGER_THRESHOLD && swordHeld) { + releaseSword(); + } + + if (leftTriggerValue > TRIGGER_THRESHOLD && !swordHeld) { + grabSword("left") + } else if (leftTriggerValue < TRIGGER_THRESHOLD && prevLeftTriggerValue > TRIGGER_THRESHOLD && swordHeld) { + releaseSword(); + } + + prevRightTriggerValue = rightTriggerValue; + prevLeftTriggerValue = leftTriggerValue; +} + +randFloat = function(low, high) { + return low + Math.random() * (high - low); +} + + +randInt = function(low, high) { + return Math.floor(randFloat(low, high)); +} + function positionStick(stickOrientation) { var reorient = Quat.fromPitchYawRollDegrees(0, -90, 0); var baseOffset = {x: -dimensions.z * 0.8, y: 0, z: 0}; @@ -188,23 +401,19 @@ function resetToHand() { // For use with controllers, puts the sword in contact Entities.updateAction(stickID, actionID, { relativePosition: {x: 0.0, y: 0.0, z: -dimensions.z * 0.5}, relativeRotation: Quat.fromVec3Degrees({x: 45.0, y: 0.0, z: 0.0}), - hand: hand, // It should not be necessary to repeat these two, but there seems to be a bug in that that + hand: "right", // It should not be necessary to repeat these two, but there seems to be a bug in that that timeScale: 0.05 // they do not retain their earlier values if you don't repeat them. }); inHand = true; } -function isControllerActive() { - // I don't think the hydra API provides any reliable way to know whether a particular controller is active. Ask for both. - controllerActive = (Vec3.length(Controller.getSpatialControlPosition(3)) > 0) || Vec3.length(Controller.getSpatialControlPosition(4)) > 0; - return controllerActive; -} + function mouseMoveEvent(event) { // When a controller like the hydra gives a mouse event, the x/y is not meaningful to us, but we can detect with a truty deviceID - if (event.deviceID || !isFighting() || isControllerActive()) { - print('Attempting attachment reset'); - resetToHand(); - return; - } + // if (event.deviceID || !isFighting() || isControllerActive()) { + // print('Attempting attachment reset'); + // resetToHand(); + // return; + // } var windowCenterX = Window.innerWidth / 2; var windowCenterY = Window.innerHeight / 2; var mouseXCenterOffset = event.x - windowCenterX; @@ -216,117 +425,27 @@ function mouseMoveEvent(event) { positionStick(stickOrientation); } -function removeSword() { - if (stickID) { - print('deleting action ' + actionID + ' and entity ' + stickID); - Entities.deleteAction(stickID, actionID); - Entities.deleteEntity(stickID); - stickID = null; - actionID = nullActionID; - Controller.mouseMoveEvent.disconnect(mouseMoveEvent); - MyAvatar.collisionWithEntity.disconnect(gotHit); - // removeEventhHandler happens automatically when the entity is deleted. - } - inHand = false; - if (originalAvatarCollisionSound !== undefined) { - MyAvatar.collisionSoundURL = originalAvatarCollisionSound; - } - removeDisplay(); -} -function cleanUp(leaveButtons) { - removeSword(); - targetIDs.forEach(function (id) { - Entities.deleteAction(id.entity, id.action); - Entities.deleteEntity(id.entity); - }); - targetIDs = []; - if (!leaveButtons) { - toolBar.cleanup(); - } -} -function makeSword() { - initControls(); - var swordPosition; - if (!isControllerActive()) { // Dont' knock yourself with sword - swordPosition = Vec3.sum(MyAvatar.position, Vec3.multiply(2, Quat.getFront(MyAvatar.orientation))); - } else if (hand === 'right') { - swordPosition = MyAvatar.getRightPalmPosition(); - } else { - swordPosition = MyAvatar.getLeftPalmPosition(); - } - stickID = Entities.addEntity({ - type: "Model", - modelURL: swordModel, - compoundShapeURL: swordCollisionShape, - dimensions: dimensions, - position: swordPosition, - rotation: MyAvatar.orientation, - damping: 0.1, - collisionSoundURL: swordCollisionSoundURL, - restitution: 0.01, - collisionsWillMove: true - }); - actionID = Entities.addAction("hold", stickID, { - relativePosition: {x: 0.0, y: 0.0, z: -dimensions.z * 0.5}, - relativeRotation: Quat.fromVec3Degrees({x: 45.0, y: 0.0, z: 0.0}), - hand: hand, - timeScale: 0.05 - }); - if (actionID === nullActionID) { - print('*** FAILED TO MAKE SWORD ACTION ***'); - cleanUp(); - } - if (originalAvatarCollisionSound === undefined) { - originalAvatarCollisionSound = MyAvatar.collisionSoundURL; // We won't get MyAvatar.collisionWithEntity unless there's a sound URL. (Bug.) - SoundCache.getSound(avatarCollisionSoundURL); // Interface does not currently "preload" this? (Bug?) - } - MyAvatar.collisionSoundURL = avatarCollisionSoundURL; - Controller.mouseMoveEvent.connect(mouseMoveEvent); - MyAvatar.collisionWithEntity.connect(gotHit); - Script.addEventHandler(stickID, 'collisionWithEntity', scoreHit); - updateDisplay(); -} function onClick(event) { switch (Overlays.getOverlayAtPoint(event)) { - case swordButton: - if (!stickID) { - makeSword(); - } else { - removeSword(); - } - break; - case targetButton: - var position = Vec3.sum(MyAvatar.position, {x: 1.0, y: 0.4, z: 0.0}); - var boxId = Entities.addEntity({ - type: "Box", - name: "dummy", - position: position, - dimensions: {x: 0.3, y: 0.7, z: 0.3}, - gravity: {x: 0.0, y: -3.0, z: 0.0}, - damping: 0.2, - collisionsWillMove: true - }); - - var pointToOffsetFrom = Vec3.sum(position, {x: 0.0, y: 2.0, z: 0.0}); - var action = Entities.addAction("offset", boxId, {pointToOffsetFrom: pointToOffsetFrom, - linearDistance: 2.0, - // linearTimeScale: 0.005 - linearTimeScale: 0.1 - }); - targetIDs.push({entity: boxId, action: action}); - break; - case switchHandsButton: - cleanUp('leaveButtons'); - hand = hand === "right" ? "left" : "right"; - Settings.setValue("highfidelity.sword.hand", hand); - makeSword(); - break; - case cleanupButton: - cleanUp('leaveButtons'); - break; + case swordButton: + if (!stickID) { + makeSword(); + } else { + removeSword(); + } + break; + case targetButton: + Script.include("zombieFight.js?v1"); + zombieFight = new ZombieFight(); + zombieFight.initiateZombieApocalypse(); + break; + case cleanupButton: + cleanUp('leaveButtons'); + break; } } Script.scriptEnding.connect(cleanUp); -Controller.mousePressEvent.connect(onClick); +Script.update.connect(update); +Controller.mousePressEvent.connect(onClick); \ No newline at end of file From f7108ccff80776c48b8300d0fa1b99b0c0717d49 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Thu, 16 Jul 2015 13:27:59 -0700 Subject: [PATCH 2/4] modified collision-hull model to not include the handle. This prevents the sword handle from pushing the brandishing avatar around, while still letting the sword sit in said avatar's hand in a more aesthetically pleasing manner than floating off in space --- examples/example/games/sword.js | 90 ++++++++++++--------------------- 1 file changed, 33 insertions(+), 57 deletions(-) diff --git a/examples/example/games/sword.js b/examples/example/games/sword.js index 6504bd0494..e09e25bcdc 100644 --- a/examples/example/games/sword.js +++ b/examples/example/games/sword.js @@ -1,10 +1,10 @@ -// stick.js +// sword.js // examples // // Created by Seth Alves on 2015-6-10 // Copyright 2015 High Fidelity, Inc. // -// Allow avatar to hold a stick +// Allow avatar to hold a sword // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html @@ -21,7 +21,7 @@ var hand = "right"; var nullActionID = "00000000-0000-0000-0000-000000000000"; var controllerID; var controllerActive; -var stickID = null; +var swordID = null; var actionID = nullActionID; var dimensions = { x: 0.3, @@ -30,33 +30,9 @@ var dimensions = { }; var BUTTON_SIZE = 32; -var Y_AXIS = { - x: 0, - y: 1, - z: 0 -}; -var X_AXIS = { - x: 1, - y: 0, - z: 0 -}; - -var theta = 0.0; - -var RAD_TO_DEG = 180.0 / Math.PI; - -function orientationOf(vector) { - var direction, yaw, pitch; - direction = Vec3.normalize(vector); - yaw = Quat.angleAxis(Math.atan2(direction.x, direction.z) * RAD_TO_DEG, Y_AXIS); - pitch = Quat.angleAxis(Math.asin(-direction.y) * RAD_TO_DEG, X_AXIS); - return Quat.multiply(yaw, pitch); -} - - -var stickModel = "https://hifi-public.s3.amazonaws.com/eric/models/stick.fbx"; var swordModel = "https://hifi-public.s3.amazonaws.com/ozan/props/sword/sword.fbx"; -var swordCollisionShape = "https://hifi-public.s3.amazonaws.com/ozan/props/sword/sword.obj"; +// var swordCollisionShape = "https://hifi-public.s3.amazonaws.com/ozan/props/sword/sword.obj"; +var swordCollisionShape = "https://hifi-public.s3.amazonaws.com/eric/models/noHandleSwordCollisionShape.obj?=v1"; var swordCollisionSoundURL = "http://public.highfidelity.io/sounds/Collisions-hitsandslaps/swordStrike1.wav"; var avatarCollisionSoundURL = "https://s3.amazonaws.com/hifi-public/sounds/Collisions-hitsandslaps/airhockey_hit1.wav"; var whichModel = "sword"; @@ -121,6 +97,7 @@ function clearFlash() { } function flash(color) { + return; clearFlash(); flasher = {}; flasher.overlay = Overlays.addOverlay("text", { @@ -224,7 +201,7 @@ function gotHit(collision) { function isFighting() { - return stickID && (actionID !== nullActionID); + return swordID && (actionID !== nullActionID); } @@ -239,11 +216,11 @@ function isControllerActive() { function removeSword() { - if (stickID) { - print('deleting action ' + actionID + ' and entity ' + stickID); - Entities.deleteAction(stickID, actionID); - Entities.deleteEntity(stickID); - stickID = null; + if (swordID) { + print('deleting action ' + actionID + ' and entity ' + swordID); + Entities.deleteAction(swordID, actionID); + Entities.deleteEntity(swordID); + swordID = null; actionID = nullActionID; Controller.mouseMoveEvent.disconnect(mouseMoveEvent); MyAvatar.collisionWithEntity.disconnect(gotHit); @@ -269,7 +246,7 @@ function makeSword() { var swordPosition = Vec3.sum(MyAvatar.position, Vec3.multiply(5, Quat.getFront(MyAvatar.orientation))); var orientationAdjustment = Quat.fromPitchYawRollDegrees(90, 0, 0); - stickID = Entities.addEntity({ + swordID = Entities.addEntity({ type: "Model", name: "sword", modelURL: swordModel, @@ -281,7 +258,6 @@ function makeSword() { collisionSoundURL: swordCollisionSoundURL, restitution: 0.01, collisionsWillMove: true, - collideWithMyAvatar: true }); if (originalAvatarCollisionSound === undefined) { @@ -308,13 +284,13 @@ function grabSword(hand) { } else if (hand === "left") { handRotation = MyAvatar.getLeftPalmRotation(); } - var swordRotation = Entities.getEntityProperties(stickID).rotation; + var swordRotation = Entities.getEntityProperties(swordID).rotation; var offsetRotation = Quat.multiply(Quat.inverse(handRotation), swordRotation); - actionID = Entities.addAction("hold", stickID, { + actionID = Entities.addAction("hold", swordID, { relativePosition: { x: 0.0, y: 0.0, - z: -dimensions.z * 0.7 + z: -dimensions.z * 0.5 }, relativeRotation:offsetRotation, hand: hand, @@ -329,9 +305,9 @@ function grabSword(hand) { } function releaseSword() { - Entities.deleteAction(stickID, actionID); + Entities.deleteAction(swordID, actionID); actionID = nullActionID; - Entities.editEntity(stickID, { + Entities.editEntity(swordID, { velocity: { x: 0, y: 0, @@ -380,25 +356,25 @@ randInt = function(low, high) { return Math.floor(randFloat(low, high)); } -function positionStick(stickOrientation) { +function positionSword(swordOrientation) { var reorient = Quat.fromPitchYawRollDegrees(0, -90, 0); var baseOffset = {x: -dimensions.z * 0.8, y: 0, z: 0}; var offset = Vec3.multiplyQbyV(reorient, baseOffset); - stickOrientation = Quat.multiply(reorient, stickOrientation); + swordOrientation = Quat.multiply(reorient, swordOrientation); inHand = false; - Entities.updateAction(stickID, actionID, { + Entities.updateAction(swordID, actionID, { relativePosition: offset, - relativeRotation: stickOrientation, + relativeRotation: swordOrientation, hand: "right" }); } function resetToHand() { // For use with controllers, puts the sword in contact with the hand. - // Maybe coordinate with positionStick? + // Maybe coordinate with positionSword? if (inHand) { // Optimization: bail if we're already inHand. return; } print('Reset to hand'); - Entities.updateAction(stickID, actionID, { + Entities.updateAction(swordID, actionID, { relativePosition: {x: 0.0, y: 0.0, z: -dimensions.z * 0.5}, relativeRotation: Quat.fromVec3Degrees({x: 45.0, y: 0.0, z: 0.0}), hand: "right", // It should not be necessary to repeat these two, but there seems to be a bug in that that @@ -408,12 +384,12 @@ function resetToHand() { // For use with controllers, puts the sword in contact } function mouseMoveEvent(event) { - // When a controller like the hydra gives a mouse event, the x/y is not meaningful to us, but we can detect with a truty deviceID - // if (event.deviceID || !isFighting() || isControllerActive()) { - // print('Attempting attachment reset'); - // resetToHand(); - // return; - // } + //When a controller like the hydra gives a mouse event, the x/y is not meaningful to us, but we can detect with a truty deviceID + if (event.deviceID || !isFighting() || isControllerActive()) { + print('Attempting attachment reset'); + resetToHand(); + return; + } var windowCenterX = Window.innerWidth / 2; var windowCenterY = Window.innerHeight / 2; var mouseXCenterOffset = event.x - windowCenterX; @@ -421,15 +397,15 @@ function mouseMoveEvent(event) { var mouseXRatio = mouseXCenterOffset / windowCenterX; var mouseYRatio = mouseYCenterOffset / windowCenterY; - var stickOrientation = Quat.fromPitchYawRollDegrees(mouseYRatio * 90, mouseXRatio * 90, 0); - positionStick(stickOrientation); + var swordOrientation = Quat.fromPitchYawRollDegrees(mouseYRatio * 90, mouseXRatio * 90, 0); + positionSword(swordOrientation); } function onClick(event) { switch (Overlays.getOverlayAtPoint(event)) { case swordButton: - if (!stickID) { + if (!swordID) { makeSword(); } else { removeSword(); From 66154d20e06cba54642f753342c88b2c30d2607c Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Thu, 16 Jul 2015 13:38:39 -0700 Subject: [PATCH 3/4] deleted unnessary log message --- examples/example/games/sword.js | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/example/games/sword.js b/examples/example/games/sword.js index e09e25bcdc..361ec71f42 100644 --- a/examples/example/games/sword.js +++ b/examples/example/games/sword.js @@ -386,7 +386,6 @@ function resetToHand() { // For use with controllers, puts the sword in contact function mouseMoveEvent(event) { //When a controller like the hydra gives a mouse event, the x/y is not meaningful to us, but we can detect with a truty deviceID if (event.deviceID || !isFighting() || isControllerActive()) { - print('Attempting attachment reset'); resetToHand(); return; } From 220b54e5f7cb5596f0f0cf5c1e0da70d0e45ef00 Mon Sep 17 00:00:00 2001 From: ericrius1 Date: Thu, 16 Jul 2015 18:30:24 -0700 Subject: [PATCH 4/4] added reference to correct zombie game script --- examples/example/games/sword.js | 73 +++++++++++++++++++++++++++------ 1 file changed, 60 insertions(+), 13 deletions(-) diff --git a/examples/example/games/sword.js b/examples/example/games/sword.js index 361ec71f42..41223401c3 100644 --- a/examples/example/games/sword.js +++ b/examples/example/games/sword.js @@ -30,14 +30,20 @@ var dimensions = { }; var BUTTON_SIZE = 32; +var health = 100; +var healthLossOnHit = 10; + var swordModel = "https://hifi-public.s3.amazonaws.com/ozan/props/sword/sword.fbx"; // var swordCollisionShape = "https://hifi-public.s3.amazonaws.com/ozan/props/sword/sword.obj"; -var swordCollisionShape = "https://hifi-public.s3.amazonaws.com/eric/models/noHandleSwordCollisionShape.obj?=v1"; +var swordCollisionShape = "https://hifi-public.s3.amazonaws.com/eric/models/noHandleSwordCollisionShape.obj?=v2"; var swordCollisionSoundURL = "http://public.highfidelity.io/sounds/Collisions-hitsandslaps/swordStrike1.wav"; -var avatarCollisionSoundURL = "https://s3.amazonaws.com/hifi-public/sounds/Collisions-hitsandslaps/airhockey_hit1.wav"; +var avatarCollisionSoundURL = "https://hifi-public.s3.amazonaws.com/eric/sounds/blankSound.wav"; //Just to avoid no collision callback bug +var zombieGameScriptURL = "https://hifi-public.s3.amazonaws.com/eric/scripts/zombieFight.js"; var whichModel = "sword"; var originalAvatarCollisionSound; +var avatarCollisionSounds = [SoundCache.getSound("https://hifi-public.s3.amazonaws.com/eric/sounds/avatarHit.wav"), SoundCache.getSound("https://hifi-public.s3.amazonaws.com/eric/sounds/avatarHit2.wav?=v2")]; + var toolBar = new ToolBar(0, 0, ToolBar.vertical, "highfidelity.sword.toolbar", function() { return { x: 100, @@ -45,6 +51,8 @@ var toolBar = new ToolBar(0, 0, ToolBar.vertical, "highfidelity.sword.toolbar", }; }); +var gameStarted = false; + var SWORD_IMAGE = "https://hifi-public.s3.amazonaws.com/images/sword/sword.svg"; // Toggle between brandishing/sheathing sword (creating if necessary) var TARGET_IMAGE = "https://hifi-public.s3.amazonaws.com/images/sword/dummy2.svg"; // Create a target dummy var CLEANUP_IMAGE = "http://s3.amazonaws.com/hifi-public/images/delete.png"; // Remove sword and all target dummies.f @@ -109,7 +117,7 @@ function flash(color) { flasher.timer = Script.setTimeout(clearFlash, 500); } -var health = 100; + var display2d, display3d; function trackAvatarWithText() { @@ -126,7 +134,6 @@ function trackAvatarWithText() { function updateDisplay() { var text = health.toString(); if (!display2d) { - health = 100; display2d = Overlays.addOverlay("text", { text: text, font: { @@ -190,7 +197,24 @@ function removeDisplay() { function gotHit(collision) { - health -= 1; + Audio.playSound(avatarCollisionSounds[randInt(0, avatarCollisionSounds.length)], { + position: MyAvatar.position, + volume: 0.5 + }); + health -= healthLossOnHit; + if (health <= 30) { + Overlays.editOverlay(display2d, { + color: { + red: 200, + green: 10, + blue: 10 + } + }); + } + + if (health <= 0 && zombieFight) { + zombieFight.loseGame(); + } flash({ red: 255, green: 0, @@ -239,6 +263,7 @@ function cleanUp(leaveButtons) { toolBar.cleanup(); } removeSword(); + gameStarted = false; zombieFight.cleanup(); } @@ -265,7 +290,7 @@ function makeSword() { SoundCache.getSound(avatarCollisionSoundURL); // Interface does not currently "preload" this? (Bug?) } - if(!isControllerActive()) { + if (!isControllerActive()) { grabSword("right"); } MyAvatar.collisionSoundURL = avatarCollisionSoundURL; @@ -277,6 +302,10 @@ function makeSword() { function grabSword(hand) { + if (!swordID) { + print("Create a sword by clicking on sword icon!") + return; + } var handRotation; if (hand === "right") { handRotation = MyAvatar.getRightPalmRotation(); @@ -292,7 +321,7 @@ function grabSword(hand) { y: 0.0, z: -dimensions.z * 0.5 }, - relativeRotation:offsetRotation, + relativeRotation: offsetRotation, hand: hand, timeScale: 0.05 }); @@ -358,7 +387,11 @@ randInt = function(low, high) { function positionSword(swordOrientation) { var reorient = Quat.fromPitchYawRollDegrees(0, -90, 0); - var baseOffset = {x: -dimensions.z * 0.8, y: 0, z: 0}; + var baseOffset = { + x: -dimensions.z * 0.8, + y: 0, + z: 0 + }; var offset = Vec3.multiplyQbyV(reorient, baseOffset); swordOrientation = Quat.multiply(reorient, swordOrientation); inHand = false; @@ -368,6 +401,7 @@ function positionSword(swordOrientation) { hand: "right" }); } + function resetToHand() { // For use with controllers, puts the sword in contact with the hand. // Maybe coordinate with positionSword? if (inHand) { // Optimization: bail if we're already inHand. @@ -375,10 +409,18 @@ function resetToHand() { // For use with controllers, puts the sword in contact } print('Reset to hand'); Entities.updateAction(swordID, actionID, { - relativePosition: {x: 0.0, y: 0.0, z: -dimensions.z * 0.5}, - relativeRotation: Quat.fromVec3Degrees({x: 45.0, y: 0.0, z: 0.0}), - hand: "right", // It should not be necessary to repeat these two, but there seems to be a bug in that that - timeScale: 0.05 // they do not retain their earlier values if you don't repeat them. + relativePosition: { + x: 0.0, + y: 0.0, + z: -dimensions.z * 0.5 + }, + relativeRotation: Quat.fromVec3Degrees({ + x: 45.0, + y: 0.0, + z: 0.0 + }), + hand: "right", // It should not be necessary to repeat these two, but there seems to be a bug in that that + timeScale: 0.05 // they do not retain their earlier values if you don't repeat them. }); inHand = true; } @@ -411,9 +453,14 @@ function onClick(event) { } break; case targetButton: - Script.include("zombieFight.js?v1"); + if (gameStarted) { + return; + } + Script.include("https://hifi-public.s3.amazonaws.com/eric/scripts/zombieFight.js"); zombieFight = new ZombieFight(); zombieFight.initiateZombieApocalypse(); + gameStarted = true; + break; case cleanupButton: cleanUp('leaveButtons');