当玩家与其中一个收藏品发生碰撞时,我一直试图让我的分数正常工作,但是当碰撞发生时分数似乎没有改变,我不知道为什么会发生这种情况。
在我的收藏中,我有这个:
#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应该消失,它确实会消失,但分数不会改变,为什么会这样?
此时我正在使用Game1
和spriteBatch.DrawString(font, "Score: " + score.ToString(), scorePos, Color.White);
在Game1课程中声明我的分数来定位它。然后,我使用public int score
初始化分数,然后在Update中的scorePos值中加载。
答案 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”框中的计数器,反之亦然。通常,这个概念在编程中称为“范围”。每个变量的范围都限定在其框中,该框可以是类,函数,甚至是使用块(范围由{}
创建)。
现在你已经了解了这个问题,有几种方法可以解决它:
创建全局变量。您实际上无法在C#中执行此操作,但您可以创建其他对象可以访问的另一个对象。两个对象都比引用/修改它的“得分”属性。一个简单(和不良做法)的例子是:
public static class GlobalState
{
public static int GameScore { get; set; }
}
所有对得分的引用都将成为GlobalState.GameScore
。同样,这只是为了让你前进,这种代码是非常糟糕的做法,并且可能导致错误(特别是在多线程情况下)。
让球在碰撞时举起比赛。游戏将注册此事件并适当增加其“得分”变量。
通过ref将游戏的“score”变量传递给碰撞方法,以便它可以更改它。 警告:这是为了完整性而包含的内容,这应该仅在特定情况下进行,您的可能不是其中之一。
在创建时将委托传递给球,以便在需要增加分数时调用。这实际上是事件方法的一种变体。
我确定还有其他人。根据您的经验水平,我将以开始采用全局方法(因为它是最简单且需要最少量的知识),然后转向学习事件并在将来采用该方法。