2015-03-27 3 views
0

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

У меня есть движущийся фон (в настоящее время идет вверх и вниз сверху вниз) У меня есть движущийся объект (в настоящее время движется влево и вправо от центра холста программно).

Итак, это вопрос, как я могу сделать объект перемещающимся относительно позиции на холсте в направлениях x и y?

Вот мои соответствующие коды:

//Helper method 
    private Vector2 CalculateDirection() 
    { 
     Vector2 calculatedDirection = new Vector2((float)Math.Cos(direction), 
      (float)Math.Sin(direction)); 
     calculatedDirection.Normalize(); 
     return calculatedDirection; 
    } 

объект на холсте

public void Update(GameTime gameTime, Vector2 center) 
    { 
     this.currentCentre = originalCentre - center; 
     //movement logic here 
     Vector2 calculatedDirection = CalculateDirection(); 
     //deltaTime = ((float)gameTime.ElapsedGameTime.TotalMilliseconds)/15f; 

     if (speed > 0f || speed < 0f) 
     { 
      ///TODO: work this out!! 
      Velocity = calculatedDirection * speed; 
      float dir = (originalCentre.Y - currentCentre.Y); 
      position.X += Velocity.X * (1.0f - 0.9f); 
      position.Y = dir;// *(1.0f - 0.9f); 
     } 
    } 

холст перемещения методы

private void determinePitchSize() 
    { 
     int newHeight = Convert.ToInt32(pitch.Height * ratio); 
     this.canvas = new Rectangle(
      0, posHeight, 
      device.PresentationParameters.BackBufferWidth, 
      newHeight 
      ); 
    } 

    public void increasePosHeight() 
    { 
     posHeight++; 
    } 

    public void decreasePosHeight() 
    { 
     posHeight--; 
    } 

    private void determineDirection() 
    { 
     if (!direction) 
     { 
      if (this.canvas.Height + this.canvas.Y <= this.screenY) 
       direction = true; 
     } 
     else 
     { 
      if (this.canvas.Y >= 0) 
       direction = false; 
     } 
    } 
    private void useDirection() 
    { 
     this.determineDirection(); 

     if (direction) 
      this.increasePosHeight(); 
     else decreasePosHeight(); 
    } 

Если вам нужна дополнительная информация, я могу добавить его здесь.

Благодаря

+0

Просто добавьте положение холста к позиции объекта перед рисованием? –

+0

Я думаю, что я слишком усложнил это, я попытаюсь немного разбить его и посмотреть, смогу ли я получить его правильно. Я подозреваю, что когда я это выясню, я разрешу это. Хорошо, поэтому рисовать его в середине холста легко. У меня это было освоено как position = center в методе обновления. – Adsy2010

+0

Как я уже говорил, сохраните относительное положение и сделайте 'position = center + relativePosition'. Простой случай, который вы упомянули, относится к относительной позиции '(0, 0)'. –

ответ

0

ИТАК благодаря Нико, я смог ответить на этот вопрос.

Vector2 Velocity { get; set; } 
    Vector2 relative { get; set; } 
    public void Update(GameTime gameTime, Vector2 center) 
    { 

     this.currentCentre = center; 

     Vector2 calculatedDirection = CalculateDirection(); 


     if (speed > 0f || speed < 0f) 
     { 
      Velocity = calculatedDirection * speed * 0.1f; 
      relative = relative - Velocity; 
      position = currentCentre + relative; 

     } 
    } 

Скорость создает движение объекта, чтобы проверить, что оно попадает в другое место.

Относительное начало в 0,0 (в центре) и регулируется скоростью.

Положение затем устанавливается в центр плюс относительное положение. который был задан скоростью.

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