我的鼠标悬停在菜单上时遇到问题。我试图在鼠标悬停时突出显示各种菜单选项,但不确定我做错了什么。是的,当我将鼠标移到它们上面时,它只是非常快速地遍历它们。任何帮助将不胜感激。问题出在更新功能或测量菜单功能中。顺便说一句,我让键盘部分正常工作。
using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;
namespace Blocks
{
/// <summary>
/// This is a game component that implements IUpdateable.
/// </summary>
public class MenuComponents : Microsoft.Xna.Framework.DrawableGameComponent
{
string[] menuItems;
int selectedIndex;
Color normal = Color.White;
Color hilite = Color.Yellow;
KeyboardState keyboardState;
KeyboardState oldKeyboardState;
SpriteBatch spriteBatch;
SpriteFont spriteFont;
Vector2 position,size;
float width = 0f;
float height = 0f;
MouseState mouseState;
Rectangle area;
public int SelectedIndex
{
get { return selectedIndex; }
set
{
selectedIndex = value;
if (selectedIndex < 0)
selectedIndex = 0;
if (selectedIndex >= menuItems.Length)
selectedIndex = menuItems.Length - 1;
}
}
public MenuComponents(Game game, SpriteBatch spriteBatch, SpriteFont spriteFont, string[] menuItems)
: base(game)
{
// TODO: Construct any child components here
this.spriteBatch = spriteBatch;
this.spriteFont = spriteFont;
this.menuItems = menuItems;
MeasureMenu();
}
private void MeasureMenu()
{
height = 0;
width = 0;
foreach (string item in menuItems)
{
size = spriteFont.MeasureString(item);
if (size.X > width)
width = size.X;
height += spriteFont.LineSpacing + 5;
}
position = new Vector2((Game.Window.ClientBounds.Width - width) / 2,
((Game.Window.ClientBounds.Height - height) / 2) + 50);
int positionX = (int) position.X;
int positionY = (int) position.Y;
int areaWidth = (int) width;
int areaHeight = (int) height;
//for (int i = 0; i < area.Length; i++)
//{
area = new Rectangle(positionX, positionY, areaWidth, areaHeight);
//}
}
/// <summary>
/// Allows the game component to perform any initialization it needs to before starting
/// to run. This is where it can query for any required services and load content.
/// </summary>
public override void Initialize()
{
// TODO: Add your initialization code here
base.Initialize();
}
private bool CheckKey(Keys theKey)
{
return keyboardState.IsKeyUp(theKey) &&
oldKeyboardState.IsKeyDown(theKey);
}
/// <summary>
/// Allows the game component to update itself.
/// </summary>
/// <param name="gameTime">Provides a snapshot of timing values.</param>
public override void Update(GameTime gameTime)
{
// TODO: Add your update code here
keyboardState = Keyboard.GetState();
mouseState = Mouse.GetState();
Point mouseLocation = new Point(mouseState.X, mouseState.Y);
if (CheckKey(Keys.Down))
{
selectedIndex++;
if (selectedIndex == menuItems.Length)
selectedIndex = 0;
}
if (CheckKey(Keys.Up))
{
selectedIndex--;
if (selectedIndex < 0)
selectedIndex = menuItems.Length - 1;
}
if (area.Contains(mouseLocation))
{
selectedIndex++;
if (selectedIndex == menuItems.Length)
selectedIndex = 0;
if (selectedIndex < 0)
selectedIndex = menuItems.Length - 1;
}
base.Update(gameTime);
oldKeyboardState = keyboardState;
}
public override void Draw(GameTime gameTime)
{
base.Draw(gameTime);
Vector2 location = position;
Color tint;
for (int i = 0; i < menuItems.Length; i++)
{
if (i == selectedIndex)
tint = hilite;
else
tint = normal;
spriteBatch.DrawString(spriteFont, menuItems[i], location, tint);
location.Y += spriteFont.LineSpacing + 5;
}
}
}
}
答案 0 :(得分:1)
if (area.Contains(mouseLocation))
{
selectedIndex++;
if (selectedIndex == menuItems.Length)
selectedIndex = 0;
if (selectedIndex < 0)
selectedIndex = menuItems.Length - 1;
}
如果您将鼠标悬停在任何矩形上,该代码会使selectedIndex再次出现。 这可以解释每个人的骑自行车。
您需要检查每个菜单项的矩形,并相应地设置selectedIndex。
伪码:
for(int i = 0; i&lt; = menuItems.Count; i ++) { Rectangle rect = new Rectangle(position.X,position.Y +(i * heightOfMenuItemAndOffset),Width,Height);
Mouse.GetState(); Point mouseLocation = new Point(mouseState.X,mouseState.Y); if(area.Contains(mouseLocation) { selectedIndex = i; }
}
有些事情。