3

i'm trying to learn C# with graphics, using sdl.net at the moment. I wanted to learn how to create objects on screen, but stuck on this crazy thing for three days. Googled everything i could think of, but can't solve this on my own and i'm asking somebody for help.

I simplified the example to bare minimum. For the moment i try to create a few objects by clicking mouse on screen and print their numbers. On creation, every object gets a number, i put it on the list and then foreach every object.

But when i print the object list, every object becomes like the last one, though constructor shows that it creates new object with new number. But when i iterate the list, every object has same number.

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

When it should be:

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

What am i doing wrong, what am i missing?? (i tried same principle with windows forms and buttons, and it worked fine)

My simplified code:

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();
    }
}
Klemkas
  • 107
  • 1
  • 8

3 Answers3

3

Your issue is that you're using a static variable:

private static int numeris;

Change it to be an instance:

private int numeris;
Khan
  • 17,904
  • 5
  • 47
  • 59
  • Jesus Christ! One wrong word made me bang my head for three days. And i had read a few articles about 'static' keyword, and still got it wrong. I knew i wouldn't solve it by myself. Thank you a ton!! – Klemkas Aug 30 '13 at 13:47
2

In your ball class, you have: private static int numeris;

A static variable is one that's at the class level, not at the instance level. Your ball instances all are sharing that number.

Daniel Mann
  • 57,011
  • 13
  • 100
  • 120
1

Remove the Static keyword from numeris in the Ball class.

Paddyd
  • 1,870
  • 16
  • 26