C# XNA Framework-尝试正确重载System.EventHandler<;Platformer.PlayerIndexEventArgs>;
我对C#和XNA是新手。我目前正在制作一个游戏的选项菜单。选项菜单执行以下操作:C# XNA Framework-尝试正确重载System.EventHandler<;Platformer.PlayerIndexEventArgs>;,c#,xna-4.0,C#,Xna 4.0,我对C#和XNA是新手。我目前正在制作一个游戏的选项菜单。选项菜单执行以下操作: 声音(开或关) 亮度(增加/减少) 记分板(查看5个最高分) 控件(显示如何使用控件) 我在互联网上找到了一些处理亮度的代码,但它是使用Game.cs类实现的。我试图在OptionsMenuScreen.cs类(从Gamescreen.cs继承)中使用该代码 我遇到的问题是,我的名为BrightnessSelected的EventHandler重载了一些额外的参数,用于处理触摸输入,以便用户可以使屏幕变亮/变暗。此
#region Using Statements
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.Input.Touch;
using Microsoft.Xna.Framework.Media;
#endregion
namespace Platformer
{
/// <summary>
/// The options screen is brought up over the top of the main menu
/// screen, and gives the user a chance to configure the game
/// in various hopefully useful ways.
/// </summary>
class OptionsMenuScreen : MenuScreen
{
#region Fields
GraphicsDevice graphicsDevice;
SpriteBatch spriteBatch;
Texture2D whiteTexture;
int brightnessStart;
int contrastStart;
BlendState brightnessBlend;
BlendState contrastBlend;
MenuEntry sound1;
MenuEntry brightness;
MenuEntry scoreboard;
MenuEntry controls;
static bool soundonoff = true;
#endregion
#region Initialization
/// <summary>
/// Constructor.
/// </summary>
public OptionsMenuScreen()
: base("Options")
{
// Create our menu entries.
sound1 = new MenuEntry(string.Empty);
brightness = new MenuEntry(string.Empty);
scoreboard = new MenuEntry(string.Empty);
controls = new MenuEntry(string.Empty);
SetMenuEntryText();
// Hook up menu event handlers.
brightness.Selected += brightnessSelected;
sound1.Selected += sound1Selected;
scoreboard.Selected += scoreboardSelected;
controls.Selected += controlsSelected;
// Add entries to the menu.
MenuEntries.Add(sound1);
MenuEntries.Add(brightness);
MenuEntries.Add(controls);
MenuEntries.Add(scoreboard);
}
protected void Initialize()
{
// TODO: Add your initialization logic here
brightnessStart = 255;
contrastStart = 128;
brightnessBlend = new BlendState();
brightnessBlend.ColorSourceBlend = brightnessBlend.AlphaSourceBlend = Blend.Zero;
brightnessBlend.ColorDestinationBlend = brightnessBlend.AlphaDestinationBlend
= Blend.SourceColor;
contrastBlend = new BlendState();
contrastBlend.ColorSourceBlend = contrastBlend.AlphaSourceBlend = Blend.DestinationColor;
contrastBlend.ColorDestinationBlend = contrastBlend.AlphaDestinationBlend = `Blend.SourceColor;`
}
public virtual void LoadContent()
{
whiteTexture = new Texture2D(graphicsDevice, 1, 1);
whiteTexture.SetData<Color>(new Color[] { Color.White });
// Create a new SpriteBatch, which can be used to draw textures.
spriteBatch = new SpriteBatch(graphicsDevice);
}
public virtual void Draw(GameTime gameTime)
{
graphicsDevice.Clear(Color.CornflowerBlue);
// TODO: Add your drawing code here
spriteBatch.Begin(SpriteSortMode.Immediate, brightnessBlend);
spriteBatch.Draw(whiteTexture, new Rectangle(0, 0, 480, 800), new Color(brightnessStart, `brightnessStart, brightnessStart, 255));`
spriteBatch.End();
spriteBatch.Begin(SpriteSortMode.Immediate, contrastBlend);
spriteBatch.Draw(whiteTexture, new Rectangle(0, 0, 480, 800), new Color(contrastStart, `contrastStart, contrastStart, 255));`
spriteBatch.End();
graphicsDevice.BlendState = BlendState.Opaque;
base.Draw(gameTime);
}
/// <summary>
/// Fills in the latest values for the options screen menu text.
/// </summary>
void SetMenuEntryText()
{
sound1.Text = "Sound " + (soundonoff ? "on" : "off");
brightness.Text = "Brightness ";
scoreboard.Text = "Scoreboard ";
controls.Text = "Controls ";
}
#endregion
#region Handle Input
/// <summary>
/// Event handler for when the Sound menu entry is selected.
/// </summary>
///
protected void Update(GameTime gameTime)
{
foreach (TouchLocation t in TouchPanel.GetState())
{
if ((t.State == TouchLocationState.Pressed)
|| (t.State == TouchLocationState.Moved))
{
if (t.Position.Y <= 400)
brightnessSelected(t, ref brightnessStart);
}
else
brightnessSelected(t, ref contrastStart);
}
}
void sound1Selected(object sender, PlayerIndexEventArgs e)
{
soundonoff = !soundonoff;
SetMenuEntryText();
}
/// <summary>
/// Event handler for when the Brightness menu entry is selected.
/// </summary>
void brightnessSelected(object sender, PlayerIndexEventArgs e, TouchLocation t, ref int adjustee)
{
if (t.Position.X < 240)
adjustee -= 3;
else
adjustee += 3;
adjustee = Math.Max(Math.Min(adjustee, 255), 0);
SetMenuEntryText();
}
/// <summary>
/// Event handler for when the Scoreboard menu entry is selected.
/// </summary>
void scoreboardSelected(object sender, PlayerIndexEventArgs e)
{
//need to find a way to transition to HighScoreScreen.cs here
//ScreenManager.AddScreen(new HighScoreScreen(), e.PlayerIndex);
SetMenuEntryText();
}
/// <summary>
/// Event handler for when the Control menu entry is selected.
/// </summary>
void controlsSelected(object sender, PlayerIndexEventArgs e)
{
//ScreenManager.AddScreen(new ControlScreen(), e.PlayerIndex);
SetMenuEntryText();
}
#endregion
}
}
#使用语句的区域
使用制度;
使用System.Collections.Generic;
使用System.Linq;
使用Microsoft.Xna.Framework;
使用Microsoft.Xna.Framework.Audio;
使用Microsoft.Xna.Framework.Content;
使用Microsoft.Xna.Framework.GamerServices;
使用Microsoft.Xna.Framework.Graphics;
使用Microsoft.Xna.Framework.Input;
使用Microsoft.Xna.Framework.Input.Touch;
使用Microsoft.Xna.Framework.Media;
#端区
命名空间平台
{
///
///选项屏幕显示在主菜单顶部
///屏幕,并让用户有机会配置游戏
///以各种有用的方式。
///
类选项菜单筛选:菜单筛选
{
#区域字段
图形设备图形设备;
SpriteBatch SpriteBatch;
纹理2d白色纹理;
int brightnessStart;
int启动;
混合状态亮度混合;
混合状态;
菜单声音1;
亮度;
菜单记分牌;
月经量控制;
静态bool soundonoff=真;
#端区
#区域初始化
///
///构造器。
///
公共选项菜单筛选()
:基本(“选项”)
{
//创建菜单项。
sound1=新菜单项(string.Empty);
亮度=新菜单项(string.Empty);
记分牌=新菜单(string.Empty);
控件=新菜单项(string.Empty);
SetMenuEntryText();
//连接菜单事件处理程序。
亮度。所选+=所选亮度;
sound1.所选+=所选sound1;
记分牌。已选择+=已选择记分牌;
控件。所选+=所选控件;
//在菜单中添加条目。
菜单。添加(声音1);
菜单项。添加(亮度);
菜单项。添加(控件);
菜单。添加(记分板);
}
受保护的void初始化()
{
//TODO:在此处添加初始化逻辑
亮度开始=255;
对比度开始=128;
brightnessBlend=新的混合状态();
brightnessBlend.ColorSourceBlend=brightnessBlend.AlphaSourceBlend=Blend.Zero;
brightnessBlend.ColorDestinationBlend=brightnessBlend.AlphaDestinationBlend
=Blend.SourceColor;
对比混合=新混合状态();
ContractBlend.ColorSourceBlend=ContractBlend.AlphaSourceBlend=Blend.DestinationColor;
ContractBlend.ColorDestinationBlend=ContractBlend.AlphaDestinationBlend=`Blend.SourceColor`
}
公共虚拟void LoadContent()
{
白色纹理=新纹理2d(图形设备,1,1);
SetData(新颜色[]{Color.White});
//创建一个新的SpriteBatch,可用于绘制纹理。
spriteBatch=新spriteBatch(图形设备);
}
公共虚拟虚空抽签(游戏时间游戏时间)
{
图形设备。清晰(颜色:矢车菊蓝);
//TODO:在此处添加图形代码
spriteBatch.Begin(SpriteSortMode.Immediate,brightnessBlend);
绘制(白色纹理,新矩形(0,0480800),新颜色(brightnessStart,`brightnessStart,brightnessStart,255))`
spriteBatch.End();
spriteBatch.Begin(SpriteSortMode.Immediate、ControlBlend);
Draw(白色纹理,新矩形(0,0480800),新颜色(ContractStart,`ContractStart,ContractStart,255))`
spriteBatch.End();
graphicsDevice.BlendState=BlendState.不透明;
基础。抽签(游戏时间);
}
///
///填写选项屏幕菜单文本的最新值。
///
void SetMenuEntryText()
{
sound1.Text=“Sound”+(soundonoff?“开”:“关”);
亮度。Text=“亮度”;
scoreboard.Text=“scoreboard”;
controls.Text=“controls”;
}
#端区
#区域句柄输入
///
///选择声音菜单项时的事件处理程序。
///
///
受保护的无效更新(游戏时间游戏时间)
{
foreach(TouchPanel.GetState()中的触摸位置t)
{
if((t.State==TouchLocationState.Pressed)
||(t.State==TouchLocationState.Moved))
{
如果(t.Position.Y您无法将ref int adjustee
传递给事件处理程序,并期望将其值返回给被调用方。事件处理程序就是不能这样工作。请将其更多地视为可以响应事件的回调
接下来,您需要将EventArgs子类化并向其中添加您自己的数据,如下所示
public class MyEventArgs : EventArgs
{
private string msg;
public MyEventArgs( string messageData )
{
msg = messageData;
}
public string Message {
get { return msg; }
set { msg = value; }
}
}
请参阅这篇关于处理程序和参数的文章:
在本例中,您需要访问MenuEntry
的代码,并编辑它正在传递的TEventArgs
类型(在本例中,它使用的是PlayerIndexEventArgs
)。您可以子类化Play
int _brightness;
void brightnessSelectedEventHandler(object sender, BrightnessEventArgs e)
{
if (e.touch != null && e.touch.position != null)
{
const int TOUCH_POS_THRESHOLD = 240; // this is part of UI and should really be somewhere else, but put it here for convenience
if (e.touch.position.x < TOUCH_POS_THRESHOLD
adjustBrightness(-3);
else
adjustBrightness(3);
}
SetMenuEntryText();
}
void adjustBrightness(int offset)
{
_brightness += offset;
}