refactored code to use math calculations instead of a lookup table
This commit is contained in:
parent
7c3eb6ed57
commit
5e20e2321a
97
index.html
97
index.html
@ -177,40 +177,18 @@
|
|||||||
300, 600, 300, 500, 800, 550, 400, 300, 900, 500, 'spin again',
|
300, 600, 300, 500, 800, 550, 400, 300, 900, 500, 'spin again',
|
||||||
900, 'Bankrupt', 600, 400, 300
|
900, 'Bankrupt', 600, 400, 300
|
||||||
];
|
];
|
||||||
const wheelSpinSpeedData = {
|
|
||||||
'0':0.2523,//lose a turn
|
|
||||||
'1':.2497,//800
|
|
||||||
'2':.2471,//350
|
|
||||||
'3':.2445,//450
|
|
||||||
'4':.2418,//450
|
|
||||||
'5':.2392,//300
|
|
||||||
'6':.2366,//600
|
|
||||||
'7':.2339,//5000
|
|
||||||
'8':.2313,//300
|
|
||||||
'9':.2287,//600
|
|
||||||
'10':.2261,//300
|
|
||||||
'11':.2235,//500
|
|
||||||
|
|
||||||
'12':.2208,//800
|
|
||||||
'13':.2182,//550
|
|
||||||
'14':.2156,//400
|
|
||||||
'15':.213,//300
|
|
||||||
'16':.2104,//900
|
|
||||||
'17':.2078,//500
|
|
||||||
'18':.2052,//spin again
|
|
||||||
'19':.2026,//900
|
|
||||||
'20':.1999,//Bankrupt
|
|
||||||
'21':.1973,//600
|
|
||||||
'22':.1947,//400
|
|
||||||
'23':.1921//300
|
|
||||||
};
|
|
||||||
const canvas = document.getElementById('wheelCanvas');
|
const canvas = document.getElementById('wheelCanvas');
|
||||||
const ctx = canvas.getContext('2d');
|
const ctx = canvas.getContext('2d');
|
||||||
const radius = canvas.width / 2;
|
const radius = canvas.width / 2;
|
||||||
|
let lowestEquivelantAngle = 23.4327090939438 % (2* Math.PI);
|
||||||
let rotation = 0 - (.283*6); //sets the zero index on top
|
let fps = 60;
|
||||||
|
const frameDuration = 1000 / fps; // Duration of each frame in milliseconds
|
||||||
|
console.log('lowestEquivelantAngle:',lowestEquivelantAngle);
|
||||||
|
let rotation = lowestEquivelantAngle; //sets the zero index on top
|
||||||
let spinning = false;
|
let spinning = false;
|
||||||
let spinSpeed = 0;
|
|
||||||
|
|
||||||
let img = new Image();
|
let img = new Image();
|
||||||
img.src = "arrow-down-bold.png";
|
img.src = "arrow-down-bold.png";
|
||||||
img.onload = function() {
|
img.onload = function() {
|
||||||
@ -219,16 +197,13 @@
|
|||||||
// Draw the wheel
|
// Draw the wheel
|
||||||
function drawWheel(drawResult = false) {
|
function drawWheel(drawResult = false) {
|
||||||
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
||||||
|
|
||||||
|
|
||||||
ctx.save();
|
ctx.save();
|
||||||
|
|
||||||
|
|
||||||
ctx.translate(radius, radius);
|
ctx.translate(radius, radius);
|
||||||
ctx.rotate(rotation);
|
ctx.rotate(rotation);
|
||||||
|
|
||||||
const anglePerSegment = (2 * Math.PI) / wheel.length;
|
const anglePerSegment = (2 * Math.PI) / wheel.length;
|
||||||
|
console.log('',anglePerSegment)
|
||||||
wheel.forEach((value, i) => {
|
wheel.forEach((value, i) => {
|
||||||
const startAngle = i * anglePerSegment;
|
const startAngle = i * anglePerSegment;
|
||||||
const endAngle = startAngle + anglePerSegment;
|
const endAngle = startAngle + anglePerSegment;
|
||||||
@ -263,53 +238,59 @@
|
|||||||
|
|
||||||
// Start spinning
|
// Start spinning
|
||||||
function startSpin(targetIndex) {
|
function startSpin(targetIndex) {
|
||||||
console.log('targetIndex: ',targetIndex);
|
|
||||||
let resultingSpeed = wheelSpinSpeedData[targetIndex[0]];
|
|
||||||
console.log('resultingSpeed: ', resultingSpeed);
|
|
||||||
if (spinning) return;
|
if (spinning) return;
|
||||||
|
const totalTime = 8;
|
||||||
|
let c = 1.62;
|
||||||
|
const totalSpins = 2
|
||||||
|
const anglePerSegment = (2 * Math.PI) / wheel.length;
|
||||||
|
|
||||||
rotation = 0 - (.283*6)
|
rotation = 0 - (.283*6)
|
||||||
|
let finalDisplacement = (targetIndex[0] * anglePerSegment) - ((2 * Math.PI)*totalSpins);
|
||||||
|
if (targetIndex[0] != 0) {
|
||||||
|
finalDisplacement = ((targetIndex[0] * anglePerSegment)*-1 ) - ((2 * Math.PI)*totalSpins)
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('finalDisplacement',finalDisplacement);
|
||||||
|
const timeStep = 1 / fps; // seconds per frame
|
||||||
|
const totalFrames = totalTime * fps;
|
||||||
|
const k = finalDisplacement / Math.log(totalTime + c ); // Calculate `k` for deceleration
|
||||||
|
let currentFrame = 0;
|
||||||
|
let currentAngle = 0;
|
||||||
spinning = true;
|
spinning = true;
|
||||||
|
|
||||||
const totalSpins = Math.floor(Math.random() * 3) + 3; // 3-6 full spins
|
|
||||||
const anglePerSegment = (2 * Math.PI) / wheel.length;
|
|
||||||
const targetAngle = targetIndex * anglePerSegment;
|
|
||||||
console.log(anglePerSegment);
|
console.log(anglePerSegment);
|
||||||
|
|
||||||
let currentRotation = rotation; // Start from the current rotation
|
let currentRotation = rotation; // Start from the current rotation
|
||||||
spinSpeed = wheelSpinSpeedData[targetIndex[0]]; // Initial speed
|
|
||||||
|
|
||||||
function animate() {
|
function animate(timestamp) {
|
||||||
if ( spinSpeed < 0.001) {
|
|
||||||
|
if (currentFrame > totalFrames) {
|
||||||
spinning = false;
|
spinning = false;
|
||||||
spinSpeed = 0;
|
spinSpeed = 0;
|
||||||
console.log(`Landed on: ${wheel[targetIndex[0]]}`);
|
console.log(`Landed on: ${wheel[targetIndex[0]]}`);
|
||||||
|
console.log(`final frameCount: ${currentFrame} and totalFrames ${totalFrames}`);
|
||||||
|
console.log(`final rotation: ${rotation}`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// console.log('currentRotation: ',currentRotation);
|
|
||||||
// console.log('spinSpeed: ', spinSpeed);
|
|
||||||
currentRotation += spinSpeed;
|
|
||||||
spinSpeed *= 0.99; // Gradual slowdown
|
|
||||||
|
|
||||||
|
const t = currentFrame * timeStep;
|
||||||
|
|
||||||
rotation = currentRotation ;
|
// Logarithmic deceleration velocity: v(t) = k * (1 - ln(t + 1) / ln(T + 1))
|
||||||
|
const velocity = k * (1 - Math.log(t + c) / Math.log(totalTime + c));
|
||||||
|
// Update the angle using the velocity
|
||||||
|
rotation += velocity * timeStep;
|
||||||
|
|
||||||
|
// Increment frame
|
||||||
|
currentFrame++;
|
||||||
drawWheel();
|
drawWheel();
|
||||||
|
// frameCount++;
|
||||||
requestAnimationFrame(animate);
|
requestAnimationFrame(animate);
|
||||||
}
|
}
|
||||||
|
|
||||||
animate();
|
animate();
|
||||||
}
|
}
|
||||||
// Simulate WebSocket server response
|
|
||||||
// function simulateServerResponse() {
|
|
||||||
// const targetIndex = Math.floor(Math.random() * wheel.length); // Random result
|
|
||||||
// startSpin(targetIndex);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// Initial draw
|
// Initial draw
|
||||||
drawWheel();
|
drawWheel();
|
||||||
|
|
||||||
// Trigger spin after 2 seconds
|
|
||||||
//setTimeout(simulateServerResponse, 2000);
|
|
||||||
|
|
||||||
//==================================end of Wheel=====================================//
|
//==================================end of Wheel=====================================//
|
||||||
function drawPlayers(message) {
|
function drawPlayers(message) {
|
||||||
console.log(message);
|
console.log(message);
|
||||||
@ -536,7 +517,7 @@
|
|||||||
//if there is multiple entries where the spin exists pick a random index.
|
//if there is multiple entries where the spin exists pick a random index.
|
||||||
if(filterResultsArr.length > 1) {
|
if(filterResultsArr.length > 1) {
|
||||||
console.log('if fra.length > 1',filterResultsArr[0])
|
console.log('if fra.length > 1',filterResultsArr[0])
|
||||||
startSpin(filterResultsArr[0][0]);
|
startSpin(filterResultsArr[0]);
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
console.log('else',filterResultsArr[0])
|
console.log('else',filterResultsArr[0])
|
||||||
|
12
server.js
12
server.js
@ -6,12 +6,12 @@ const crypto = require('crypto')
|
|||||||
|
|
||||||
const wss = new WebSocket.Server({ port: 8080 })
|
const wss = new WebSocket.Server({ port: 8080 })
|
||||||
const rooms = {} // Stores rooms and their clients
|
const rooms = {} // Stores rooms and their clients
|
||||||
// const wheel = [
|
const wheel = [
|
||||||
// 'lose a turn',800,350,450,700,300,600,5000,
|
'lose a turn',800,350,450,700,300,600,5000,
|
||||||
// 300,600,300,500,800,550,400,300,900,500,'spin again',
|
300,600,300,500,800,550,400,300,900,500,'spin again',
|
||||||
// 900,'Bankrupt',600,400,300
|
900,'Bankrupt',600,400,300
|
||||||
// ] //represents wheel in wheel of fortune game.
|
] //represents wheel in wheel of fortune game.
|
||||||
const wheel = ['spin again','Bankrupt','lose a turn']
|
//const wheel = ['spin again','Bankrupt','lose a turn']
|
||||||
function removeProp(obj, prop) {
|
function removeProp(obj, prop) {
|
||||||
obj = JSON.parse(JSON.stringify(obj))
|
obj = JSON.parse(JSON.stringify(obj))
|
||||||
if(!Array.isArray(prop)){
|
if(!Array.isArray(prop)){
|
||||||
|
Loading…
Reference in New Issue
Block a user