gpt4 book ai didi

javascript - HTML5 游戏 - 行走边界问题

转载 作者:行者123 更新时间:2023-11-28 03:35:49 24 4
gpt4 key购买 nike

我正在开发一个自上而下的射击游戏,基本上 Angular 色从屏幕中间开始,在一个矩形(安全区)内。人物不是静止的,场景是。他可以在安全区内四处走动。一旦 Angular 色走出这个区域,静态就会切换…… Angular 色是静态的,场景在他周围移动。

唯一的问题是我不能走回安全区,让我的静力学再次切换。

所以我永远被困在区域之外。我所做的只是检查我的 Angular 色位置是否在某个值(即矩形)内,如果他不在 - 然后我的 KeyControls 会影响 map ,而不是 Angular 色。

所以这是我的边界(安全区)检查器:

//Walking Window Boundaries
var boundarySizeX = 400;
var boundarySizeY = 200;

ctxWalkBoundary.fillStyle = "grey";
ctxWalkBoundary.fillRect(gameWidth/2 - boundarySizeX/2, gameHeight/2 - boundarySizeY/2, boundarySizeX, boundarySizeY);
ctxWalkBoundary.clearRect((gameWidth/2 - boundarySizeX/2) + 2, (gameHeight/2 - boundarySizeY/2) + 2, (boundarySizeX) - 4, (boundarySizeY) -4 );

var paddingLeft = (gameWidth - boundarySizeX) / 2;
var paddingRight = gameWidth - ((gameWidth - boundarySizeX) / 2) - this.charWidth;
var paddingTop = (gameHeight - boundarySizeY) / 2;
var paddingBottom = gameHeight - ((gameHeight - boundarySizeY) / 2) - this.charHeight;

var paddingY = (gameHeight - boundarySizeY) / 2;

if(this.drawX > paddingLeft && this.drawX < paddingRight && this.drawY > paddingTop && this.drawY < paddingBottom){
inBoundary = true;
}
else{
inBoundary = false;
console.debug("Out Of Boundary!");
}

这是我的 KeyChecker:

//UP
if(this.isUpKey){

//Character movement
if(inBoundary){
this.drawX = this.drawX + this.speed * Math.cos((this.characterRotation));
this.drawY = this.drawY + this.speed * Math.sin((this.characterRotation));
}
else{
mapPositionX = mapPositionX - this.speed * Math.cos((this.characterRotation));
mapPositionY = mapPositionY - this.speed * Math.sin((this.characterRotation));
}

我的 Angular 色总是面对我的鼠标(旋转)。所以每次用户按下 W 或 Up - Angular 色总是会走向鼠标位置。

有什么办法可以让我回到状态吗?

-----更新-----

我想我需要以某种方式检查我是否仍面向安全区外 - 如果不是,则反转他的静力学。

最佳答案

只需分开两件事: map 和 View 。

map 是你的关卡,你在那里保存带有坐标的对象。 View 是您在屏幕上看到的 map 的一部分。 View 有 4 个属性:x、y、宽度和高度,其中宽度和高度最有可能是您的 Canvas 大小。

如果您的游戏从屏幕中间的 map 点 (0,0) 开始,那么您的 View (x,y) 坐标应该是 (-view.width/2, -view.height/2)。

如何在 View 中绘制 Angular 色和对象?

首先,只绘制 View 矩形中的东西。所以遍历所有对象并检查是否

object.x >= view.x && object.x <= view.x + view.width && object.y >= view.y && object.y <= view.y + view.height

(您可能也应该考虑对象边界)。

如果对象在 View 区域中,则将其绘制在位置(object.x - view.x, object.y - view.y)。这就是画画的全部内容。

和他一起移动 Angular 色和视野。

现在当你的 Angular 色与边界发生碰撞时,例如(与右边界发生碰撞)

character.x >= view.x + view.width

然后通过将 view.x 增加一些值(可能是 character.width/2)来将 View 向右移动。

-- 更新 --

我看到你没有在你的游戏中使用 OOP(实际上你是因为 JS 中的一切都是对象,但你不是故意使用它)。

JS 中的 OOP 解释很多,所以我会尽量简短。

您可以使用 JSON 格式制作 Angular 色、 map 和 View 等对象。

character = {
x: 0,
y: 0,
xspeed: 0,
yspeed: 0,
speed: 0,
radius: 20,
}

map = {
objects: [
{sprite: 'tree.jpg', x: 100, y: 50},
{sprite: 'stone.jpg', x: 20, y: 30},
],
}

view = {
width: canvas.width,
height: canvas.height,
x: -this.width/2,
y: -this.height/2,
}

这些是您可以像这样在函数中使用的对象:

for (var i=0; i++, i<map.objects.length) {
if (map_obj.x >= view.x && map_obj.x <= view.x + view.width && map_obj.y >= view.y && map_obj.y <= view.y + view.height) {
var map_obj = map.objects[i];
draw_sprite(map_obj.sprite, map_obj.x - view.x, map_obj.y - view.y);
}
}

这不是最好的方法,但它仍然比你现在的方法好得多。当您了解 OOP 是什么时,您将使其变得更适合您自己。

关于javascript - HTML5 游戏 - 行走边界问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14469772/

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