Câu hỏi này cần nhiều lambdas.
Lưu ý đây là từ WIP, vì vậy có một số tính năng chưa được sử dụng và ngụ ý nhưng chưa được thực hiện. Nơi bạn nhìn thấy () =>
thêm của bạn inputDirection.X -= -1;
. Tôi nhận ra điều này là dành cho một Tay chơi game và bạn đang sử dụng bàn phím, nhưng nguyên tắc nhóm hoặc ít nhất là khái niệm bản đồ hành động vẫn được áp dụng.
Đây có lẽ là quá mức cần thiết, nhưng rất nhiều niềm vui!
Chức năng thiết lập ánh xạ các điều khiển:
public void SetController(MyGamePad controller)
{
controller.ClearActions();
controller.BindAction(Buttons.Start, ButtonGroup.FullyExclusive, () => sine.play());
controller.BindAction(Buttons.A,
ButtonGroup.FaceButtons, () => showText("A!"));
controller.BindAction(Buttons.A | Buttons.B,
ButtonGroup.FaceButtons, () => showText("A and B!"));
controller.BindAction(Buttons.B,
ButtonGroup.FaceButtons, () => showText("B"));
controller.BindAction(Buttons.B | Buttons.Y,
ButtonGroup.FaceButtons, () => showText("B and Y!"));
controller.BindAction(Buttons.Y,
ButtonGroup.FaceButtons, () => showText("Y!"));
controller.BindAction(Buttons.Y | Buttons.X,
ButtonGroup.FaceButtons, () => showText("Y and X!"));
controller.BindAction(Buttons.X,
ButtonGroup.FaceButtons, () => showText("X!"));
controller.BindAction(Buttons.X | Buttons.A,
ButtonGroup.FaceButtons, () => showText("X n A, I made a funny!"));
controller.BindAction(0x0,
ButtonGroup.FaceButtons, () => showText("Nothing on the face buttons."));
controller.BindAction(0x0,
ButtonGroup.ShoulderButtons, () => showText("No shoulder buttons"));
controller.BindAction(Buttons.LeftShoulder,
ButtonGroup.ShoulderButtons, () => showText("Left shoulder button!"));
controller.BindAction(Buttons.RightShoulder,
ButtonGroup.ShoulderButtons, () => showText("Right shoulder button!"));
controller.BindAction(0x0,
ButtonGroup.DirectionalPad, () => showText("Nothin' on the dpad!"));
controller.BindAction(Buttons.DPadUp,
ButtonGroup.DirectionalPad, () => showText("DPAD UP!"));
controller.BindAction(Buttons.DPadDown,
ButtonGroup.DirectionalPad, () => showText("DPAD DOWN!"));
}
Thành phần trò chơi giúp nó hoạt động (khởi tạo 1 cho mỗi người chơi):
using System;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Input;
using System.Collections.Generic;
namespace MyGame
{
[Flags]
public enum ButtonGroup
{
NonExclusive = 0x00,
FaceButtons = 0x01,
DirectionalPad = 0x02,
ShoulderButtons = 0x04,
LeftSide = 0x08,
RightSide = 0x10,
FullyExclusive = 0xFF,
}
class MyGamePad : GameComponent
{
private Buttons FaceButtons;
private Buttons DirectionalButtons;
private Buttons ShoulderButtons;
private Buttons LeftSideButtons;
private Buttons RightSideButtons;
private Buttons AllButtons;
private PlayerIndex playerIndex;
private Dictionary<KeyValuePair<Buttons, ButtonGroup>, Action> actionMap = new Dictionary<KeyValuePair<Buttons, ButtonGroup>, Action>();
public InstrumentPad(Game game, PlayerIndex playerIndex) : base(game)
{
this.playerIndex = playerIndex;
}
public void ClearActions()
{
actionMap.Clear();
}
public override void Update(GameTime gameTime)
{
base.Update(gameTime);
updateButtons();
foreach (KeyValuePair<Buttons, ButtonGroup> pair in actionMap.Keys)
{
switch (pair.Value)
{
case ButtonGroup.DirectionalPad:
if (DirectionalButtons == pair.Key)
actionMap[pair].Invoke();
break;
case ButtonGroup.FaceButtons:
if (FaceButtons == pair.Key)
actionMap[pair].Invoke();
break;
case ButtonGroup.ShoulderButtons:
if (ShoulderButtons == pair.Key)
actionMap[pair].Invoke();
break;
case ButtonGroup.LeftSide:
if (LeftSideButtons == pair.Key)
actionMap[pair].Invoke();
break;
case ButtonGroup.RightSide:
if (RightSideButtons == pair.Key)
actionMap[pair].Invoke();
break;
case ButtonGroup.FullyExclusive:
if (AllButtons == pair.Key)
actionMap[pair].Invoke();
break;
case ButtonGroup.NonExclusive:
if ((AllButtons & pair.Key) == pair.Key)
actionMap[pair].Invoke();
break;
}
}
}
public void BindAction(Buttons buttonCombo, ButtonGroup buttonGrouping, Action action)
{
KeyValuePair<Buttons, ButtonGroup> pair = new KeyValuePair<Buttons, ButtonGroup>(buttonCombo, buttonGrouping);
if (!actionMap.ContainsKey(pair))
actionMap.Add(pair, action);
else
actionMap[pair] = action;
}
private void updateButtons()
{
GamePadState padState = GamePad.GetState(playerIndex);
LeftSideButtons = 0x0;
RightSideButtons = 0x0;
FaceButtons = 0x0;
if (padState.Buttons.A == ButtonState.Pressed)
FaceButtons |= Buttons.A;
if (padState.Buttons.B == ButtonState.Pressed)
FaceButtons |= Buttons.B;
if (padState.Buttons.X == ButtonState.Pressed)
FaceButtons |= Buttons.X;
if (padState.Buttons.Y == ButtonState.Pressed)
FaceButtons |= Buttons.Y;
RightSideButtons |= FaceButtons;
DirectionalButtons = 0x0;
if (padState.DPad.Up == ButtonState.Pressed)
DirectionalButtons |= Buttons.DPadUp;
if (padState.DPad.Down == ButtonState.Pressed)
DirectionalButtons |= Buttons.DPadDown;
if (padState.DPad.Left == ButtonState.Pressed)
DirectionalButtons |= Buttons.DPadLeft;
if (padState.DPad.Right == ButtonState.Pressed)
DirectionalButtons |= Buttons.DPadRight;
LeftSideButtons |= DirectionalButtons;
ShoulderButtons = 0x0;
if (padState.Buttons.LeftShoulder == ButtonState.Pressed)
{
ShoulderButtons |= Buttons.LeftShoulder;
LeftSideButtons |= Buttons.LeftShoulder;
}
if (padState.Buttons.RightShoulder == ButtonState.Pressed)
{
ShoulderButtons |= Buttons.RightShoulder;
RightSideButtons |= Buttons.RightShoulder;
}
AllButtons = LeftSideButtons | RightSideButtons;
if (padState.Buttons.Start == ButtonState.Pressed)
AllButtons |= Buttons.Start;
if (padState.Buttons.Back == ButtonState.Pressed)
AllButtons |= Buttons.Back;
}
}
}