添加到列表中的不同对象变得相同

时间:2013-08-30 13:40:35

标签: c# sdl.net

我正在尝试用图形学习C#,目前使用sdl.net。我想学习如何在屏幕上创建对象,但坚持这个疯狂的事情三天。用谷歌搜索我能想到的一切,但我不能自己解决这个问题,而是要求别人帮忙。

我将示例简化为最低限度。目前我尝试通过在屏幕上单击鼠标并打印他们的数字来创建一些对象。在创建时,每个对象都得到一个数字,我把它放在列表上然后预先处理每个对象。

但是当我打印对象列表时,每个对象都变得像最后一个,尽管构造函数显示它创建了具有新数字的新对象。但是当我迭代列表时,每个对象都有相同的数字。

Constructor: object number:1
Show() object number:1
object count:1

Constructor: object number:2
Show() object number:2
Show() object number:2
object count:2

Constructor: object number:3
Show() object number:3
Show() object number:3
Show() object number:3
object count:3

应该是:

Constructor: object number:3
    Show() object number:1
    Show() object number:2
    Show() object number:3
    object count:3

我做错了什么,我错过了什么? (我尝试了与windows窗体和按钮相同的原理,并且工作正常)

我的简化代码:

using System;
using System.Collections.Generic;
using System.Drawing;
using SdlDotNet.Graphics;
using SdlDotNet.Input;
using SdlDotNet.Core;
using Font = SdlDotNet.Graphics.Font;

public class KeyboardTest
{
    private static Surface m_VideoScreen;
    private static Surface m_DrawingSurface;

    private static List<ball> ball_list=new List<ball>();//### THE OBJECT LIST ###
    private static int num = 1;

    class ball  //### MY CLASS ###
    {
        private static int numeris;

        public ball(int _numeris) //### CONSTRUCTOR ###
        {
            numeris = _numeris;
            System.Diagnostics.Debug.WriteLine("Constructor: object number:{0}", numeris);
        }

        public void show() //### VOID TO PRINT OBJECT NUMBER ###
        {
            System.Diagnostics.Debug.WriteLine("Show() object number:{0}", numeris);
        }
    }

    public static void Main(string[] args) // ### MAIN VOID, SKIP THIS ###
    {
        m_VideoScreen = Video.SetVideoMode(800, 600, 32, false, false, false, true, true);
        m_VideoScreen.Fill(Color.White);
        m_DrawingSurface = Video.CreateRgbSurface(m_VideoScreen.Width, m_VideoScreen.Height, 32, 0, 0, 0, 0, true);
        m_DrawingSurface.Fill(Color.White);  
        Events.Quit += new EventHandler<QuitEventArgs>(ApplicationQuitEventHandler);
        Events.Tick += new EventHandler<TickEventArgs>(ApplicationTickEventHandler);
        Events.TargetFps = 1;
        Events.MouseButtonDown += new EventHandler<MouseButtonEventArgs>(ApplicationMouseButtonEventHandler);
        Events.Run();
    }

    private static void ApplicationMouseButtonEventHandler(object sender, MouseButtonEventArgs args)
    {
        if (args.Button == MouseButton.PrimaryButton && args.ButtonPressed==true)
        {
            ball_list.Add(new ball(num)); //### ADDING TO THE LIST ON MOUSE CLICK ###
            num += 1;
        }
    }

    private static void ApplicationTickEventHandler(object sender, TickEventArgs args)
    {
        m_VideoScreen.Blit(m_DrawingSurface);
        foreach (ball temp in ball_list) //### PRINTING NUMBERS OF ALL OBJECTS IN LIST ###
        {
            temp.show();
        }
        m_VideoScreen.Update();
        System.Diagnostics.Debug.WriteLine("object count:{0}", ball_list.Count);
    }

    private static void ApplicationQuitEventHandler(object sender, QuitEventArgs args)
    {
        Events.QuitApplication();
    }
}

3 个答案:

答案 0 :(得分:3)

您的问题是您使用的是静态变量:

private static int numeris;

将其更改为实例:

private int numeris;

答案 1 :(得分:2)

ball课程中,您有: private static int numeris;

静态变量是 class 级别的变量,而不是实例级别的变量。你的球实例都在分享这个数字。

答案 2 :(得分:1)

从Ball类中删除Static中的numeris关键字。