gpt4 book ai didi

javascript - 如何使用javascript创建移动的赛道?

转载 作者:行者123 更新时间:2023-12-01 02:56:32 28 4
gpt4 key购买 nike

我一直在尝试使用 JavaScript 和 Canvas 创建一款经典的赛车游戏。

这是 JavaScript 部分(car_race.js)我能够创建一条正在移动的轨道,但它并不像应有的那么现实。现在写下发生的情况是,如果一个边界条完全消失,那么只有它出现在 Canvas 的顶部。我想要做的是,当一个边界栏从上到下穿过整个 Canvas 时,我希望它从顶部恢复,并从 Canvas 底部消失的主体量。谁能帮我完成这部分。

var carRaceTrack = document.getElementById('carraceCanvas');
var carRaceTrackContext = carRaceTrack.getContext('2d');
var boundryWidth = 10;
var boundryHeight = 80;
var boundryTopOffSet = 5;
var boundryLeftOffSet = 402;
var boundryPadding = 8;

setInterval(draw, 0.5);

var leftBoundry = [];
var rightBoundry = [];

for (x = 0; x < 6; x++) {
leftBoundry[x] = {
OffSet: 0,
topOffSet: 0,
width: 0,
height: 0
};
}

for (x = 0; x < 6; x++) {
rightBoundry[x] = {
OffSet: 0,
topOffSet: 0,
width: 0,
height: 0
};
}
var x = 5;

function draw() {
drawCanvas(400, 0, carRaceTrack.width, carRaceTrack.height, 'black');
x++;
if (x > carRaceTrack.height) {
x = boundryTopOffSet;
}

//drawBoundryandCanvas(boundryLeftOffSet, x, boundryWidth, boundryHeight, 'white');
//drawBoundryandCanvas(boundryLeftOffSet, y, boundryWidth, boundryHeight, 'white');
for (i = 0; i < leftBoundry.length; i++) {
leftBoundry[i].OffSet = boundryLeftOffSet;
leftBoundry[i].width = boundryWidth;
leftBoundry[i].height = boundryHeight;
if (i == 0) {
leftBoundry[i].topOffSet = x;
} else {
leftBoundry[i].topOffSet = leftBoundry[i - 1].topOffSet + boundryHeight + boundryPadding;
}
if (leftBoundry[i].topOffSet > carRaceTrack.height) {
leftBoundry[i].topOffSet = boundryTopOffSet;
}
//console.log(boundry[i].topOffSet);
drawBoundry(leftBoundry[i], 'white');
}

for (i = 0; i < rightBoundry.length; i++) {
rightBoundry[i].OffSet = boundryLeftOffSet - 4 + 440;
rightBoundry[i].width = boundryWidth;
rightBoundry[i].height = boundryHeight;
if (i == 0) {
rightBoundry[i].topOffSet = x;
} else {
rightBoundry[i].topOffSet = rightBoundry[i - 1].topOffSet + boundryHeight + boundryPadding;
}
if (rightBoundry[i].topOffSet > carRaceTrack.height) {
rightBoundry[i].topOffSet = boundryTopOffSet;
}
//console.log(boundry[i].topOffSet);
drawBoundry(rightBoundry[i], 'white');
}

}

function drawBoundry(x, elementColor) {
carRaceTrackContext.fillStyle = elementColor;
carRaceTrackContext.fillRect(x.OffSet, x.topOffSet, x.width, x.height);
}


function drawCanvas(posX, posY, width, height, elementColor) {
carRaceTrackContext.fillStyle = elementColor;
carRaceTrackContext.fillRect(posX, posY, width, height);
}
This is the html part. Here i am creating canvas and using car_race.js file i am accessing canvas object.   

<html>
<canvas id="carraceCanvas" width="850" height="550"></canvas>
<script type="text/javascript" src="car_race.js"></script>

</html>

最佳答案

您需要在两侧添加更多矩形(8 个而不是 6 个),并允许顶部矩形具有负 Y 坐标,以便它(部分)隐藏。

然后,当您向下移动这些矩形时,检测您何时移动了一个此类矩形的距离(加上填充):这意味着您已经可以返回到初始情况并重复。

使用 requestAnimationFrame 而不是 setInterval (无论如何,毫秒数都太小) .

这是您的改编代码(我无法帮助修复拼写错误,并使属性名称以小写字母开头):

var carRaceTrack = document.getElementById('carraceCanvas');
var carRaceTrackContext = carRaceTrack.getContext('2d');
var boundaryWidth = 10;
var boundaryHeight = 80;
var boundaryTopOffset = 5;
var boundaryLeftOffset = 2; // for snippet purpose I reduced this. Original = 402
var boundaryPadding = 8;

window.requestAnimationFrame(draw); // better use this for animations

var leftBoundary = [];
var rightBoundary = [];

for (x = 0; x < 8; x++) { // We need two more
leftBoundary[x] = {
offset: boundaryLeftOffset,
topOffset: 0,
width: boundaryWidth,
height: boundaryHeight
};
}

for (x = 0; x < 8; x++) {
rightBoundary[x] = {
offset: boundaryLeftOffset - 4 + 440,
topOffset: 0,
width: boundaryWidth,
height: boundaryHeight
};
}
var cycle = 0,
totalCycle = boundaryHeight + boundaryPadding;

function draw() {
drawCanvas(boundaryLeftOffset-2, 0, carRaceTrack.width, carRaceTrack.height, 'black');
// Use modulo operator for resetting to 0 when cycle is complete:
cycle = (cycle + 1) % totalCycle;
// Avoid code repetition: loop over the two boundary arrays:
for (boundary of [leftBoundary, rightBoundary]) {
for (i = 0; i < boundary.length; i++) {
// Note that we put the first one at a negative coordinate!
boundary[i].topOffset = cycle + (i-1) * totalCycle;
drawBoundary(boundary[i], 'white');
}
}
// Repeat
window.requestAnimationFrame(draw);
}

function drawBoundary(x, elementColor) {
carRaceTrackContext.fillStyle = elementColor;
carRaceTrackContext.fillRect(x.offset, x.topOffset, x.width, x.height);
}


function drawCanvas(posX, posY, width, height, elementColor) {
carRaceTrackContext.fillStyle = elementColor;
carRaceTrackContext.fillRect(posX, posY, width, height);
}
<canvas id="carraceCanvas" width="450" height="550"></canvas>

请注意,我调整了左侧偏移,因此它更适合此片段。

关于javascript - 如何使用javascript创建移动的赛道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46673977/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com