我正在尝试使用矩阵而不是精灵在JS中编写俄罗斯方块游戏,以便更好地可视化2D数组。
我通过转置其矩阵数据然后反转行来旋转一个块。 但由于块的宽度和高度不能完全填充这个4x4的矩阵, 旋转导致块移动,而不是在原地旋转。
我无法解决这个问题,已经花了两天以上的时间尝试让这个简单的游戏工作,并重新开始了几次。 我需要帮助,我真的想学会编程游戏,唯一能成功的就是井字棋,但我花在上面的时间比应该多得多。
以下是完整的JS代码。单击画布旋转方块。
请忽略我代码中的小问题,我是自学编程的。
提前感谢您的帮助 :)
我通过转置其矩阵数据然后反转行来旋转一个块。 但由于块的宽度和高度不能完全填充这个4x4的矩阵, 旋转导致块移动,而不是在原地旋转。
我无法解决这个问题,已经花了两天以上的时间尝试让这个简单的游戏工作,并重新开始了几次。 我需要帮助,我真的想学会编程游戏,唯一能成功的就是井字棋,但我花在上面的时间比应该多得多。
以下是完整的JS代码。单击画布旋转方块。
var canvas = document.getElementById('c');
var ctx = canvas.getContext('2d');
canvas.width = 400;
canvas.height = 600;
// game object
var G = {};
var current = 0;
var x = 0;
var y = 0;
//GRID
G.grid = [];
G.gridColumns = 10;
G.gridRows = 15;
for (var i = 0; i < G.gridColumns; i++) {
G.grid[i] = [];
for (var j = 0; j < G.gridRows; j++) {
G.grid[i][j] = 0;
}
}
// Array with all different blocks
G.blocks = [];
//block constructor
function block() {};
G.blocks[0] = new block();
G.blocks[0].matrix = [
[1, 0, 0, 0],
[1, 1, 0, 0],
[0, 1, 0, 0],
[0, 0, 0, 0]
];
G.blocks[0].width = 2;
G.blocks[0].height = 3;
function transpose(m) {
// dont understand this completely, but works because j<i
for (var i = 0; i < m.matrix.length; i++) {
for (var j = 0; j < i; j++) {
var temp = m.matrix[i][j];
m.matrix[i][j] = m.matrix[j][i];
m.matrix[j][i] = temp;
}
}
}
function reverseRows(m) {
for (var i = 0; i < m.matrix.length; i++) {
m.matrix[i].reverse();
}
}
function rotate(m) {
transpose(m);
reverseRows(m);
}
function add(m1, m2) {
for (var i = 0; i < m1.matrix.length; i++) {
for (var j = 0; j < m1.matrix[i].length; j++) {
m2[i + x][j + y] = m1.matrix[i][j];
}
}
}
function draw(matrix) {
for (var i = 0; i < matrix.length; i++) {
for (var j = 0; j < matrix[i].length; j++) {
if (matrix[i][j] === 1) {
ctx.fillRect(j * 20, i * 20, 19, 19);
}
}
}
ctx.strokeRect(0, 0, G.gridColumns * 20, G.gridRows * 20);
}
window.addEventListener("click", function(e) {
rotate(G.blocks[current]);
});
function tick() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
add(G.blocks[current], G.grid);
draw(G.grid);
}
setInterval(tick, 1000 / 30);
<canvas id="c"></canvas>