发生碰撞时得分不变

时间:2015-06-19 19:48:10

标签: c# xna

当玩家与其中一个收藏品发生碰撞时,我一直试图让我的分数正常工作,但是当碰撞发生时分数似乎没有改变,我不知道为什么会发生这种情况。

在我的收藏中,我有这个:

#ifndef _OPENGL_INCLUDES
#define _OPENGL_INCLUDES

#include <GL/glew.h>
#include <gl/gl.h>
#include <GL/glut.h>


#pragma comment(lib, "opengl32.lib")
#pragma comment(lib, "glu32.lib")
#pragma comment(lib, "glew32.lib")
#endif

我在 <?php $inputuser = $_POST["user"]; $inputpass = $_POST["pass"]; $user = "root"; $password = ""; $database = "ABCD"; $connect = mysql_connect("localhost", $user, $password); // Variable that Initializes connection to database @mysql_select_db($database) or die("Database not found"); $query = "SELECT * FROM `users` WHERE `user` = '$inputuser'"; $querypass = "SELECT * FROM `users` WHERE `pass` = '$inputpass'"; echo $password; $result = mysql_query($query) or die(mysql_error()); $resultpass = mysql_query($querypass) or die( mysql_error()); $row = mysql_fetch_array($result); $rowpass = mysql_fetch_array($resultpass); $serveruser = $row["user"]; $serverpass = $rowpass["pass"]; if ($serveruser && $serverpass){ if(!$result){ //header('Location: fail.html'); die("Username Name or Password is invalid"); } echo "<br><center>Database Output</b> </center><br><br> "; mysql_close(); echo $inputpass; echo $serverpass; if($inputpass == $serverpass){ session_start(); $_SESSION["user"] = $row["user"]; header('Location: home.php'); } }else { header('Location: fail.html'); echo "Sorry, bad Login"; } ?> 课程中使用:

class BlueBall : Obj
{
    public BlueBall(Vector2 pos) 
        : base(pos)
    {
        position = pos;
        spriteName = "BlueBall";
        solid = false;
        score = 0;
    }

    public override void Update()
    {
        if (!alive) return;

        Player player = CheckCollisionAgainst<Player>();
        if (player != null)
        {
            score = score + 20;
            alive = false;
        }

因此,如果玩家与BlueBall发生碰撞,应该将20添加到分数中,BlueBall应该消失,它确实会消失,但分数不会改变,为什么会这样?

此时我正在使用Game1spriteBatch.DrawString(font, "Score: " + score.ToString(), scorePos, Color.White); 在Game1课程中声明我的分数来定位它。然后,我使用public int score初始化分数,然后在Update中的scorePos值中加载。

1 个答案:

答案 0 :(得分:0)

根据您的代码和您的评论,很明显实际上有两个得分变量。游戏所拥有的一个:

public class Game
{
    private int score;

    void Draw(...)
    {
       spriteBatch.DrawString(font, "Score: " + score.ToString(), scorePos, Color.White);
    }
}

球所拥有的

public class BlueBall : Obj
{
    private int score;

    public void CheckCollisions()
    {
        if (collision)
           score += 20;
    }
}

现在,这两个得分变量彼此完全没有关系。它们被命名为相同的这一事实完全无关紧要

要快速比喻,想象编程对象就是盒子。每个变量都是“计数器”。你把一个计数器放在“游戏”框中并称之为“得分”。您将另一个计数器放在“球”框中,并将其称为“得分”。显然,修改“Ball”框中的计数器不会影响“Game”框中的计数器,反之亦然。通常,这个概念在编程中称为“范围”。每个变量的范围都限定在其框中,该框可以是类,函数,甚至是使用块(范围由{}创建)。

现在你已经了解了这个问题,有几种方法可以解决它:

  1. 创建全局变量。您实际上无法在C#中执行此操作,但您可以创建其他对象可以访问的另一个对象。两个对象都比引用/修改它的“得分”属性。一个简单(和不良做法)的例子是:

    public static class GlobalState
    {
        public static int GameScore { get; set; }
    }
    
  2. 所有对得分的引用都将成为GlobalState.GameScore。同样,这只是为了让你前进,这种代码是非常糟糕的做法,并且可能导致错误(特别是在多线程情况下)

    1. 让球在碰撞时举起比赛。游戏将注册此事件并适当增加其“得分”变量。

    2. 通过ref将游戏的“score”变量传递给碰撞方法,以便它可以更改它。 警告:这是为了完整性而包含的内容,这应该仅在特定情况下进行,您的可能不是其中之一。

    3. 在创建时将委托传递给球,以便在需要增加分数时调用。这实际上是事件方法的一种变体。

    4. 我确定还有其他人。根据您的经验水平,我将开始采用全局方法(因为它是最简单且需要最少量的知识),然后转向学习事件并在将来采用该方法。