我有以下方法:
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声明就是拍摄射弹逻辑应该发生的地方。
x1
和y1
是mapSquare对象中心方块的位置。
x2
和y2
是mapSquare对象上敌人位置中心方块的位置。
这是一只鸟精灵被塔上的“子弹”击中,也是该子弹击中的地方。
使用一堆If else语句和while循环进行检查很难看。必须有一种更有效的方法,如果是这样,怎么样? 我想模拟从A点移动到B点的子弹(while循环应该在理论上起作用,但它仍然只是传送而不是移动)
http://pastebin.com/4P05XgaD (丑陋的代码)
谢谢!
答案 0 :(得分:0)
不要混合更新和绘制功能。要解决您的问题,您需要4个功能。
初始子弹:简单的功能,它将初始化子弹并将其添加到子弹列表(起始位置,速度,isEnemyBullet,子弹类型......)这个被称为单次,仅当敌人或者玩家射击子弹。
更新子弹:被调用的函数并循环子弹列表并按速度增加位置
绘制子弹:循环子弹并绘制它们的函数。
碰撞测试:在敌人和子弹上循环并检查碰撞的功能