mirror of
https://github.com/cmclark00/tetris-3d.git
synced 2025-05-17 23:25:21 +01:00
Fix controller rotation and update control scheme - Move hard drop button from Right Trigger to D-pad Up - Fix rotation button responsiveness - Add animation state check in controller handler - Update control displays in UI
This commit is contained in:
parent
a659666571
commit
0f52dad8d4
2 changed files with 41 additions and 43 deletions
|
@ -38,11 +38,11 @@
|
||||||
<p><span class="key">A</span> / <span class="key">←</span> Move Left</p>
|
<p><span class="key">A</span> / <span class="key">←</span> Move Left</p>
|
||||||
<p><span class="key">D</span> / <span class="key">→</span> Move Right</p>
|
<p><span class="key">D</span> / <span class="key">→</span> Move Right</p>
|
||||||
<p><span class="key">S</span> / <span class="key">↓</span> Move Down</p>
|
<p><span class="key">S</span> / <span class="key">↓</span> Move Down</p>
|
||||||
|
<p><span class="key">↑</span> / <span class="key">Space</span> Hard Drop</p>
|
||||||
<p><span class="key">Q</span> Rotate Left</p>
|
<p><span class="key">Q</span> Rotate Left</p>
|
||||||
<p><span class="key">E</span> Rotate Right</p>
|
<p><span class="key">E</span> Rotate Right</p>
|
||||||
<p><span class="key">W</span> Horizontal 3D</p>
|
<p><span class="key">W</span> Horizontal 3D</p>
|
||||||
<p><span class="key">X</span> Vertical 3D</p>
|
<p><span class="key">X</span> Vertical 3D</p>
|
||||||
<p><span class="key">Space</span> Hard Drop</p>
|
|
||||||
<p><span class="key">P</span> Pause Game</p>
|
<p><span class="key">P</span> Pause Game</p>
|
||||||
<p><span class="key">H</span> Toggle Shadow</p>
|
<p><span class="key">H</span> Toggle Shadow</p>
|
||||||
|
|
||||||
|
@ -53,11 +53,11 @@
|
||||||
<div id="controller-mapping" class="mt-2">
|
<div id="controller-mapping" class="mt-2">
|
||||||
<p><span class="ctrl">D-Pad ←/→</span> Move Left/Right</p>
|
<p><span class="ctrl">D-Pad ←/→</span> Move Left/Right</p>
|
||||||
<p><span class="ctrl">D-Pad ↓</span> Move Down</p>
|
<p><span class="ctrl">D-Pad ↓</span> Move Down</p>
|
||||||
|
<p><span class="ctrl">D-Pad ↑</span> Hard Drop</p>
|
||||||
<p><span class="ctrl">A</span> Rotate Left</p>
|
<p><span class="ctrl">A</span> Rotate Left</p>
|
||||||
<p><span class="ctrl">B</span> Rotate Right</p>
|
<p><span class="ctrl">B</span> Rotate Right</p>
|
||||||
<p><span class="ctrl">Y</span> Horizontal 3D</p>
|
<p><span class="ctrl">Y</span> Horizontal 3D</p>
|
||||||
<p><span class="ctrl">X</span> Vertical 3D</p>
|
<p><span class="ctrl">X</span> Vertical 3D</p>
|
||||||
<p><span class="ctrl">RT</span> Hard Drop</p>
|
|
||||||
<p><span class="ctrl">Start</span> Pause Game</p>
|
<p><span class="ctrl">Start</span> Pause Game</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
80
script.js
80
script.js
|
@ -78,11 +78,12 @@ let controllerMapping = {
|
||||||
left: [14, 'dpadLeft'], // D-pad left or left stick left
|
left: [14, 'dpadLeft'], // D-pad left or left stick left
|
||||||
right: [15, 'dpadRight'], // D-pad right or left stick right
|
right: [15, 'dpadRight'], // D-pad right or left stick right
|
||||||
down: [13, 'dpadDown'], // D-pad down or left stick down
|
down: [13, 'dpadDown'], // D-pad down or left stick down
|
||||||
|
up: [12, 'dpadUp'], // D-pad up (added for hard drop)
|
||||||
rotateLeft: [0, 'buttonA'], // A button
|
rotateLeft: [0, 'buttonA'], // A button
|
||||||
rotateRight: [1, 'buttonB'], // B button
|
rotateRight: [1, 'buttonB'], // B button
|
||||||
mirrorH: [3, 'buttonY'], // Y button - horizontal mirror
|
mirrorH: [3, 'buttonY'], // Y button - horizontal mirror
|
||||||
mirrorV: [2, 'buttonX'], // X button - vertical mirror
|
mirrorV: [2, 'buttonX'], // X button - vertical mirror
|
||||||
hardDrop: [7, 'rightTrigger'], // RT button
|
hardDrop: [12, 'dpadUp'], // Changed from RT to D-pad up
|
||||||
pause: [9, 'start'] // Start button
|
pause: [9, 'start'] // Start button
|
||||||
};
|
};
|
||||||
let lastControllerState = {};
|
let lastControllerState = {};
|
||||||
|
@ -1095,31 +1096,12 @@ class Piece {
|
||||||
this.shadowTetromino = this.targetTetromino;
|
this.shadowTetromino = this.targetTetromino;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reset rotation state
|
// Completely reset rotation state
|
||||||
this.rotationTransition = false;
|
this.resetAnimationState();
|
||||||
this.rotationProgress = 0;
|
|
||||||
|
|
||||||
// Clear target references to avoid memory leaks and state issues
|
|
||||||
this.targetTetromino = null;
|
|
||||||
this.targetPattern = undefined;
|
|
||||||
this.targetKick = undefined;
|
|
||||||
this.originalTetromino = null;
|
|
||||||
|
|
||||||
// Reset rotation angles
|
|
||||||
this.rotationAngleX = 0;
|
|
||||||
this.rotationAngleY = 0;
|
|
||||||
this.rotationAngleZ = 0;
|
|
||||||
|
|
||||||
// Recalculate shadow position
|
// Recalculate shadow position
|
||||||
this.calculateShadowY();
|
this.calculateShadowY();
|
||||||
|
|
||||||
// Skip completion effect on mobile for performance
|
|
||||||
if (!mobilePerformanceMode && enable3DEffects) {
|
|
||||||
// Start completion effect
|
|
||||||
this.showCompletionEffect = true;
|
|
||||||
this.completionEffectProgress = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Draw in new position
|
// Draw in new position
|
||||||
this.draw();
|
this.draw();
|
||||||
return;
|
return;
|
||||||
|
@ -1150,18 +1132,12 @@ class Piece {
|
||||||
this.completionEffectProgress += completionStep;
|
this.completionEffectProgress += completionStep;
|
||||||
|
|
||||||
if (this.completionEffectProgress >= 1) {
|
if (this.completionEffectProgress >= 1) {
|
||||||
this.showCompletionEffect = false;
|
// Completely reset animation state
|
||||||
this.completionEffectProgress = 0;
|
this.resetAnimationState();
|
||||||
|
|
||||||
// Reset rotation angles
|
// Redraw with final state
|
||||||
this.rotationAngleX = 0;
|
this.draw();
|
||||||
this.rotationAngleY = 0;
|
return;
|
||||||
this.rotationAngleZ = 0;
|
|
||||||
|
|
||||||
// Clear all rotation references
|
|
||||||
this.rotationDirection = null;
|
|
||||||
this.originalTetromino = null;
|
|
||||||
this.targetTetromino = null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2338,9 +2314,16 @@ function pollControllers() {
|
||||||
}, buttonRepeatRates['down']); // Faster repeat for down
|
}, buttonRepeatRates['down']); // Faster repeat for down
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Up direction for hard drop
|
||||||
|
else if (controller.axes[1] < -deadzone) {
|
||||||
|
if (lastControllerState[controller.index].axes[1] >= -deadzone) {
|
||||||
|
// One-time action for hard drop (no need for repeat)
|
||||||
|
handleControllerAction('up');
|
||||||
|
}
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
// Stick returned to center, clear down timer
|
// Stick returned to center, clear down timer
|
||||||
if (lastControllerState[controller.index].axes[1] > deadzone) {
|
if (Math.abs(lastControllerState[controller.index].axes[1]) > deadzone) {
|
||||||
if (buttonHoldTimers['down']) {
|
if (buttonHoldTimers['down']) {
|
||||||
clearInterval(buttonHoldTimers['down']);
|
clearInterval(buttonHoldTimers['down']);
|
||||||
buttonHoldTimers['down'] = null;
|
buttonHoldTimers['down'] = null;
|
||||||
|
@ -2356,6 +2339,14 @@ function pollControllers() {
|
||||||
function handleControllerAction(action) {
|
function handleControllerAction(action) {
|
||||||
if (paused && action !== 'pause') return;
|
if (paused && action !== 'pause') return;
|
||||||
|
|
||||||
|
// Skip all actions if currently in an animation
|
||||||
|
if (p.rotationTransition || p.showCompletionEffect) {
|
||||||
|
if (action === 'pause') {
|
||||||
|
togglePause();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
switch(action) {
|
switch(action) {
|
||||||
case 'left':
|
case 'left':
|
||||||
p.moveLeft();
|
p.moveLeft();
|
||||||
|
@ -2366,6 +2357,10 @@ function handleControllerAction(action) {
|
||||||
case 'down':
|
case 'down':
|
||||||
p.moveDown();
|
p.moveDown();
|
||||||
break;
|
break;
|
||||||
|
case 'up':
|
||||||
|
case 'hardDrop':
|
||||||
|
p.hardDrop();
|
||||||
|
break;
|
||||||
case 'rotateLeft':
|
case 'rotateLeft':
|
||||||
p.rotate('left');
|
p.rotate('left');
|
||||||
break;
|
break;
|
||||||
|
@ -2378,12 +2373,6 @@ function handleControllerAction(action) {
|
||||||
case 'mirrorV':
|
case 'mirrorV':
|
||||||
p.mirrorVertical();
|
p.mirrorVertical();
|
||||||
break;
|
break;
|
||||||
case 'hardDrop':
|
|
||||||
// Only perform hard drop if not in the middle of an animation
|
|
||||||
if (!p.rotationTransition && !p.showCompletionEffect) {
|
|
||||||
p.hardDrop();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 'pause':
|
case 'pause':
|
||||||
togglePause();
|
togglePause();
|
||||||
break;
|
break;
|
||||||
|
@ -2428,12 +2417,21 @@ function control(event) {
|
||||||
if (gameOver) return;
|
if (gameOver) return;
|
||||||
if (paused && event.keyCode !== 80) return; // Allow only P key if paused
|
if (paused && event.keyCode !== 80) return; // Allow only P key if paused
|
||||||
|
|
||||||
|
// Skip all actions if currently in an animation
|
||||||
|
if (p.rotationTransition || p.showCompletionEffect) {
|
||||||
|
if (event.keyCode === 80) { // P key for pause still works
|
||||||
|
togglePause();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
switch(event.keyCode) {
|
switch(event.keyCode) {
|
||||||
case 37: // Left arrow
|
case 37: // Left arrow
|
||||||
case 65: // A key
|
case 65: // A key
|
||||||
p.moveLeft();
|
p.moveLeft();
|
||||||
break;
|
break;
|
||||||
case 38: // Up arrow - no function
|
case 38: // Up arrow
|
||||||
|
p.hardDrop();
|
||||||
break;
|
break;
|
||||||
case 39: // Right arrow
|
case 39: // Right arrow
|
||||||
case 68: // D key
|
case 68: // D key
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue