我试图编写一个事件,在调用该事件时将“right”一词写入屏幕,但它不起作用。关于如何让它发挥作用有什么想法吗?
我尝试用“+=”引发事件。然后我尝试将对象更改为 var 引用,但仍然无法使事件正常工作。由于某种原因,它仍然无法正常工作。这是我的代码:
//File: Program.cs
using PlayerMoveEvent1;
using PlayerMoveEvent2;
using PlayerMoveEvent3;
using PlayerMoveEvent4;
using PlayerMoveEvent5;
using MovementSpace;
class Program
{
static void Main(string[] args)
{
//Objects for declaring events:
var playerMoved = new PlayerMoves();
var moveRight = new MoveRight();
Movement movement = new Movement();
Console.ReadKey();
if (Console.ReadKey().Key == ConsoleKey.UpArrow)
{
Console.WriteLine("\nYou moved forward.");
}
else if (Console.ReadKey().Key == ConsoleKey.DownArrow)
{
Console.WriteLine("\nYou moved back.");
}
else if (Console.ReadKey().Key == ConsoleKey.LeftArrow)
{
}
else if (Console.ReadKey().Key == ConsoleKey.RightArrow)
{
playerMoved.Move(movement);
playerMoved.PlayerMoved += moveRight.OnPlayerMoved;
}
else
{
System.Console.WriteLine("\nThat is not a valid movement.");
System.Console.WriteLine("Please try again.");
}
}
}
// File: MovementRight.cs
using System;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using PlayerMoveEvent1;
namespace PlayerMoveEvent2
{
public class MoveRight
{
public void OnPlayerMoved(object source, EventArgs args)
{
Console.WriteLine("\nRight");
}
}
}
// File: PlayerMove.cs
using System;
using System.Reflection.Metadata.Ecma335;
using MovementSpace;
namespace PlayerMoveEvent1
{
public class PlayerMoves
{
public delegate void PlayerMovesEventHandler(object source, EventArgs args);
public event PlayerMovesEventHandler PlayerMoved;
public void Move(Movement movement)
{
Console.WriteLine("\nYou moved in this direction: ");
OnPlayerMoved();
}
protected virtual void OnPlayerMoved()
{
if (PlayerMoved != null)
{
PlayerMoved(this, EventArgs.Empty);
}
}
}
}
您应该在构造函数或初始化方法中处理订阅,而不是在 Main 方法内订阅事件。多次订阅一个事件将无法正常工作,并且在条件块内订阅该事件可能不是您想要的。
在 if 条件下多次读取控制台键可能会导致意外行为。最好读取一次密钥并将其存储在变量中以便在多种情况下使用它。
更新了以下代码:
使用系统;
命名空间 PlayerMoveEvent { 班级计划 { 静态无效主(字符串[]参数) { // 用于声明事件的对象: var playerMoved = new PlayerMoves(); var moveRight = new MoveRight(); 运动运动 = new Movement();
ConsoleKeyInfo key = Console.ReadKey();
if (key.Key == ConsoleKey.UpArrow)
{
Console.WriteLine("\nYou moved forward.");
}
else if (key.Key == ConsoleKey.DownArrow)
{
Console.WriteLine("\nYou moved back.");
}
else if (key.Key == ConsoleKey.LeftArrow)
{
// Handle left movement
}
else if (key.Key == ConsoleKey.RightArrow)
{
playerMoved.Move(movement);
}
else
{
Console.WriteLine("\nThat is not a valid movement.");
Console.WriteLine("Please try again.");
}
// Subscribe to the event after handling the movement
playerMoved.PlayerMoved += moveRight.OnPlayerMoved;
Console.ReadKey();
}
}
// MoveRight class remains unchanged
// PlayerMoves class remains unchanged
}