C# 如何访问主窗体的成员
我只是在学习C#,我正在尝试制作一个2D游戏。我正处于这样一个阶段,在我的Form1中为玩家设置了一个“PictureBox”,并开始了一个玩家课程:C# 如何访问主窗体的成员,c#,class,encapsulation,C#,Class,Encapsulation,我只是在学习C#,我正在尝试制作一个2D游戏。我正处于这样一个阶段,在我的Form1中为玩家设置了一个“PictureBox”,并开始了一个玩家课程: class Player { private string _name; private int _health; internal Player(string name, int health = 100) { _name = name; _health = health;
class Player
{
private string _name;
private int _health;
internal Player(string name, int health = 100)
{
_name = name;
_health = health;
}
int X = 0;
internal void Draw()
{
updateInput();
Draw();
}
internal void updateInput()
{
if(Keyboard.IsKeyDown(Key.Right))
X = 1;
else if (Keyboard.IsKeyDown(Key.Left))
X = -1;
else
X = 0;
}
}
有一个图片盒“pb_play”,它在主窗体上包含角色的精灵。我试着把它的访问修饰符设置为public,但没有用。我想改变角色的位置,不管X值变成什么。所以我试图从本质上访问这个类的表单成员
我试图在draw方法中执行此操作,因此它将更新输入,然后设置位置,然后重复draw方法,不断循环
如果有更好的方法,请随时教育我。我怎样才能解决这个问题
编辑:好的,我将这些方法移动到了UI中,正如一条评论所提到的。这是我所拥有的,但精灵拒绝移动:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
Draw();
}
int X = 0;
internal void Draw()
{
updateInput();
pb_play.Location = new Point((pb_play.Location.X + X), 0);
Draw();
}
internal void updateInput()
{
if (Keyboard.IsKeyDown(Key.Right))
X = 5;
else if (Keyboard.IsKeyDown(Key.Left))
X = -5;
else
X = 0;
}
}
我使用计时器解决了这个问题:
internal void Draw()
{
pb_play.Location = new Point((pb_play.Location.X + X), (pb_play.Location.Y + Y));
}
internal void updateInput()
{
if (Keyboard.IsKeyDown(Key.Right))
X = 1;
else if (Keyboard.IsKeyDown(Key.Left))
X = -1;
else
X = 0;
if (Keyboard.IsKeyDown(Key.Up))
Y = -1;
else if (Keyboard.IsKeyDown(Key.Down))
Y = 1;
else
Y = 0;
}
private void timer1_Tick(object sender, EventArgs e)
{
updateInput();
Draw();
}
您是否在某个地方有一个触发方法updateInput的事件处理程序?您考虑到这一点很好。正确的方法不是让类更新UI,而是让UI向类查询它需要表示的状态。该类应该尽可能不知道UI和输入方法。查看代码看起来你将陷入一个无休止的循环中。我在这里遗漏了什么吗?@MethodMan没有,但是
StackOverflowException
会很快发生。我用“我试图在draw方法中执行此操作,因此它将更新输入,然后设置位置,然后重复draw方法,不断循环。”