2014-02-08 76 views
0

在我的程序中,我创建了在屏幕上移动的PictureBoxes。我想要这样做,以便用户可以创建尽可能多的这些。为了做到这一点,我创建了一个类,它在创建后被分配给一个图片框并控制它的移动。这适用于picturebox,直到我创建另一个,当它不再受控时。我认为这是因为c#不允许我创建一个类的多个对象,因此结束了以前的创建一个新的。以下是我已经做到了:如何在c#中创建和运行同一类的多个对象?

static ArrayList cps = new ArrayList(); 

public void ShootCannon() { 
    Image cubeImage= Image.FromFile("C:\\Users\\Stefan\\Documents\\Visual Studio 2010\\Projects\\Game1\\Game1\\Resources\\CannonCube.png"); 
    PictureBox cannonCube = new PictureBox(); 
    ScreenPanel.Controls.Add(cannonCube); 
    cannonCube.Image = cubeImage; 
    cannonCube.SetBounds(cannonCubeInst.X, cannonCubeInst.Y, cubeImage.Width, cubeImage.Height); 
    cannonCube.BringToFront(); 

    cps.Add(new CubeProjectile(cannonCube)); 
} 

而且CubeProjectile类:

public class CubeProjectile 
{ 

    static PictureBox box; 

    public CubeProjectile(PictureBox box1) 
    { 
     box = box1; 
     Timer Update = new Timer(); 
     Update.Interval = 1; 
     Update.Tick += new EventHandler(Timer_Tick); 
     Update.Start(); 
    } 

    void Timer_Tick(object sender, EventArgs e) 
    { 
     Point loc = new Point(box.Location.X, box.Location.Y); 
     box.SetBounds(loc.X + 1, loc.Y, box.Width, box.Height); 
    } 

} 
+2

“C#不允许我创建一个类的多个对象”你在说什么? PictureBox不是单身人士。修复您的私人静态图片框框。 –

回答

0

在类中声明的静态变量是常见的该类的所有实例。所以,你的图片框箱覆盖与您传递给你的类的构造函数的最新图片框

所以,如果你使用上面的代码,并呼吁

CubeProjectile cb1 = new CubeProjectile(pic1); 
CubeProjectile cb2 = new CubeProjectile(pic2); 

CubeProjectile份额这两种情况的最新图片框传递给构造pic2

相反,如果声明变量没有static修饰符的类的每个实例都有自己的PictureBox

public class CubeProjectile 
{ 

    private PictureBox box; 

    public CubeProjectile(PictureBox box1) 
    { 
     box = box1; 
     Timer Update = new Timer(); 
     Update.Interval = 1; 
     Update.Tick += new EventHandler(Timer_Tick); 
     Update.Start(); 
    } 

    void Timer_Tick(object sender, EventArgs e) 
    { 
     Point loc = new Point(box.Location.X, box.Location.Y); 
     box.SetBounds(loc.X + 1, loc.Y, box.Width, box.Height); 
    } 

} 

CubeProjectile cb1 = new CubeProjectile(pic1); 
CubeProjectile cb2 = new CubeProjectile(pic2); 

现在cb1具有存储在内部变量box和CB2引用pic2

然而,参考pic1,请记住,一个图片是一个可能昂贵的资源(图像属性)的主机,你应该当不再需要时,确保处置这些CubeProjectile的实例

2

您可以创建多少个您想要的类的实例。

问题是你正在类中使用一个静态变量。无论您创建多少个实例,只存在一次。当您创建第二个实例时,它将用新图片框覆盖静态变量中的值。

您需要一个实例变量来为类的每个实例保存一张图片bx。

更改此:

static PictureBox box; 

到:

PictureBox box; 

边注:一个好的做法是指定类的成员访问级别,只有让那些公众你想从课外访问。使你的成员变量私人确保了它只能从实例访问:

private PictureBox box; 
相关问题