241 lines
7.3 KiB
JavaScript
241 lines
7.3 KiB
JavaScript
|
|
function newFloatingObject () {
|
|
const MODULE_NAME = 'Floating Object'
|
|
const INFO_LOG = false
|
|
const INTENSIVE_LOG = false
|
|
const ERROR_LOG = true
|
|
|
|
const logger = newWebDebugLog()
|
|
logger.fileName = MODULE_NAME
|
|
|
|
var thisObject = {
|
|
|
|
physicsLoop: physicsLoop,
|
|
eventHandler: undefined,
|
|
|
|
payload: undefined, // This is a reference to an object controlled by a Plotter. The plotter can change its internal value and we will see them from here.
|
|
type: undefined, // Currently there are two types of Floating Objects: Profile Balls, and Notes.
|
|
|
|
physicsEnabled: false,
|
|
|
|
initializeMass: initializeMass,
|
|
initializeRadius: initializeRadius,
|
|
initializeImageSize: initializeImageSize,
|
|
initializeFontSize: initializeFontSize,
|
|
|
|
imageId: undefined,
|
|
|
|
currentPosition: 0, // Current x,y position of the floating object at the floating object's layer, where there is no displacement or zoom. This position is always changing towards the target position.
|
|
currentSpeed: 0, // This is the current speed of the floating object.
|
|
currentRadius: 0, // This is the current radius of the floating object, including its zoom applied.
|
|
currentMass: 0, // This is the current mass of the floating object, including its zoom applied.
|
|
|
|
friction: 0, // This is a factor that will ultimatelly desacelerate the floating object.
|
|
|
|
rawMass: 0, // This is the mass value without zoom.
|
|
rawRadius: 0, // This is the radius of this floating object without zoom.
|
|
|
|
targetRadius: 0, // This is the target radius of the floating object with zoom applied. It should be animated until reaching this value.
|
|
|
|
fillStyle: '',
|
|
|
|
labelStrokeStyle: '',
|
|
|
|
radomizeCurrentPosition: radomizeCurrentPosition,
|
|
radomizeCurrentSpeed: radomizeCurrentSpeed,
|
|
|
|
drawBackground: drawBackground,
|
|
drawForeground: drawForeground,
|
|
|
|
updateMass: updateMass, // Function to update the mass when the zoom level changed.
|
|
updateRadius: updateRadius, // Function to update the radius when the zoom level changed.
|
|
|
|
linkedObject: undefined, // This is a reference to the object that this floating object is representing.
|
|
linkedObjectType: '', // Since there might be floating objects for different types of objects, here we store the type of object we are linking to.
|
|
|
|
container: undefined, // This is a pointer to the object where the floating object belongs to.
|
|
initialize: initialize
|
|
|
|
}
|
|
|
|
let underlayingObject
|
|
|
|
thisObject.eventHandler = newEventHandler()
|
|
|
|
return thisObject
|
|
|
|
function initialize (pType, callBackFunction) {
|
|
try {
|
|
if (INFO_LOG === true) { logger.write('[INFO] initialize -> Entering function.') }
|
|
|
|
switch (pType) {
|
|
|
|
case 'Profile Ball': {
|
|
underlayingObject = newProfileBall()
|
|
underlayingObject.initialize(onInitialized)
|
|
|
|
function onInitialized (err) {
|
|
|
|
}
|
|
|
|
break
|
|
}
|
|
case 'Note': {
|
|
underlayingObject = newNote()
|
|
underlayingObject.initialize(onInitialized)
|
|
|
|
function onInitialized (err) {
|
|
|
|
}
|
|
break
|
|
}
|
|
default: {
|
|
break
|
|
}
|
|
}
|
|
|
|
thisObject.type = pType
|
|
|
|
thisObject.eventHandler.listenToEvent('onMouseOver', onMouseOver)
|
|
canvas.eventHandler.listenToEvent('onMouseNotOver', onMouseNotOver)
|
|
thisObject.eventHandler.listenToEvent('onMouseClick', onMouseClick)
|
|
|
|
if (callBackFunction !== undefined) { callBackFunction(GLOBAL.DEFAULT_OK_RESPONSE) }
|
|
} catch (err) {
|
|
if (ERROR_LOG === true) { logger.write('[ERROR] initialize -> err.message = ' + err.message) }
|
|
if (callBackFunction !== undefined) { callBackFunction(GLOBAL.DEFAULT_FAIL_RESPONSE) }
|
|
}
|
|
}
|
|
|
|
function physicsLoop (callBackFunction) {
|
|
try {
|
|
if (INFO_LOG === true) { logger.write('[INFO] initialize -> Entering function.') }
|
|
|
|
underlayingObject.physicsLoop()
|
|
|
|
if (callBackFunction !== undefined) { callBackFunction(GLOBAL.DEFAULT_OK_RESPONSE) }
|
|
} catch (err) {
|
|
if (ERROR_LOG === true) { logger.write('[ERROR] physicsLoop -> err.message = ' + err.message) }
|
|
if (callBackFunction !== undefined) { callBackFunction(GLOBAL.DEFAULT_FAIL_RESPONSE) }
|
|
}
|
|
}
|
|
|
|
function onMouseOver () {
|
|
thisObject.targetRadius = thisObject.rawRadius * 1.5
|
|
thisObject.targetImageSize = thisObject.rawImageSize * 1.5
|
|
thisObject.targetFontSize = thisObject.rawFontSize * 1.5
|
|
|
|
underlayingObject.onMouseOver()
|
|
}
|
|
|
|
function onMouseNotOver () {
|
|
thisObject.targetRadius = thisObject.rawRadius * 1
|
|
thisObject.targetImageSize = thisObject.rawImageSize * 1
|
|
thisObject.targetFontSize = thisObject.rawFontSize * 1
|
|
|
|
underlayingObject.onMouseNotOver()
|
|
}
|
|
|
|
function onMouseClick (pPoint) {
|
|
underlayingObject.onMouseClick(pPoint, thisObject)
|
|
}
|
|
|
|
function drawBackground () {
|
|
underlayingObject.drawBackground(thisObject)
|
|
}
|
|
|
|
function drawForeground () {
|
|
underlayingObject.drawForeground(thisObject)
|
|
}
|
|
|
|
function initializeMass (suggestedValue) {
|
|
var mass = suggestedValue
|
|
if (mass < 0.1) {
|
|
mass = 0.1
|
|
}
|
|
|
|
thisObject.rawMass = mass
|
|
thisObject.currentMass = mass
|
|
}
|
|
|
|
function initializeRadius (suggestedValue) {
|
|
var radius = suggestedValue
|
|
if (radius < 2) {
|
|
radius = 2
|
|
}
|
|
|
|
thisObject.rawRadius = radius
|
|
thisObject.targetRadius = radius
|
|
thisObject.currentRadius = radius / 3
|
|
}
|
|
|
|
function initializeImageSize (suggestedValue) {
|
|
var size = suggestedValue
|
|
if (size < 2) {
|
|
size = 2
|
|
}
|
|
|
|
thisObject.rawImageSize = size
|
|
thisObject.targetImageSize = size
|
|
thisObject.currentImageSize = size / 3
|
|
}
|
|
|
|
function initializeFontSize (suggestedValue) {
|
|
var size = suggestedValue
|
|
if (size < 3) {
|
|
size = 3
|
|
}
|
|
|
|
thisObject.rawFontSize = size
|
|
thisObject.targetFontSize = size
|
|
thisObject.currentFontSize = size / 3
|
|
}
|
|
|
|
function radomizeCurrentPosition (arroundPoint) {
|
|
var position = {
|
|
x: Math.floor((Math.random() * (200) - 100)) + arroundPoint.x,
|
|
y: Math.floor((Math.random() * (200) - 100)) + arroundPoint.y
|
|
}
|
|
|
|
thisObject.currentPosition = position
|
|
}
|
|
|
|
function radomizeCurrentSpeed () {
|
|
var initialXDirection
|
|
var randomX = Math.floor((Math.random() * 10) + 1)
|
|
if (randomX > 5) {
|
|
initialXDirection = 1
|
|
} else {
|
|
initialXDirection = -1
|
|
}
|
|
|
|
var initialYDirection
|
|
var randomY = Math.floor((Math.random() * 10) + 1)
|
|
if (randomY > 5) {
|
|
initialYDirection = 1
|
|
} else {
|
|
initialYDirection = -1
|
|
}
|
|
|
|
var velocity = {
|
|
x: initialXDirection * Math.floor((Math.random() * 300) + 1) / 100,
|
|
y: initialYDirection * Math.floor((Math.random() * 300) + 1) / 100
|
|
}
|
|
|
|
thisObject.currentSpeed = velocity
|
|
}
|
|
|
|
function updateMass () {
|
|
|
|
// thisObject.currentMass = thisObject.rawMass + thisObject.rawMass * thisObject.container.zoom.incrementM * thisObject.container.zoom.levelM;
|
|
|
|
}
|
|
|
|
function updateRadius () {
|
|
|
|
// thisObject.targetRadius = thisObject.rawRadius + thisObject.rawRadius * thisObject.container.zoom.incrementR * thisObject.container.zoom.levelR;
|
|
|
|
}
|
|
}
|
|
|