C# XNA Framework-尝试正确重载System.EventHandler<;Platformer.PlayerIndexEventArgs>;

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重载了一些额外的参数,用于处理触摸输入,以便用户可以使屏幕变亮/变暗。此

我对C#和XNA是新手。我目前正在制作一个游戏的选项菜单。选项菜单执行以下操作:

  • 声音(开或关)
  • 亮度(增加/减少)
  • 记分板(查看5个最高分)
  • 控件(显示如何使用控件)
  • 我在互联网上找到了一些处理亮度的代码,但它是使用Game.cs类实现的。我试图在OptionsMenuScreen.cs类(从Gamescreen.cs继承)中使用该代码

    我遇到的问题是,我的名为BrightnessSelected的EventHandler重载了一些额外的参数,用于处理触摸输入,以便用户可以使屏幕变亮/变暗。此重载会导致一些问题,因为它基于System.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;
    }