2015-11-03 4 views
0

При запуске приложения объект появляется в данной позиции (данный вектор). Но когда я свожу к минимуму окно моногейма и снова его открываю, объект находится в верхнем левом углу.Сброс позиции при минимизации

Почему это происходит?

Примечание: это мой Draw метод:

public virtual void Draw(GameTime gameTime, SpriteBatch spriteBatch) 
{ 
    // Position is the object position 
    spriteBatch.Draw(textureImage, position, new Rectangle(
    (currentFrame.X * frameSize.X), 
    (currentFrame.Y * frameSize.Y), 
    frameSize.X, frameSize.Y), 
    Color.White, 0, Vector2.Zero, 2, SpriteEffects.None, 0); 
} 

Как стартовая позиция рассчитывается следующим образом:

// Vector2 position is the starting position for the object 

public PlayerMovement(Texture2D textureImage, Vector2 position, Point frameSize, int collisionOffSet, Point currentFrame, Point startFrame, Point sheetSize, float speed, float speedMultiplier, float millisecondsPerFrame) 
     : base(textureImage, position, frameSize, collisionOffSet, currentFrame, startFrame, sheetSize, speed, speedMultiplier, millisecondsPerFrame) 
{ 
     children = new List<Sprite>(); 
} 

Я использую Vector2 direction знать, в каком направлении спрайт облицовочный:

public abstract Vector2 direction 
    { 
     get; 
    } 

Я использую get в своих PlayerMovement класс и вернуть inputDirection * speed

(inputDirection является Vector2)

Наконец в моем Update методе, я position += direction и я также проверить, если игрок не касаясь границ экрана (он не может двигаться на экране.).

+0

, как это currentFrame и Рассчитывается значение frameSize? –

+0

'currentFrame' - текущий кадр в анимации. Я назначил переменную как долго игра ждет, когда она отображает следующий спрайт в анимации. «FrameSize» - это как большой спрайт в анимации (сколько пикселей в высоту и в witdth). Но это не проблема, я думаю, потому что анимация работает хорошо. – Jelle

+0

Я проверяю 'IsActive' в основном классе' Game'? – Jelle

ответ

1

Из моего собственного опыта использование Game.Window.ClientBounds в вызове Update вызвало проблемы, когда окно минимизировано. Вот некоторые примеры кода из моего проекта:

Rectangle gdm = Game.Window.ClientBounds; 
if (DrawLocation.X < 0) DrawLocation = new Vector2(0, DrawLocation.Y); 
if (DrawLocation.Y < 0) DrawLocation = new Vector2(DrawLocation.X, 0); 
if (DrawLocation.X > gdm.Width - DrawAreaWithOffset.Width) DrawLocation = new Vector2(gdm.Width - DrawAreaWithOffset.Width, DrawLocation.Y); 
if (DrawLocation.Y > gdm.Height - DrawAreaWithOffset.Height) DrawLocation = new Vector2(DrawLocation.X, gdm.Height - DrawAreaWithOffset.Height); 

Проблема, которую я имел, когда сведение к минимуму, что Game.Window.ClientBounds возвращал некоторые ширина/высота около -32000. При восстановлении окна всегда будут сброшены мои игровые объекты в определенное место по умолчанию. Я установил его первой проверки, что ClientBounds Width и Height оба были больше нуля:

Rectangle gdm = Game.Window.ClientBounds; 
if (gdm.Width > 0 && gdm.Height > 0) //protect when window is minimized 
{ 
    if (DrawLocation.X < 0) 
     DrawLocation = new Vector2(0, DrawLocation.Y); 
    if (DrawLocation.Y < 0) 
     DrawLocation = new Vector2(DrawLocation.X, 0); 
    if (DrawLocation.X > gdm.Width - DrawAreaWithOffset.Width) 
     DrawLocation = new Vector2(gdm.Width - DrawAreaWithOffset.Width, DrawLocation.Y); 
    if (DrawLocation.Y > gdm.Height - DrawAreaWithOffset.Height) 
     DrawLocation = new Vector2(DrawLocation.X, gdm.Height - DrawAreaWithOffset.Height); 
} 

Для справки, вот diff of changes, что устранило проблему минимизации для моего собственного проекта.

Отдельная ошибка, с которой я сталкивался, играя с игрой, когда игра не была основным, активным окном. Кроме того, можно добавить проверку на Game.IsActive в начале ваших Update и Draw звонков:

public override void Update(GameTime gt) 
{ 
    if(!IsActive) return; 
    //etc... 
} 

Или, если с помощью игры компонентов, ваш компонент обновление/Жеребьевка будет выглядеть так:

public override void Update(GameTime gt) 
{ 
    if(!Game.IsActive) return; 
    //etc... 
} 
+0

Это сработало, спасибо! – Jelle

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