Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XNA中的动画_C#_Animation_Xna - Fatal编程技术网

C# XNA中的动画

C# XNA中的动画,c#,animation,xna,C#,Animation,Xna,我有以下代码: public class Area { Texture2D point; Rectangle rect; SpriteBatch _sB; GameTimer _gt; int xo, yo, xt, yt; //List<Card> _cards; public Area(Texture2D point, SpriteBatch sB) { this.point = p

我有以下代码:

        public class Area
{
    Texture2D point;
    Rectangle rect;
    SpriteBatch _sB;
    GameTimer _gt;
    int xo, yo, xt, yt;
    //List<Card> _cards;

    public Area(Texture2D point, SpriteBatch sB)
    {
        this.point = point;
        this._sB = sB;
        xt = 660;
        yt = 180;
        xo = 260;
        yo = 90;
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        rect = new Rectangle(660, 180, 80, 120);
        spriteBatch.Draw(point, rect, Color.White);

        _gt = new GameTimer();
        _gt.UpdateInterval = TimeSpan.FromSeconds(0.1);
        _gt.Draw += OnDraw;
    }

    private void OnDraw(object sender, GameTimerEventArgs e)
    {
        this.pass(xo, yo);
        if (xo != xt) xo += (xt > xo) ? 10 : -10;
        if (yo != yt) yo += (yt > yo) ? 10 : -10;
    }

    public void pass(int x, int y)
    {
        rect = new Rectangle(x, y, 80, 120);
        _sB.Draw(point, rect, Color.Black);
    }
}
公共类区域
{
纹理2d点;
矩形矩形;
SpriteBatch_sB;
游戏计时器gt;
int-xo,yo,xt,yt;
//列出"信用卡",;
公共区域(纹理2D点、SpriteBatch sB)
{
这个点=点;
这个;
xt=660;
yt=180;
xo=260;
yo=90;
}
公共作废抽签(SpriteBatch SpriteBatch)
{
rect=新矩形(660、180、80、120);
spriteBatch.Draw(点、矩形、颜色、白色);
_gt=新游戏计时器();
_gt.UpdateInterval=时间跨度(从秒开始)(0.1);
_gt.Draw+=OnDraw;
}
私有void OnDraw(对象发送方,GameTimerEventArgs e)
{
这个。通过(xo,yo);
如果(xo!=xt)xo+=(xt>xo)?10:-10;
如果(yo!=yt)yo+=(yt>yo)?10:-10;
}
公共无效通行证(整数x,整数y)
{
rect=新矩形(x,y,80,120);
_某人画(点、直线、颜色、黑色);
}
}
所以,我不明白怎么了。这是我在XNA的第一个项目,因此可能会有愚蠢的错误:)

另外,对不起。有一个带有坐标(xt,yt)的矩形,我需要动画将矩形移动到(xo,yo)


p.p.S.我添加了带更正的完整类,因为我不理解我的错误。

您正在一帧中绘制整个动画。你应该用不同的x,y从OnDraw调用Pass

编辑:

1) 您不需要计时器,游戏类中的draw方法默认为每秒60帧

2) 秒数参数应计算为(float)gametime.ElapsedTime.TotalSeconds

float time;
int xt=660, yt=180;
int xo=260, yo=90;

public void Draw(SpriteBatch spriteBatch, float Seconds)
{
    rect = new Rectangle(660, 180, 80, 120);
    spriteBatch.Draw(point, rect, Color.White);

    this.pass(xo, yo, spriteBatch);
    time+= Seconds;
    if (time>0.3)
    {
        if (xo!=xt) xo+= (xt>xo) ? 10 : -10;
        if (yo!=yt) yo+= (yt>yo) ? 10 : -10;
        time = 0;
    }
}

public void pass(int x, int y, spritebatch sb)
{
    rect = new Rectangle(x, y, 80, 120);
    sb.Draw(point, rect, Color.Red);
}
正如您应该知道的,此动画将以粗略模式移动。。。如果你想移动你的雪碧顺利。。。你可以用矢量2表示你的位置,用浮标表示你的速度

Vector2 Origin = new Vector2(260, 90);
Vector2 Target = new Vector2(660, 180);
Vector2 Forward = Vector2.Normalize(Target-Source);
float Speed = 100; // Pixels per second
float Duration = (Target - Origin).Length() / Speed;
float Time = 0;

public void Update(float ElapsedSecondsPerFrame)
{
   if (Time<Duration)
   {
      Time+=Duration;
      if (Time > Duration) {
          Time = Duration;
          Origin = Target;
      }
      else Origin += Forward * Speed * ElapsedSecondsPerFrame;
   } 
}

public void Draw()
{
    rect = new Rectangle((int) Origin.X, (int) Origin.Y, 80, 120);
    sb.Draw(point, rect, Color.Red);   
}
Vector2原点=新的Vector2(260,90);
Vector2目标=新Vector2(660180);
Vector2 Forward=Vector2.规格化(目标源);
浮动速度=100;//每秒像素数
浮动持续时间=(目标-原点).Length()/速度;
浮动时间=0;
公共无效更新(浮动ElapsedSecondsPerFrame)
{
if(持续时间){
时间=持续时间;
原点=目标;
}
else原点+=前进*速度*延时秒帧;
} 
}
公众抽签()
{
rect=新矩形((int)Origin.X,(int)Origin.Y,80,120);
某人画(点、直线、颜色、红色);
}

您正在一帧中绘制整个动画。你应该用不同的x,y从OnDraw调用Pass

编辑:

1) 您不需要计时器,游戏类中的draw方法默认为每秒60帧

2) 秒数参数应计算为(float)gametime.ElapsedTime.TotalSeconds

float time;
int xt=660, yt=180;
int xo=260, yo=90;

public void Draw(SpriteBatch spriteBatch, float Seconds)
{
    rect = new Rectangle(660, 180, 80, 120);
    spriteBatch.Draw(point, rect, Color.White);

    this.pass(xo, yo, spriteBatch);
    time+= Seconds;
    if (time>0.3)
    {
        if (xo!=xt) xo+= (xt>xo) ? 10 : -10;
        if (yo!=yt) yo+= (yt>yo) ? 10 : -10;
        time = 0;
    }
}

public void pass(int x, int y, spritebatch sb)
{
    rect = new Rectangle(x, y, 80, 120);
    sb.Draw(point, rect, Color.Red);
}
正如您应该知道的,此动画将以粗略模式移动。。。如果你想移动你的雪碧顺利。。。你可以用矢量2表示你的位置,用浮标表示你的速度

Vector2 Origin = new Vector2(260, 90);
Vector2 Target = new Vector2(660, 180);
Vector2 Forward = Vector2.Normalize(Target-Source);
float Speed = 100; // Pixels per second
float Duration = (Target - Origin).Length() / Speed;
float Time = 0;

public void Update(float ElapsedSecondsPerFrame)
{
   if (Time<Duration)
   {
      Time+=Duration;
      if (Time > Duration) {
          Time = Duration;
          Origin = Target;
      }
      else Origin += Forward * Speed * ElapsedSecondsPerFrame;
   } 
}

public void Draw()
{
    rect = new Rectangle((int) Origin.X, (int) Origin.Y, 80, 120);
    sb.Draw(point, rect, Color.Red);   
}
Vector2原点=新的Vector2(260,90);
Vector2目标=新Vector2(660180);
Vector2 Forward=Vector2.规格化(目标源);
浮动速度=100;//每秒像素数
浮动持续时间=(目标-原点).Length()/速度;
浮动时间=0;
公共无效更新(浮动ElapsedSecondsPerFrame)
{
if(持续时间){
时间=持续时间;
原点=目标;
}
else原点+=前进*速度*延时秒帧;
} 
}
公众抽签()
{
rect=新矩形((int)Origin.X,(int)Origin.Y,80,120);
某人画(点、直线、颜色、红色);
}

如果您愿意使用Sprite Vortex制作动画(实际上是一个特定版本),您可以使用以下类。您必须使用Sprite Vortex 1.2.2,因为在较新版本中,XML格式发生了更改。确保添加属性的XML文件更改为“不编译”

如果你需要一个工作的例子,我可以寄给你一个非常简单的

p、 美国的Sprite Vortex应该做与你使用其他程序相同的事情,但是V1.2.2有很多bug,但还不算太糟糕

课程在这里:

使用“精灵漩涡”(确保其为1.2.2)选择精灵表并选择要设置动画的子图像。导出XML代码


将该类添加到项目中,它将读取XML并自动添加为您创建动画的帧

如果您愿意使用Sprite Vortex制作动画(实际上是一个特定版本),可以使用以下类。您必须使用Sprite Vortex 1.2.2,因为在较新版本中,XML格式发生了更改。确保添加属性的XML文件更改为“不编译”

如果你需要一个工作的例子,我可以寄给你一个非常简单的

p、 美国的Sprite Vortex应该做与你使用其他程序相同的事情,但是V1.2.2有很多bug,但还不算太糟糕

课程在这里:

使用“精灵漩涡”(确保其为1.2.2)选择精灵表并选择要设置动画的子图像。导出XML代码


将该类添加到项目中,它将读取XML并自动添加为您创建动画的帧

我们也不明白哪里出了问题,因为你没有解释应该发生什么,而是解释发生了什么!我们也不明白哪里出了问题,因为你没有解释应该发生什么,而是解释发生了什么!这是正确的。但是,不要只是复制和粘贴代码,您应该尝试识别Blau指出的错误。在pass函数中,有一个while循环将代码锁定。当你陷入循环时,绘图函数不会启动。你的代码充满了设计错误。。。我已经编辑了它来修复它们,现在它应该运行…;)这是正确的。但是,不要只是复制和粘贴代码,您应该尝试识别Blau指出的错误。在pass函数中,有一个while循环将代码锁定。绘图函数