C#一个定时器用于多个形状

C#一个定时器用于多个形状,c#,timer,C#,Timer,对于一个学校项目,我需要做一个多椭圆移动的小游戏。 用我的方法制作的最后一个同时制作多个的,用我制作的计时器移动 如何为所有椭圆制作一个计时器 class EnemyTeam { private Ellipse enemy; private Canvas canvas; private double xChange = 50, yChange = 50; public DispatcherTimer enemyTimer; private char di

对于一个学校项目,我需要做一个多椭圆移动的小游戏。 用我的方法制作的最后一个同时制作多个的,用我制作的计时器移动

如何为所有椭圆制作一个计时器

class EnemyTeam
{

    private Ellipse enemy;
    private Canvas canvas;
    private double xChange = 50, yChange = 50;
    public DispatcherTimer enemyTimer;
    private char direction = '0';
    private Thickness enemyThickness;

    public EnemyTeam(Canvas canvas, double startPosition, SolidColorBrush playerBrush)
    {
        this.canvas = canvas;
        DrawTeam(canvas, 40, playerBrush);
        enemyTimer.Interval = TimeSpan.FromMilliseconds(100);
        enemyTimer.Start();
    }

    private void DrawBall(SolidColorBrush brush, Canvas canvas,double x,double y)
    {
        enemy = new Ellipse();
        enemy.Stroke = brush;
        enemy.Fill = brush;
        enemy.Height = 30;
        enemy.Width = 30;
        enemy.Margin = new Thickness(x,y, 0, 0);
        enemyTimer = new DispatcherTimer();
        enemyThickness = enemy.Margin;
        canvas.Children.Add(enemy);   
        enemyTimer.Tick += enemyTimer_Tick;
    }

    void enemyTimer_Tick(object sender, EventArgs e)
    {
        if (enemyThickness.Left >= canvas.Width - 100)
        {
            GoDown();
            direction = '1';
        }

        if (enemyThickness.Left <= 0 + 20)
        {
            GoDown();
            direction = '0';
        }
        MoveTeam(enemy);
    }

    private void MoveTeam(Ellipse enemy)
    {
        enemyThickness = enemy.Margin;

        if (direction == '1')
        {
            enemyThickness.Left -= xChange;
        }

        if (direction == '0')
        {
            enemyThickness.Left += xChange;
        }

        enemy.Margin = enemyThickness;
    }

    private void GoDown()
    {
        enemyThickness.Top += yChange;
        enemy.Margin = enemyThickness;
    }
}
class-EnemyTeam
{
私敌;
私人帆布;
专用双交换=50,yChange=50;
公共调度员enemyTimer;
私有字符方向='0';
私密的神秘感;
公共敌人团队(帆布、双星位置、SolidColorBrush playerBrush)
{
this.canvas=画布;
DrawTeam(canvas,40岁,playerBrush);
enemyTimer.Interval=TimeSpan.From毫秒(100);
enemyTimer.Start();
}
专用空心挂钩(SolidColorBrush笔刷、帆布、双x、双y)
{
敌人=新椭圆();
笔触=刷子;
敌人。填充=刷子;
高度=30;
宽度=30;
边界=新厚度(x,y,0,0);
enemyTimer=新的Dispatchermer();
Eneythickness=敌人。边距;
canvas.Children.Add(敌人);
enemyTimer.Tick+=enemyTimer\u Tick;
}
void enemyTimer_Tick(对象发送方,事件参数e)
{
如果(enemyThickness.Left>=canvas.Width-100)
{
货仓();
方向='1';
}

如果(enemyThickness.Left将enemyTimer声明为静态字段:

class EnemyTeam
{
    private static enemyTimer = new DispatcherTimer();
...

关键字static将使类共享字段。

而不是在
trablell
方法中初始化和分配事件处理程序,而是在
EnemyTeam
类的构造函数中这样做。这将为您提供每个
EnemyTeam
对象的计时器。

您正在创建多个计时器并将它们扔掉。看到这一点吗东北:

enemyTimer = new DispatcherTimer();
每次调用它时,您都在创建一个新的计时器,并扔掉
enemyTimer
引用的上一个副本。因为
enemyTimer.Start()
是在
DrawTeam
之后调用的,所以它只在最后创建的计时器上调用。其他计时器都不会启动

但是,即使其他计时器启动,您仍然只能看到一个椭圆移动,因为在
enemyTimer\u Tick
中,您只能对
敌方
进行更改,这是一个类成员变量,指向最后创建的椭圆

我建议您只使用一个计时器,将创建的所有省略号保存在列表中供以后使用,并在
enemyTimer\u Tick
中通过迭代列表更新所有这些省略号

编辑:这是您的代码副本,经过一些修改,向您展示了我的意思。我真的不明白您试图用MoveTeam和EneyMythickness变量做什么,所以我没有弄乱这些东西。也就是说,这不是一个完整的工作解决方案,只是我建议的更改的一个示例

using System.Collections.Generic;

class EnemyTeam
{

    private List<Ellipse> enemies = new List<Ellipse>();
    private Canvas canvas;
    private double xChange = 50, yChange = 50;
    public DispatcherTimer enemyTimer;
    private char direction = '0';
    private Thickness enemyThickness;

    public EnemyTeam(Canvas canvas, double startPosition, SolidColorBrush playerBrush)
    {
        this.canvas = canvas;
        DrawTeam(canvas, 40, playerBrush);
        enemyTimer = new DispatcherTimer();
        enemyTimer.Interval = TimeSpan.FromMilliseconds(100);
        enemyTimer.Tick += enemyTimer_Tick;
        enemyTimer.Start();
    }

    private void DrawBall(SolidColorBrush brush, Canvas canvas,double x,double y)
    {
        enemy = new Ellipse();
        enemy.Stroke = brush;
        enemy.Fill = brush;
        enemy.Height = 30;
        enemy.Width = 30;
        enemy.Margin = new Thickness(x,y, 0, 0);
        enemyThickness = enemy.Margin; // what is this supposed to do?
        canvas.Children.Add(enemy);
        enemies.Add(enemy);
    }

    void enemyTimer_Tick(object sender, EventArgs e)
    {
        foreach (Ellipse enemy in enemies)
        {
            if (enemyThickness.Left >= canvas.Width - 100)
            {
                GoDown();
                direction = '1';
            }

            if (enemyThickness.Left <= 0 + 20)
            {
                GoDown();
                direction = '0';
            }
            MoveTeam(enemy);
        }
    }

    private void MoveTeam(Ellipse enemy)
    {
        enemyThickness = enemy.Margin;

        if (direction == '1')
        {
            enemyThickness.Left -= xChange;
        }

        if (direction == '0')
        {
            enemyThickness.Left += xChange;
        }

        enemy.Margin = enemyThickness;
    }

    private void GoDown()
    {
        enemyThickness.Top += yChange;
        enemy.Margin = enemyThickness;
    }
}
使用System.Collections.Generic;
班级团队
{
私有列表=新列表();
私人帆布;
专用双交换=50,yChange=50;
公共调度员enemyTimer;
私有字符方向='0';
私密的神秘感;
公共敌人团队(帆布、双星位置、SolidColorBrush playerBrush)
{
this.canvas=画布;
DrawTeam(canvas,40岁,playerBrush);
enemyTimer=新的Dispatchermer();
enemyTimer.Interval=TimeSpan.From毫秒(100);
enemyTimer.Tick+=enemyTimer\u Tick;
enemyTimer.Start();
}
专用空心挂钩(SolidColorBrush笔刷、帆布、双x、双y)
{
敌人=新椭圆();
笔触=刷子;
敌人。填充=刷子;
高度=30;
宽度=30;
边界=新厚度(x,y,0,0);
enemyThickness=敌方.Margin;//这应该做什么?
canvas.Children.Add(敌人);
敌人。添加(敌人);
}
void enemyTimer_Tick(对象发送方,事件参数e)
{
foreach(敌人中的敌人)
{
如果(enemyThickness.Left>=canvas.Width-100)
{
货仓();
方向='1';
}

如果(enemyThickness.Left)从何处调用Drawll?除非从DrawTeam调用,否则当前代码将不起作用。是的,DrawTeam调用了Drawll。不,仍然不起作用,但感谢您的回答!每个计时器滴答事件仍然只有一个球移动,特别是在我用于DrawTeam()的for循环中创建的最后一个球。你能用GoDown和MoveTeam方法中的代码更新这个问题吗?同样不起作用,为什么你在这里使用TimeSpan而不是Dispatchermer?改为Dispatchermer。你能不能温柔地给我一些示例代码?不要太多,只是一个开始,因为我不完全理解你解释的方法。我已经添加了一个经过调整的代码版本这可能会有帮助。所有椭圆对象现在只需稍微调整一下代码,使它们按照预期的方式移动。使用EneyMythickness是因为我们还没有看到更新边距的其他方法,无论我做了什么,我总是在单独使用边距时出错。我真的很感谢你的帮助!尝试让像电子游戏顺便说一下。