// © Головин Г.Г., Обработка действий пользователя, 2023 'use strict'; // коды кнопок на клавиатуре const KEY = {PAUSE:19,SPACE:32,LEFT:37,UP:38,RIGHT:39,DOWN:40}; // типы объёмного изображения const VOLUME = {FLAT:0,PARALLEL:1,PERSPECTIVE:2}; // текущий тип изображения let vol = VOLUME.FLAT; // кнопка нажата и удерживается function keyPressed(caller) { if (status == GAME.OVER) return; switch (caller.keyCode) { case KEY.PAUSE: { status = GAME.PAUSE; statusView.refresh(); return; } case KEY.LEFT: { caller.preventDefault(); moveFigureLeft(); break; } case KEY.RIGHT: { caller.preventDefault(); moveFigureRight(); break; } case KEY.SPACE: case KEY.UP: { caller.preventDefault(); rotateFigure(); break; } case KEY.DOWN: { caller.preventDefault(); rapidFall = true; if (sleepTimeout != undefined) { clearTimeout(sleepTimeout); stepDown(); } break; } default: { break; } } if (status == GAME.LEVEL || status == GAME.PAUSE) { status = GAME.RUN; setTimeout(figureFall, 60); } } // кнопка отпущена function keyReleased(caller) { if (caller.keyCode == KEY.DOWN) { rapidFall = false; } } // изменить количество строк function changeRows(caller) { rows = caller.target.valueAsNumber; container.changeSize(); t0.reCalc(); tv2.reCalc(); refreshParams(); prepareNewGame(); } // изменить количество колонок function changeColumns(caller) { columns = caller.target.valueAsNumber; container.changeSize(); t0.reCalc(); tv2.reCalc(); refreshParams(); prepareNewGame(); } // переключить режим улитки function changeSnailMode(caller) { if (caller.target.checked) reduction=REDUCTION_SNAIL; else reduction=REDUCTION_STEP; } // изменить тип объёмного изображения function changeVolume(caller) { const value = caller.target.value; const old = vol; if (value=="off") vol=VOLUME.FLAT; if (value=="parallel") vol=VOLUME.PARALLEL; if (value=="perspective") vol=VOLUME.PERSPECTIVE; refreshDisabled(); repaint(false); } // изменяем прозрачность фигур function changeAlpha(caller) { colors.alpha=caller.target.valueAsNumber; } // поворачиваем кубики, изменяем текущий угол function rotate(axis, caller) { deg[axis] = caller.target.valueAsNumber; prepare3D(); } // вертикальная корректировка function changeTv1(caller) { tv1.y = caller.target.valueAsNumber; } // центральная точка на экране наблюдателя function changeTv2(axis, caller) { tv2[axis] = caller.target.valueAsNumber; } // удалённость источника проекции function changeDistance2(caller) { d2=caller.target.valueAsNumber; } // двигать центральную точку function showCenter(caller) { tv2.show=!tv2.show; } // обновить игру и все настройки function reload() { vol=VOLUME.FLAT; field3D=[]; colors.setDefault(); deg.setDefault(); tv1.reCalc(); tv2.reCalc(); reduction=REDUCTION_STEP; prepareNewGame(); refreshParams(); } // обновить отображение параметров function refreshParams() { document.getElementById('speedometer').value=0; document.getElementById('snail').checked=(reduction==REDUCTION_SNAIL); document.getElementById('alpha').value=colors.alpha; document.getElementById('oAlpha').value=colors.alpha + '%'; document.getElementById('off').checked=(vol==VOLUME.FLAT); document.getElementById('parallel').checked=(vol==VOLUME.PARALLEL); document.getElementById('perspective').checked=(vol==VOLUME.PERSPECTIVE); document.getElementById('rotateX').value = deg.x; document.getElementById('rotateXo').value = deg.x + '°'; document.getElementById('rotateY').value = deg.y; document.getElementById('rotateYo').value = deg.y + '°'; document.getElementById('rotateZ').value = deg.z; document.getElementById('rotateZo').value = deg.z + '°'; document.getElementById('tv1Y').value = tv1.y; document.getElementById('tv1Yo').value = tv1.y; document.getElementById('center').checked = tv2.show; document.getElementById('tv2X').max = container.canvas.width; document.getElementById('tv2X').value = tv2.x; document.getElementById('tv2Xo').value = tv2.x; document.getElementById('tv2Y').max = container.canvas.height; document.getElementById('tv2Y').value = tv2.y; document.getElementById('tv2Yo').value = tv2.y; document.getElementById('tv2Z').max = d2/2; document.getElementById('tv2Z').value = tv2.z; document.getElementById('tv2Zo').value = tv2.z; document.getElementById('dist').max = d2max; document.getElementById('dist').value = d2; document.getElementById('oDist').value = d2; refreshDisabled(); } // обновить доступность блоков function refreshDisabled() { document.getElementById('rotateX').disabled=(vol==VOLUME.FLAT); document.getElementById('rotateY').disabled=(vol==VOLUME.FLAT); document.getElementById('rotateZ').disabled=(vol==VOLUME.FLAT); document.getElementById('tv1Y').disabled=(vol!=VOLUME.PARALLEL); document.getElementById('center').disabled=(vol!=VOLUME.PERSPECTIVE); document.getElementById('tv2X').disabled=(vol!=VOLUME.PERSPECTIVE); document.getElementById('tv2Y').disabled=(vol!=VOLUME.PERSPECTIVE); document.getElementById('tv2Z').disabled=(vol!=VOLUME.PERSPECTIVE); document.getElementById('dist').disabled=(vol!=VOLUME.PERSPECTIVE); } // после загрузки всех частей страницы document.addEventListener('DOMContentLoaded', function() { refreshParams(); });