Почему моя игра неправильно интерпретирует координаты указателей мыши

У меня есть моноигра (2D), которую я делаю, и когда я пытаюсь получить координаты мыши, они неверны. Я понятия не имею, в чем проблема, но вот мой код, где я получаю координаты:

MouseState mouseState;
mouseState = Mouse.GetState();
test = new Tower(TowerTexture, new Vector2(mouseState.X, mouseState.Y));
//test is drawn where mouse pointer is thought to be and it is drawn off

Вот код отрисовки башни:

    foreach (Tower tower in towers)
    {
        tower.Draw(spriteBatch);
    }

А вот функция рисования башни:

public virtual void Draw(SpriteBatch spriteBatch)
{
    spriteBatch.Draw(texture, center, null, Color.White, rotation,
    origin, 1.0f, SpriteEffects.None, 0);
}

Еще один момент заключается в том, что по мере приближения реального указателя мыши к верхнему левому углу смещение предполагаемых координат мыши меньше, но по мере приближения к нижнему правому углу экрана предполагаемые координаты мыши подальше. Честно говоря, я понятия не имею, что не так, но любые мысли о том, что может быть не так, будут оценены. Спасибо!


person Detinator10    schedule 28.01.2014    source источник
comment
координаты неверны... каким образом?   -  person melak47    schedule 29.01.2014
comment
Не могли бы вы вставить код, где вы рисуете башни?   -  person Aleksandar Toplek    schedule 29.01.2014
comment
Возможно, вы захотите предоставить дополнительную информацию о том, как местоположение, возвращаемое mouseState.X и mouseState.Y, отключено. Согласно документации возвращаемые координаты относятся к верхнему левому углу окна игры.   -  person Paige DePol    schedule 29.01.2014
comment
Координаты не там, где на самом деле находится указатель мыши. И я опубликую этот код через секунду.   -  person Detinator10    schedule 29.01.2014
comment
Я также попытался сделать тест класса, отличного от растения, и результаты были такими же.   -  person Detinator10    schedule 29.01.2014
comment
Да, я имею в виду, что когда я рисую спрайт в предполагаемом месте указателя мыши, спрайт не рисуется в правильном месте, где действительно находится указатель мыши.   -  person Detinator10    schedule 29.01.2014
comment
Одна примечательная вещь, однако, заключается в том, что по мере того, как вы перемещаете указатель мыши ближе к верхнему левому углу, смещение спрайта, отрисовываемого указателем мыши, становится все меньше и меньше, а по мере того, как вы перемещаете его дальше и ближе к нижнему правому углу. screen смещение спрайта от реального указателя мыши больше.   -  person Detinator10    schedule 29.01.2014
comment
Вы пытались установить игру в полноэкранный режим, а также установить PrefferedBackBufferWidth and Height таким же, как у монитора?   -  person davidsbro    schedule 29.01.2014
comment
Что такое mouseState.X и mouseState.Y, когда мышь находится в правом нижнем углу окна? Как насчет верхнего левого? Что это должно быть? Я бы предложил напечатать значение mouseState.X, mouseState.Y в журнале отладки, чтобы устранить любые проблемы, которые могут быть в вашем коде рендеринга.   -  person Goose    schedule 29.01.2014
comment
x равно 1364, а y равно 766, когда указатель находится в правом нижнем углу.   -  person Detinator10    schedule 29.01.2014
comment
А в верхнем левом углу 0,0   -  person Detinator10    schedule 29.01.2014
comment
Размеры фона 1920 по x и я не уверен насчет y   -  person Detinator10    schedule 29.01.2014
comment
@Detinator10, ты задавал этот вопрос 3 раза и каждый раз вводишь один и тот же код. Если никто не смог вам помочь в первые два раза, вы можете подумать о добавлении дополнительного кода, такого как «Обновление» и «Инициация башен». Также я бы проверил в своей игре все, что может влиять на разрешение экрана, например graphicsdevice.PresentationParameters.PreferredBackBufferWidth и graphics.IsFullScreen, а также проверил разрешение самого монитора компьютера. Я очень сомневаюсь, что Mouse.Getstate возвращает неправильные значения. Я бы также попробовал свою игру на другом компьютере, если бы мог.   -  person davidsbro    schedule 29.01.2014
comment
я попробую это спасибо   -  person Detinator10    schedule 29.01.2014
comment
Я проверил разрешение своего экрана, и случайно разрешение моего экрана соответствует предполагаемому указателю мыши. Если я перемещаю указатель мыши в правый нижний угол, координаты предполагаемого указателя мыши являются разрешением моего экрана.   -  person Detinator10    schedule 30.01.2014
comment
Кто-нибудь знает, что я могу сделать, чтобы исправить это? @davidsbro   -  person Detinator10    schedule 30.01.2014


Ответы (2)


Это ответ как на этот вопрос, так и на ваш вопрос отложен. Чтобы решить эту проблему, вы можете уменьшить масштаб изображения при его рисовании. Я не совсем уверен, каково значение center, но я предполагаю, что это прямоугольник с центром на указателе мыши. Чтобы уменьшить изображение, попробуйте что-то вроде этого:

Rectangle center;

public Tower(Texture2D TowerTexture, Vector2 location)
{
    float scaledown = 10;
    float XOffset = TowerTexture.Width / (2 * scaledown); //get an X and Y offset to center the image in the rectangle
    float YOffset = TowerTexture.Height / (2 * scaledown);
    this.center = new Rectangle(location.X + XOffset, location.Y + YOffset, 
        XOffset * 2, YOffset * 2);
}

Затем нарисуйте это изображение, как вы делали ранее, используя center в качестве прямоугольника назначения. Я написал этот код без компилятора или отладки, но я думаю, что он должен дать вам основную идею. ХТН

person davidsbro    schedule 01.02.2014
comment
Когда я говорил об изображении, я имел в виду фон - person Detinator10; 01.02.2014
comment
@ Detinator10, вы можете использовать что-то похожее на то, что я написал выше. Просто измените центральный прямоугольник фона на new Rectangle(0,0,1366, 768). - person davidsbro; 01.02.2014
comment
Я сделал это, и это сработало, единственное, что теперь мои враги появляются за пределами экрана. И еще, если бы я играл в игру с другим разрешением монитора, игра по-прежнему рисовала бы то же самое? - person Detinator10; 01.02.2014
comment
Я не уверен, почему ваши враги будут появляться за кадром, так как я не знаю кода, но я бы попробовал что-то похожее на то, что я поставил для появления башен. И нет, игра рисовала бы иначе. Однако то, что вы можете сделать вместо new Rectangle(0, 0, 1366, 768), это получить разрешение экрана, выполнив new Rectangle(0, 0, GraphicsDevice.PresentationParameters.BackBufferWidth, GraphicsDevice.PresentationParameters.BackBufferHeight). Это нарисует фон в соответствии с разрешением компьютера (если вы не установили ни одно из свойств и игра находится в полноэкранном режиме). - person davidsbro; 02.02.2014

Что не так, так это то, что разрешение моего изображения больше, чем разрешение моего экрана.

person Detinator10    schedule 30.01.2014