在我的程序中,我正在创建在屏幕上移动的PictureBox。我想这样做,以便用户可以根据需要创建尽可能多的这些内容。为此,我创建了一个类,它在创建后被分配给一个图片框并控制它的移动。这适用于图片框,直到我创建另一个,当它不再受控制。我认为这是因为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);
}
}
答案 0 :(得分:2)
您可以创建所需类的实例数。
问题是你在类中使用静态变量。无论您创建多少个实例,它只存在一次。当您创建第二个实例时,它将使用新图片框覆盖静态变量中的值。
您需要一个实例变量来为每个类的实例保存一张图片。
改变这个:
static PictureBox box;
为:
PictureBox box;
附注:一个好的做法是为类的成员指定访问级别,并且只允许那些要从类外部访问的公共访问级别。将您的成员变量设为私有可确保仅从该实例访问它:
private PictureBox box;
答案 1 :(得分:0)
在类中声明的静态变量对于该类的所有实例是通用的。因此,您传递给类的构造函数
的最新图片框会覆盖您的PictureBox框因此,如果您使用上面的代码并致电
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
引用了存储在内部变量pic1
中的box
,而cb2引用了pic2
但是,请记住,PictureBox是可能的昂贵资源(Image属性)的主机,您应该确保在不再需要时处置这些CubeProjectile实例