使Picturebox Bounds“collision”添加到得分标签

时间:2016-05-11 21:22:54

标签: c# winforms

尝试制作一个简单的C#程序,其中一艘船通过几个“检查站”,当它受到界限时,它会增加玩家得分,然后当你到达最终检查点时游戏结束。无法弄清楚如何让分数上升并每次打印到标签。谢谢!

更新:我可以让我的盒子一次增加分数,但不是所有其他的图片盒。此外,当我点击最后的“太空港”图片框时,我陷入了消息框重定向循环。我该如何解决这两件事?在学校的导师没有帮助。

public partial class consoleForm : Form
{
    public consoleForm()
    {
        InitializeComponent();
    }

    private void consoleForm_Load(object sender, EventArgs e)
    {
    }

    private void outputBox_TextChanged(object sender, EventArgs e)
    {
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        int score = (0);
        if (ship.Bounds.IntersectsWith(wormhole1.Bounds))
    {
        score += (1);
        userScore.Text = score.ToString();
        this.Refresh();
    }
    else if (ship.Bounds.IntersectsWith(wormhole2.Bounds))
    {
        score += (1);
        userScore.Text = score.ToString();
        this.Refresh();
    }
    else if (ship.Bounds.IntersectsWith(wormhole3.Bounds))
    {
        score += (1);
        userScore.Text = score.ToString();
        this.Refresh();
    }
    else if (ship.Bounds.IntersectsWith(wormhole4.Bounds))
    {
        score += (1);
        userScore.Text = score.ToString();
        this.Refresh();
    }
    if (ship.Bounds.IntersectsWith(spaceport.Bounds))
    {
        MessageBox.Show("you win");
        this.Refresh();
    }
}

2 个答案:

答案 0 :(得分:2)

你遇到的问题是,你只是在表单加载时进行一次检查,而不再是。

consoleForm_Load事件中删除逻辑,并将其放在您自己的方法中,称为CheckScore(),或其他有意义的事情。

最好的方法是使用计时器检查每个交叉点,比方说100ms(0.1秒)。

创建计时器:
consoleForm的构造函数中,为它创建一个计时器和一个处理程序,然后Start。 *您甚至可以将其放入已存在的consoleForm_Load事件中 - 您的选择:)

像这样:

public consoleForm()
{
    var timer = new System.Timers.Timer(100); // Create a timer that fires every 100ms (0.1s)
    timer.Tick += OnTimer_Tick;
    timer.Start();
}

为计时器的Tick事件添加事件:

OnTimer_Tick你可以从VS“自动创建”,或自己添加:

private void OnTimer_Tick(object sender, ElapsedEventArgs e)
{
    CheckScore(); // Call your logic method to check the score
}

做逻辑:

如果您还没有,请确保使用原始逻辑(过去曾在CheckScore()事件中)创建consoleForm_Load方法。

最后说明:
我会认真考虑整理你的CheckScore()(或任何你喜欢称之为)的方法,但那只是我:)

进一步的最终说明还有许多其他创建计时器的方法;我只是很好并且在WinForms 中使用Timer的最基本用法:)

希望这有帮助!

更多!!!
目前,每次调用CheckScore()方法时,您都会创建一个新的“分数”。

为了存储您的分数,请创建一个名为_score或类似的私人字段:

private int _score = 0;

然后,每当您添加到用户的分数时,请引用_score字段,然后使用该字段进行计算和显示:

_score++;
// or your own logic
_score += 20; // etc. etc.

// At the bottom of your logic,
// when you're ready to display the score:
userScore.Text = "Your score: " + _score;

然后,您可以在表单中的任何其他地方引用_score

比如重新设置它:

private void ResetScore()
{
   _score = 0;
}

或检查分数是否达到某个值:

public void CheckScore()
{
    ...
    // Your other logic to increment the score.
    ...

    if (_score >= 10) // Check if the score has reached a certain value.
    {
        MessageBox.Show("You reached 10 points! YOU WIN!");
    }
}

宾果! ;)

答案 1 :(得分:0)

好的,所以你的问题是你只需要调用一次代码 - 加载表单时。您需要设置更新事件,并使用上面的代码定期调用以使其正常工作。否则你的代码看起来很健全。查看c#计时器以获取调用的更新方法。