XNA鼠标位置相对于'改变每一个构建

时间:2014-06-08 18:34:47

标签: xna

好吧所以我开始制作一个小型Flash游戏的主菜单,为此我想用鼠标点击按钮等。我有一个按钮类,我在其中创建两个矩形:一个矩形用于鼠标的按钮和矩形基于X和Y,1像素乘1像素。我使用Rectangle.Intersects检查它们是否在触摸,然后才能看到鼠标左键是否已关闭。问题是,鼠标位置相对于每次更改的事情因此无论鼠标按钮在屏幕上的哪个位置,它都不会与在完全相同位置的不同构建中的坐标相同。我现在非常需要想法,因为我已经不多了。如果我没有很好地解释它,或者你需要更多细节来帮助请问 - 我会非常感激。

  • 如果我找到答案,我会回复

更新 - 好的,这是按钮类

    class OnScreenButton
    {
    public Texture2D texture;
    Vector2 position;
    Rectangle rectangle;

    Color colour = new Color(255, 255, 255, 255);

    public Vector2 size;

    public OnScreenButton(Texture2D newtexture, GraphicsDevice graphics)
    {
        texture = newtexture;

        // ScreenW = 500, ScreenH = 600
        // Img W = 80, Img H = 20
        size = new Vector2(graphics.Viewport.Width / 10, graphics.Viewport.Height / 30);
        size = new Vector2(texture.Width, texture.Height);

    }

    bool down;
    public bool isClicked;

    public void Update(MouseState mouseState)
    {
        rectangle = new Rectangle((int)position.X, (int)position.Y, (int)size.X, (int)size.Y);

        Rectangle mouseRectangle = new Rectangle(mouseState.X, mouseState.Y, 1, 1);

        if (mouseRectangle.Intersects(rectangle))
        {
            if (colour.A == 255)
            {
                down = false;
            }
            if (colour.A == 0)
            {
                down = true;
            }
            if (down)
            {
                colour.A += 3;
            }
            else
            {
                colour.A -= 3;
            }
            if (mouseState.LeftButton == ButtonState.Pressed)
            {
                isClicked = true;
            }

        }
        else if (colour.A < 255)
        {
            colour.A += 3;
            isClicked = false;
            colour.A = (255);
        }
    }

    public void SetPosition(Vector2 newPos)
    {
        position = newPos;
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(texture, rectangle, colour);
    }
    }
    }

(抱歉奇怪的格式化,堆栈溢出全新,发布仍然有点混乱) 以下是我认为相关的其他一些代码...

Game.1初始化内容

GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    protected override void Initialize()
    {
        // TODO: Add your initialization logic here
        Mouse.WindowHandle = Window.Handle;
        base.Initialize();
    }

    public Main()
    {
        graphics = new GraphicsDeviceManager(this);

        Content.RootDirectory = "Content";
    }

    KeyboardState keyboardState;
    MouseState mouseState;

主菜单更新例程......

private void UpdateMainMenu(GameTime gameTime)
    {
        // Button options
        if (buttonPlay.isClicked == true)
        {
            CreateNewGame();
            currentGameState = GameState.playing;
        }
        buttonPlay.Update(mouseState);

        if (buttonExit.isClicked == true)
        {
            this.Exit();
        }
        buttonExit.Update(mouseState);

        // Press enter to play
        if (keyboardState.IsKeyDown(Keys.Enter))
        {
            CreateNewGame();
            currentGameState = GameState.playing;
        }
    }

这是主菜单的绘制程序......

public void DrawMainMenu()
    {
        spriteBatch.Draw(mainMenuBackground, new Vector2(0, 0), Color.White);
        buttonPlay.Draw(spriteBatch);
        buttonExit.Draw(spriteBatch);
        spriteBatch.DrawString(playerAmmoFont, String.Format("{0}", mouseState), new Vector2(0, 0), Color.White);
    }

好的,这就是我能想到的全部

更新 - 好的,所以我知道一些不是问题的事情...... 整个我的按钮类很好,我做了一个新的项目,并将所有相关的代码插入其中,它完美地工作,所以我开始认为它与代码定位和图形设备的东西有关,虽然我仍然没有线索如何解决它。

  • 每次出现在同一地点的窗口
  • 所有
  • 的坐标都没有模式
  • 这真令人讨厌

更新 - 好的。我花了很长时间写下每次运行代码时得到的坐标,并将光标粘在屏幕的右上角。这就是我得到的。

  • ( - 203,-225)
  • ( - 253,-275)
  • ( - 53,-75)
  • ( - 103,-125)
  • ( - 153,-175)
  • ( - 203,-225)
  • ( - 253,-275)
  • ( - 53,-75)
  • ( - 103,-125)
  • ( - 153,-175)
  • ( - 203,-225)
  • ( - 253,-275)
  • ( - 53,-75)
  • ( - 103,-125)
  • ( - 153,-175)
  • ( - 203,-225)
  • ( - 253,-275)
  • ( - 53,-75)
  • ( - 103,-125)
  • ( - 153,-175)
  • ( - 203,-225)
  • ( - 78,-100)
  • ( - 128,-150)
  • ( - 178,-200)
  • ( - 228,-250)
  • ( - 28,-50)
  • ( - 53,-75)
  • ( - 103,-125)
  • ( - 153,-175)&lt;从这里出来的图案LOOPS ROUND。

我只是不知道相同的代码如何在不同的执行上执行不同的错误。

另外,mouse.Wheel不上升或下降,而它适用于我测试相关代码的项目,其中鼠标位置与游戏窗口的左上角像素相关。

更新 - 甚至更多的修复 - 所以我只是再次弯曲几次并且偏移值被抵消...增加是相同的但我得到的值(-178,-200)然后(-228, -250)。我还发现鼠标与游戏窗口无关,如果我将鼠标卡在屏幕的右上角并检查坐标,然后移动游戏窗口并再次执行相同操作,坐标不要不要改变。请帮助我,或告诉我,如果我是愚蠢的,或者其他什么。感谢。

2 个答案:

答案 0 :(得分:0)

鼠标坐标相对于显示器。这是我的常规按钮类,可以根据您的情况进行操作。

public class Button
{  
    public event EventHandler<EventArgs> Clicked;

    public Vector2 Position { get; set;}

    public Texture2D Texture { get; set;}

    public Color Tint { get; set; }

    public float Scale { get; set; }
    public float Rotation { get; set; }        

    public int Width
    {
        get
        {
            if (texture == null)
                return 0;
            else
                return texture.Width;
        }
    }

    public int Height
    {
        get
        {
            if (texture == null)
                return 0;
            else
                return texture.Height;
        }
    }

    private void OnClick()
    {
        if (Clicked != null)
            Clicked(this, EventArgs.Empty);
    }

    public Button(Vector2 position, Texture2D texture)
        : base(parent)
    {
        Position = position;      
        Texture = texture;   

        Tint = Color.White; 

        Scale = 1.0f;
        Rotation = 0.0f;  
    }

    public bool HandleClick(Vector2 vector)
    {
        if (vector.X >= Position.X)
        {
            if (vector.X <= Position.X + Width)
            {
                if (vector.Y >= Position.Y)
                {
                    if (vector.Y <= Position.Y + Height)
                    {
                        OnClick();
                        return true;
                    }
                }
            }
        }

        return false;
    }

    public bool HandleEntered(Vector2 vector)
    {
        if (vector.X >= Position.X)
        {
            if (vector.X <= Position.X + Width)
            {
                if (vector.Y >= Position.Y)
                {
                    if (vector.Y <= Position.Y + Height)
                    {
                        return true;
                    }
                }
            }
        }

        return false;
    }

    public override void Draw(SpriteBatch spriteBatch)
    {
        spriteBatch.Draw(Texture, Position, null, Tint, Rotation, Vector2.Zero, Scale, SpriteEffects.None, 0.0f); 
    }

声明一个按钮:

Button btn = new Button(position where you want the button, texture for the button);

btn.Clicked += () => { /* Handle button clicked code here */ };

在主游戏中的更新方法中:

public void Update (GameTime gameTime)
{
    MouseState mouseState = Mouse.GetState();

    if(mouseState.LeftButton == ButtonState.Pressed) // check if mouse is clicked
    {
        btn.HandleClicked(new Vector2(mouseState.X, mouseState.Y)); // If true then the button clicked event will fire
        // Here you can also change the color of the button if the button is currently clicked
    }

    // Here you can change the color of the button if the mouse is hover over the control
    // Example: 
    btn.Tint = btn.HandleEntered(new Vector2(mouseState.X, mouseState.Y)) ? Color.White * 0.75f : Color.White;
}

注意:您还可以使用矩形按钮来调整其大小,而不是严格使用纹理尺寸。希望这能提供一些见解。

答案 1 :(得分:0)

所以这就是发生的事情:我的游戏中每个子弹射击都有一个子弹课。在这个课程中,我会检查子弹是否击中,撞击小行星,或者是否会破坏小行星。如果后者是真的那么我会将playerScore增加5. PlayerScore是一个Game1属性所以我认为最简单的方法是在bullet.cs中创建一个新的Game1以允许我引用该变量。删除Bullet.cs中的“Main mainGame = new Main():”修复了这个问题,我认为这个问题来自于我每次发射一颗子弹时都会生成一个新的图形设备。