Edit2:请参阅下面的新问题。
我正在创建一个Windows Phone 7游戏并遇到了一些困难。我要做的是使用转换为弧度的触摸屏坐标以一定角度向上发射物体。那部分工作正常。
然而,我无法弄清楚如何使物体从侧壁反弹。我让它在早期的实现中工作,这只是在与墙碰撞时否定Y值的问题。不幸的是,这次并不容易。当物体撞击墙壁时,它会从墙壁反弹一小段距离,然后再向墙壁改变方向。
我如何构建我的代码,以便它不再被推到墙上?
谢谢。
//Move bubble
public void MoveBubble(Bubble b, double radians)
{
if (b.stop == false)
{
{
//Move bubble 'up'
Y = (float)(speed * Math.Cos(radians));
X = (float)(speed * Math.Sin(radians));
}
b.bubblePosX += X;
b.bubblePosY += Y;
//Problem area
if(b.bubblePosY <= 0)
Y-=Y;
if(b.bubblePosY >= 350)
Y-=Y;
}
//Calculate Angle
private void CalculateAngle(int touchX, int touchY)
{
radians = (Math.Atan2(touchX - bubbleStart.X, touchY - bubbleStart.Y));
}
Edit2:只想添加最新代码。现在球完全从墙上反弹了,但我有一个方向bool被初始化为真的问题。有时,在射击物体时,角度会反转。如何将初始bool设置为适当的true / false值?
//Move bubble
public void MoveBubble(Bubble bubble, Vector2 distance)
{
if (bubble.stop == false)
{
float velocityX = speed * distance.X;
float velocityY = speed * distance.Y;
bubble.X += velocityX;
if (direction == true)
bubble.Y += velocityY;
if (direction == false)
bubble.Y -= velocityY;
if (bubble.Y <= 0)
direction = !direction;
if (bubble.Y >= 350)
direction = !direction;
}
}
答案 0 :(得分:2)
你不是否定Y值,你只是从它自身中减去它的价值。也许你打算写:
Y = -Y;
或者我错过了什么?
答案 1 :(得分:1)
你没有扭转泡沫运动的方向。最合适的解决方案是在那一刻改变方向:
public void MoveBubble(Bubble b, double radians)
{
if (b.stop == false)
{
{
//Move bubble 'up'
Y = (float)(speed * Math.Cos(radians));
X = (float)(speed * Math.Sin(radians));
}
b.bubblePosX += X;
//Problem area
if(b.bubblePosY <= 0 || b.bubblePosY >= 350)
b.bubblePosY -= Y;
else
b.bubblePosY += Y;
}
}
这部分代码会向下移动泡泡仅用于下一帧,为了让泡沫完全改变其运动方向,你将不得不重新计算弧度,以获得泡沫发现碰撞的点和旧触摸分。
在简历中,在每个碰撞点,你必须重新计算你的泡泡的方向,如果你的目标,你可以解决整个问题,反映碰撞的方向。
我正在寻找一些代码,但我发现我已经失去了它,但我希望mi的解释能有所帮助。
见到你
答案 2 :(得分:0)
您必须更改位置和速度。
如果你的位置为(0,-1)且速度为(1,-1)并且你不能有负值,你必须切换y值(以弥补速度) )到(0,1)并将速度改为负值(1,1)。
所以,loc(ation)和vel(ocity)必须改变,例如:
loc(0, 1), vel(0, -1) // OK
loc(0, 0), vel(0, -1) // switch vel to y=-y; (so -1 becomes 1)
loc(0, -2), vel(1, -3) // switch loc to it's positive value, loc(0, 2)
// and the vel to it's opposite (1, 3)
loc(-1, -3), vel(-2, -4) // loc is set to (1, 3) an vel to (2, 4)
// since both X and Y have been breached
答案 3 :(得分:0)
这样做(假设X和Y是速度):
if(b.bubblePosY <= 0 && Y < 0)
Y = -Y;
if(b.bubblePosY >= 350 && Y > 0)
Y = -Y;
您的代码中发生的事情是您的气泡卡在墙上。上面的代码只反映了气泡移动到墙上的方向。一旦它移出墙壁,就会忽略那堵墙。
此外,不是根据位置差异计算角度然后将其转换回方向向量,而是尝试简单地将位置差异归一化以获得方向向量(单位向量;长度= 1):
Vector2.Normalize(new Vector2(touchX - bubbleStart.X, touchY - bubbleStart.Y))
你应该在帧之间存储速度矢量或方向矢量,这样当你反映你的气泡时它就会朝着那个方向前进,直到它再次被反射。