Перемещение спрайта между двумя точками [вперед и назад непрерывно]

Я новичок в XNA | С#, и я хочу просто переместить спрайт между двумя точками и постоянно перемещаться вперед и назад.

Скажем, я хочу, чтобы спрайт перемещался между y-координатой 100 и 0.

Как бы я это сделал?

-3
02 июл. '14 в 23:08
источник поделиться
2 ответа

Ваш вопрос не имеет ничего общего с самой XNA. Вы спрашиваете, как перемещать объект по прямой, и это то, что обычно изучается в геометрии первого года.

Предположим, вы рисуете свою текстуру следующим образом:

SpriteTexture sprite;
Vector2 position;
...
protected override void Draw(GameTime gameTime)
{
    graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
    spriteBatch.Begin();
    spriteBatch.Draw(sprite, position, Color.White);
    spriteBatch.End();
    base.Draw(gameTime);
}

Прямая линия - чрезвычайно простой путь - она легко определяется двумя точками. Пусть точки - P1 и P2. Тогда прямая определяется как функция (1 - t) * P1 + t * P2 где 0 <= t <= 1. Чтобы переместить спрайт, начинайте с t = 0 и увеличивайте t в каждом цикле обновления. Вычисление функции с заданным t дает вам положение спрайта. Когда t >= 1 вы достигли P2, это означает, что вы должны начать декретировать t обратно до 0 и так далее и так далее. Здесь, как использовать этот факт для перемещения спрайта:

SpriteTexture sprite;
Vector2 position;
Vector2 p1 = new Vector2(0, 100), 
        p2 = new Vector2(0, 0);
double currentTime = 0, timestep = 0.01;
...    
protected override void Update(GameTime gameTime)
{
   position = currentTime * p1 + (1 - currentTime) * p2;
   currentTime += timestep;
   if (currentTime >= 1 || currentTime <= 0)
   {
       timestep *= -1;
   }
}
0
02 июл. '14 в 23:26
источник

Вот как работает XNA, каждый кадр он вызывает обновление методов и рисует главную страницу игры. Нам нужно отслеживать, в каком направлении движется ваш спрайт, и его положение позволяет добавить в основной файл игры:

public Vector2 rectanglePosition = new Vector2(0,0);
public bool moveRight = true;

Теперь вы хотите, чтобы каждый кадр обновлял позицию и использовал ее для рисования объекта. Поэтому в методе обновления у вас есть что-то вроде

if (moveRight)  
rectanglePosition.Y += 10;  
else  
rectanglePosition.Y -= 10; 

if(rectanglePosition.Y>100 || rectanglePosition.Y<0) 
moveRight = !moveright;

Затем в методе рисования просто нарисуйте спрайт на основе позиции (вы можете начать с рисования прямоугольника), который вы можете легко найти, как сделать.

Я могу помочь вам, если вы не получите код.

0
06 июл. '14 в 6:26
источник

Посмотрите другие вопросы по меткам или Задайте вопрос