2015-06-19 2 views
1

Я пытался заставить свой счет работать правильно, когда игрок сталкивается с одним из предметов коллекционирования, но оценка, похоже, не меняется при столкновении, я не уверен, почему это происходит ,Оценка не меняется при возникновении столкновения

В моем коллекционировании я это:

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; 
     } 

Я рисую в Game1 классе с:

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

Так, если игрок сталкивается с BlueBall, 20 должен быть добавлен оценка и BlueBall должны исчезнуть, она исчезает, но оценка не меняется, почему это?

В данный момент я объявляю свой результат в классе Game1 с public int score и Vector2 scorePos, чтобы разместить его. Затем я инициализирую счет score = 0;, а затем загрузим в значение scorePos в Update.

+0

Можете ли вы показать нам, какой счет. – deathismyfriend

+0

@deathismyfriend за оценку Я просто сделал «int score» и объявил, что он установил счет 0 – KizzaWellz

+0

И где определяется оценка? Действительно ли эта переменная нарисована? Правильно ли он занят? ** Недостаточно кода **. – BradleyDotNET

ответ

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; 
    } 
} 

Теперь эти две оценка переменные не имеют абсолютно никакого отношения к друг другу. Тот факт, что они названы одинаковыми совершенно не имеет отношения к делу.

Чтобы сделать быструю аналогию, представьте, что объекты программирования - это коробки. Каждая переменная является «счетчиком». Вы помещаете счетчик в поле «Игра» и называете его «оценка». Вы положили еще один счетчик в поле «Мяч», а также назовите его «оценка». Очевидно, что изменение счетчика в поле «Бал» не повлияет на поле в поле «Игра» и наоборот. В общем, эта концепция называется «областью определения» в программировании. Каждая переменная привязана к ее квадрату, который может быть классом, функцией или даже использующим блоком (области создаются {}).

Теперь, когда вы понимаете проблему, есть несколько способов это исправить:

  1. Создать глобальную переменную. Вы не можете сделать это на C#, но вы можете создать другой объект, к которому имеют доступ оба других объекта. Оба объекта, кроме ссылки/изменения, имеют свойство «score». Простой (и плохая практика) Примером может служить:

    public static class GlobalState 
    { 
        public static int GameScore { get; set; } 
    } 
    

Все ссылки забьют бы стать GlobalState.GameScore. Опять же, это только для вас, такой код - действительно плохая практика, и может вызвать ошибки (особенно в многопоточных ситуациях).

  1. Ударьте мяч под событие при столкновении. Игра будет регистрироваться для этого события и соответствующим образом увеличивать свою «балл».

  2. Передача переменной «score» игры в метод столкновения по ref, чтобы она могла ее изменить. Предупреждение. Это включено для полноты, и это должно быть сделано только в определенных обстоятельствах, из которых ваш, вероятно, не является одним из них.

  3. Передайте делегату мяч на создание, чтобы вызвать его, когда нужно увеличить счет. Это действительно вариация метода события.

Уверен, что есть другие. Учитывая ваш уровень опыта, я бы начал с глобальным подходом (как простейшим и требующим наименьшего количества знаний), а затем перейдем к изучению событий и перейдем к этому подходу в будущем.

+0

Я все еще не совсем уверен, как реализовать это в код, который у меня уже есть. Я сделал новый публичный статический класс для Variable, но я не знаю, что делать после – KizzaWellz

+0

@ KizzaWellz подумает об этом. Зачем отслеживать игроков в объекте «BlueBall»? И почему объект 'Game1' сохранит счет игрока? 'Player' должен иметь публичное свойство' Score', и вы должны обновлять его при столкновении. – Kcvin

+0

@KizzaWellz Кроме того, я сказал, что делать после, обновите свои применения 'score' до статической переменной. NETScape прав, хотя объект Player был бы лучше, чем у вас. – BradleyDotNET

Смежные вопросы