我正在制作一款小型RPG游戏,而我目前拥有的是:
*具有动画和基本碰撞的角色; *我测试碰撞的32x32盒子;
这就是现在...... xD
我的角色是32xPixels宽,48xPixels高,32x38。
我有两个矩形,playerRectangle
(用于碰撞和移动);
和rectangleAnimation
,用于角色动画。
嗯,我的问题是,我如何制作一个仅覆盖角色一半的碰撞矩形?现在我的矩形是32x48,所以我怎么做32x24,没有裁剪图像?
它给出了某种东西的幻觉,例如岩石或树木。
我尝试制作一个单独的精灵,它是32x24并制作了一个矩形,并在我的播放器类中画了两个精灵,但那不起作用......
我的最后一个问题,我应该为CollisionHandler.cs
做一个单独的课程,比如我的所有实物,比如墙壁和盒子吗?
这是播放器的移动代码(不试图制作不同大小的矩形):
if (keyState.IsKeyDown(Keys.Left))
{
playerRectangle.X -= playerSpeed;
movingLeft = true;
movingRight = false;
}
else if (keyState.IsKeyDown(Keys.Right))
{
playerRectangle.X += playerSpeed;
movingRight = true;
movingLeft = false;
}
if (keyState.IsKeyDown(Keys.Up))
{
playerRectangle.Y -= playerSpeed;
movingUp = true;
movingDown = false;
}
else if (keyState.IsKeyDown(Keys.Down))
{
playerRectangle.Y += playerSpeed;
movingDown = true;
movingUp = false;
}
(对不起,代码看起来很乱,我是这个网站的新手,我不知道如何构建它:/)
我的碰撞检查(在Game1.cs中):
if(isColliding())
{
if (player.movingRight)
{
player.playerRectangle.X -= player.playerSpeed;
}
else if (player.movingLeft)
{
player.playerRectangle.X += player.playerSpeed;
}
if (player.movingUp)
{
player.playerRectangle.Y += player.playerSpeed;
}
else if(player.movingDown)
{
player.playerRectangle.Y -= player.playerSpeed;
}
}
我在Game1.cs
中有一个名为“isColliding”的方法,它检查另一个类矩形和我的playerRectangle中的碰撞..
对不起,这太久了,但是提前谢谢你,告诉我你是否需要了解其他事情:)
答案 0 :(得分:2)
我会从脑子里写下来...将它添加到你的精灵类中,它将是通用的
public Rectangle BoundingBox
{
get { return new Rectangle((int)Position.X + offsetX, (int)Position.Y + offsetY, Texture.Width - offsetWidth, Texture.Height - offsetWidth); }
}
只需更改offsetX
,offsetY
,offsetWidth
,offSetHeight
即可调整碰撞框。所以如果你希望在左上角碰撞5x5像素。然后offsetX=0
,offestY=0
,offsetWidth=5
,offsetHeight=5
并碰撞代码
foreach (Sprite brick in bricklist)
{
if (player.BoundingBox.Intersects(brick.BoundingBox))
{
// do some stuff
}
}
答案 1 :(得分:1)
如果你想将玩家矩形的高度改为一半,你所要做的就是将playerRectangle.Y值除以2。
答案 2 :(得分:1)
使用Vector2.Distance(playerPosition,objectToCheck);
if(Vector2.Distance(playerPosition,objectToCheck < player.rectangle.width/2){
//If the player is too close to the object you wish to check
//Do something...
}
对于碰撞,我只是检查你的玩家的更新方法是否'他'与任何东西相撞 - 使用vector.distance ^^
你的运动逻辑很糟糕:
你应该使用速度。
var velocity = new Vector2(0,0); var moveSpeed = 5; //无论你想要什么
if(player presses right){
velocity.X += moveSpeed;
}
if(player presses up){
velocity.y += moveSpeed;
}
this.position + = velocity * Gametime.elapsedGametime; &LT;&LT;认为Gametime是正确的......
Var origin = new vector2(rectangle.width / 2,rectangle.height / 2);这会将精灵的原点设置为矩形的中心,而不是左上角。
假设我们有两个50x50的矩形...来检查你要做的两个之间的碰撞:
if(Vector2.Distance(rectangle1.position, rectangle2.position < rectangle1.width/2){
//If the distance between the two rectangles (from the middle of the rectangle(the origin we just set is less than then half of the width of the rectangle... we have a collision.
}
几个月内没有使用XNA,因此您可能需要更新类的更新方法中的原点...