Люди отвечают на ваш вопрос на очень низком уровне. Иногда полезно подумать о проблеме на более высоком уровне.
Что вам нужно, так это тип управления состоянием. Причудливый термин в области компьютерных наук для этого — конечный автомат. Но не утруждайте себя поиском этого прямо сейчас. Поначалу это довольно сухо и запутанно :)
У вашего персонажа на данный момент одно состояние - "стоять рядом". Вам нужно добавить и обработать состояние «идти к месту назначения».
Из того, что я прочитал для другого ввода мыши, я думаю, мне понадобится какой-то цикл
Вам нужен один цикл, называемый игровым циклом. Если вы используете XNA, он у вас уже есть. Но ты на правильном пути.
Каждый раз в игровом цикле вы должны обрабатывать текущее состояние и проверять так называемые переходы состояний. Это когда вы меняете что-то в своем мире из одного состояния в другое. Например, когда вы щелкаете мышью, вы хотите, чтобы парень начал двигаться.
В своем игровом цикле вы проверяете, произошел ли только что щелчок мышью. Если это так, то установите некоторые данные (куда двигаться) и скажите ему, чтобы он начал идти, установив его состояние на «идти к месту назначения». При следующем обновлении вы будете обрабатывать это состояние.
Когда ваш персонаж находится в состоянии «идти к месту назначения», вам необходимо обновить его положение в зависимости от количества времени, прошедшего с момента последнего обновления игры. В XNA это рассчитывается за вас. Если вы не используете XNA, вам придется проверить это самостоятельно. Возможно, вы сможете использовать что-то вроде класса Stopwatch
и проверить поле Elapsed
.
Если персонаж находится в пункте назначения, вам нужно переключить его обратно в состояние «стоять рядом».
Если вы получаете еще один щелчок мышью, вам решать, хотите ли вы, чтобы состояние «идти к месту назначения» обращало на это внимание или нет. Если вы обращаете на это внимание, вы устанавливаете тот же тип данных, что и при переходе из состояния «стоять рядом».
Итак, вам понадобятся следующие переменные:
- Таймер, чтобы узнать время, прошедшее с момента последнего игрового цикла (XNA предоставляет его вам)
- Текущее состояние игрока (возможно,
enum
)
- Текущая позиция игрока (вектор)
- Скорость ходьбы игрока (вероятно, поплавка), измеряемая в единицах в секунду (или миллисекундах).
- Данные для состояния "идти к месту назначения" - целевое положение (другой вектор)
- Данные, связанные с пользовательским вводом (события мыши, которые произошли с момента последнего обновления, позиция этих кликов и т. д.).
Специфические данные персонажа будут разными для каждого персонажа в вашей игре, поэтому вам нужна новая копия для каждого. Вероятно, вы захотите поместить его в класс. Остальное является более глобальным, поэтому вы можете сохранить его отдельно или сделать частью своей игры, игрового цикла, классов ввода и т. д. (как бы вы ни решили это организовать).
Я не буду рассматривать векторную математику для того, как на самом деле вычислить материал частичного движения, так как другие люди рассмотрели это. Нет смысла дублировать эти ответы. В основном это сводится к созданию вектора между вашей текущей позицией и целевой позицией и умножению/делению его на скорость ходьбы (чтобы сократить его до расстояния, пройденного за одно обновление).
person
Merlyn Morgan-Graham
schedule
17.02.2011