Random XNA游戏编程:在一个圆圈中繁殖敌人(代码)

Random XNA游戏编程:在一个圆圈中繁殖敌人(代码),random,xna,geometry,spawning,Random,Xna,Geometry,Spawning,有人能给我一些关于如何在一个圆圈中繁殖敌人的指导吗(XNA编程) 我希望敌人沿着窗口边界外的圆周随机繁殖。我希望它们沿着直线穿过窗户的中心,然后向外移动到它们开始的另一侧(或者尽可能靠近) 理想情况下,这将创造一个环境,让敌人从各个方向随机出现 到目前为止,这是我的敌人(“坏人”)班。我在游戏状态下处理的位置。我现在所做的并没有真正起作用,所以任何帮助都将不胜感激 public class Baddies : Sprite { public enum State {

有人能给我一些关于如何在一个圆圈中繁殖敌人的指导吗(XNA编程)

我希望敌人沿着窗口边界外的圆周随机繁殖。我希望它们沿着直线穿过窗户的中心,然后向外移动到它们开始的另一侧(或者尽可能靠近)

理想情况下,这将创造一个环境,让敌人从各个方向随机出现

到目前为止,这是我的敌人(“坏人”)班。我在游戏状态下处理的位置。我现在所做的并没有真正起作用,所以任何帮助都将不胜感激

public class Baddies : Sprite
{
    public enum State
    {
        Inactive,
        SetupTraveling,
        Traveling,
        SetupInactive,
    }

    public State CurrentState
    {
        set
        {
            currentState = value;
            framesInStateCount = 0;
        }
        get
        {
            return currentState;
        }
    }

    int framesInStateCount = 0;
    State currentState = State.SetupInactive;    

    public Baddies()
    {
        Image = getImage("Bad");
        Scale = .2f;
        Rotation = 0f;
        DRotation = .05f;
        TurnedOn = true;
        BounceOn = false;
        WrapOn = false;
        Gravity = 0f;
    }

    public override void Update()
    {
        framesInStateCount++;
        switch (currentState)
        {
            case State.Inactive:
                if (RandOneIn(100)) CurrentState = State.SetupTraveling;
                break;
            case State.SetupTraveling:
                        PositionX = ((Game1.vGameWidth + 100)/2) * (float)Math.Cos(Glob.rnd(0.0, 2.0 * Math.PI));
                        PositionY = ((Game1.vGameHeight + 100)/2) * (float)Math.Sin(Glob.rnd(0.0, 2.0 * Math.PI));                        
                        DDPositionY = 0;
                        DPositionY = -1;
                        DPositionX = 1f;
                        DDPositionX = 0f;                          

                CurrentState = State.Traveling;
                break;
            case State.Traveling:
                if (PositionX > Game1.vGameWidth + (Image.Width / 2) * Scale)
                {
                    currentState = State.SetupInactive;
                }
                if (PositionX < -500f - (Image.Width / 2) * Scale)
                {
                    currentState = State.SetupInactive;
                }
                if (PositionY > Game1.vGameHeight + (Image.Height / 2) * Scale)
                {
                    currentState = State.SetupInactive;
                }
                if (PositionY < 0 - (Image.Height / 2) * Scale)
                {
                    currentState = State.SetupInactive;
                }
                break;
            case State.SetupInactive:
                PositionX = -300f;
                DPositionX = 0f;
                DPositionY = 0f;
                DDPositionX = 0f;
                CurrentState = State.Inactive;

                break;                
        }     

        base.Update();
    } 
}
public class坏人:精灵
{
公共枚举状态
{
不活跃的
旅行,,
旅游,
设置为非活动,
}
公共状态当前状态
{
设置
{
当前状态=值;
framesInStateCount=0;
}
收到
{
返回电流状态;
}
}
int framesInStateCount=0;
State currentState=State.SetupInactive;
公众坏人()
{
Image=getImage(“坏”);
比例=.2f;
旋转=0f;
DRotation=.05f;
TurnedOn=正确;
BounceOn=false;
WrapOn=false;
重力=0f;
}
公共覆盖无效更新()
{
framesInStateCount++;
开关(当前状态)
{
案例状态。非活动:
如果(RandOneIn(100))CurrentState=State.SetupTraveling;
打破
案例状态.SetupTraveling:
PositionX=((Game1.vGameWidth+100)/2)*(float)Math.Cos(Glob.rnd(0.0,2.0*Math.PI));
PositionY=((Game1.vGameHeight+100)/2)*(float)Math.Sin(Glob.rnd(0.0,2.0*Math.PI));
ddy=0;
DPositionY=-1;
DPositionX=1f;
ddx=0f;
CurrentState=State.Traveling;
打破
案件状态:旅行:
如果(位置x>Game1.vGameWidth+(Image.Width/2)*比例)
{
currentState=State.SetupInactive;
}
如果(位置X<-500f-(图像宽度/2)*比例)
{
currentState=State.SetupInactive;
}
如果(位置Y>Game1.vGameHeight+(Image.Height/2)*比例)
{
currentState=State.SetupInactive;
}
如果(位置Y<0-(图像高度/2)*比例)
{
currentState=State.SetupInactive;
}
打破
case State.SetupInactive:
位置X=-300f;
DPositionX=0f;
DPositionY=0f;
ddx=0f;
CurrentState=State.Inactive;
打破
}     
base.Update();
} 
}
这个怎么样:

  • 决定你圈子里的雷迪乌斯是什么,叫它r
  • 从[-r,r]生成X值
  • Y=sqrt(r^2-X^2)
  • 随机设置Y为Y或-Y。你的坐标是X,Y
  • 这个怎么样:

  • 决定你圈子里的雷迪乌斯是什么,叫它r
  • 从[-r,r]生成X值
  • Y=sqrt(r^2-X^2)
  • 随机设置Y为Y或-Y。你的坐标是X,Y

  • 其他三角法:

  • 决定你的圆半径是多少。。。通常是:

    raqdius = sqrt(Viewport.Size.Width^2 + Viewport.Size.Height^2) / 2;
    
  • 生成一个随机角度

    angle = (float) Random.NextDouble() * MathHelper.PI * 2; 
    
  • 你的座标是

    x = ViewPort.Center.X + radius * Math.Cos(angle);
    y = ViewPort.Center.Y + radius * Math.Sin(angle);
    

  • 三角法的其他方法:

  • 决定你的圆半径是多少。。。通常是:

    raqdius = sqrt(Viewport.Size.Width^2 + Viewport.Size.Height^2) / 2;
    
  • 生成一个随机角度

    angle = (float) Random.NextDouble() * MathHelper.PI * 2; 
    
  • 你的座标是

    x = ViewPort.Center.X + radius * Math.Cos(angle);
    y = ViewPort.Center.Y + radius * Math.Sin(angle);
    

  • 我认为这是一个比我的更好的方法谢谢。我该如何让每个精灵朝着圆的中心移动,而不管它是在哪里诞生的?(速度在我的程序中由dppositiony和dppositionx变量处理)。方向向量是(目标-源),目标似乎是视口。在本例中居中,然后将其规格化,并将其乘以标量速度因子。谢谢。我试过了,但我得到了一个奇怪的错误:我认为这是一个比我的更好的方法谢谢。我该如何让每个精灵朝着圆的中心移动,而不管它是在哪里诞生的?(速度在我的程序中由dppositiony和dppositionx变量处理)。方向向量是(目标-源),目标似乎是视口。在本例中居中,然后将其规格化,并将其乘以标量速度因子。谢谢。我试过了,但发现一个奇怪的错误: