2013-08-30 105 views
3

我正試圖學習C#與圖形,此刻使用sdl.net。我想學習如何在屏幕上創建對象,但在三天內堅持這個瘋狂的事情。谷歌搜索了我能想到的所有東西,但無法自己解決這個問題,我正在尋求幫助。添加到列表中的不同對象變得相同

我把這個例子簡化爲最小值。目前我嘗試通過在屏幕上點擊鼠標並打印它們的數字來創建一些對象。在創作時,每個物體都會得到一個數字,我將它放在列表中,然後對每個物體進行foreach。

但是,當我打印對象列表,每個對象變得像最後一個,雖然構造函數顯示它創建新的對象與新號碼。但是當我迭代列表時,每個對象都有相同的編號。

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(); 
    } 
} 

回答

2

在你ball類,你必須: private static int numeris;

靜態變量是一個是在水平,而不能在實例級別。你的球實例都分享這個數字。

+0

感謝您的解釋,現在它非常清楚! – Klemkas

3

你的問題是,你正在使用一個靜態變量:

private static int numeris; 

將其更改爲一個實例:

private int numeris; 
+0

耶穌基督!一個錯誤的詞讓我感動了三天。我已經閱讀了一些關於「靜態」關鍵字的文章,但仍然錯了。我知道我不會自己解決它。謝謝你一噸! – Klemkas

1

從取出Static關鍵字Ball類中的。

相關問題