C# 如何访问主窗体的成员

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;

我只是在学习C#,我正在尝试制作一个2D游戏。我正处于这样一个阶段,在我的Form1中为玩家设置了一个“PictureBox”,并开始了一个玩家课程:

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方法,不断循环。”