XNA / MonoGame塔防从塔上射出弹丸?

时间:2014-08-29 06:36:43

标签: c# xna

我有以下方法:

private void TryShoot(Tower t)
{
    double x1 = (GameMap.GetMapSquare(t).X * TILE_SIZE) + (TILE_SIZE / 4); // center location of square
    double y1 = (GameMap.GetMapSquare(t).Y * TILE_SIZE) + (TILE_SIZE / 4);
    foreach (Monster m in GameWave.Sent)
    {
        double x2 = GameMap.Path[m.PathLocation].X * TILE_SIZE + (TILE_SIZE / 4); // center location of monster
        double y2 = GameMap.Path[m.PathLocation].Y * TILE_SIZE + (TILE_SIZE / 4);
        double distance = Math.Sqrt((Math.Pow((x2 - x1), 2)) + (Math.Pow((y2 - y1), 2)));
        if (Math.Abs(distance) < t.Range)
        {
            // TODO: Shoot logic

            SpriteBatch.Draw(BulletTexture, new Rectangle((int)x1, (int)y1, 32, 32), Color.White);


            SpriteBatch.Draw(BulletTexture, new Rectangle((int)x1, (int)y1, 32, 32), Color.White);

            t.Shoot(m);
            if (m.Health <= 0)
            {
                Player.Gold += m.Worth;
                GameWave.Monsters.Remove(m);
            }
            break;
        }
    }
}

在那之后,TODO声明就是拍摄射弹逻辑应该发生的地方。 x1y1是mapSquare对象中心方块的位置。

x2y2是mapSquare对象上敌人位置中心方块的位置。

这是一只鸟精灵被塔上的“子弹”击中,也是该子弹击中的地方。

http://puu.sh/bcpxR.png

使用一堆If else语句和while循环进行检查很难看。必须有一种更有效的方法,如果是这样,怎么样? 我想模拟从A点移动到B点的子弹(while循环应该在理论上起作用,但它仍然只是传送而不是移动)

http://pastebin.com/4P05XgaD (丑陋的代码)

谢谢!

1 个答案:

答案 0 :(得分:0)

不要混合更新和绘制功能。要解决您的问题,您需要4个功能。

初始子弹:简单的功能,它将初始化子弹并将其添加到子弹列表(起始位置,速度,isEnemyBullet,子弹类型......)这个被称为单次,仅当敌人或者玩家射击子弹。

更新子弹:被调用的函数并循环子弹列表并按速度增加位置

绘制子弹:循环子弹并绘制它们的函数。

碰撞测试:在敌人和子弹上循环并检查碰撞的功能