为什么我的图像不会移动
本文关键字:移动 图像 我的 为什么 | 更新日期: 2023-09-27 18:34:14
我正在制作一个2D自上而下的游戏,玩家控制一只猫。为此,此人使用 WASD 键进行移动。我有Form1,GameManager,Cat和Moveable类。Form1 向 GameManager 发送 cat 图像列表和 e.graphics(用于图片框)。游戏管理器有一个计时器,每个滴答声都会检查猫是否移动。Cat 处理移动逻辑。当我运行程序时,猫子画面出现在其初始位置,但在按下某个键时不会移动。我无法弄清楚我的问题,有人可以帮忙吗?
以下是我的课程:
表格1:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace CatAndMouse
{
public partial class Form1 : Form
{
GameManager myGM = new GameManager();
public Form1()
{
InitializeComponent();
newGame();
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
if (this.myGM != null)
this.myGM.paint(e.Graphics);
}
public void newGame()
{
myGM.newGame(imgCat);
}
}
}
游戏管理器:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace CatAndMouse
{
class GameManager
{
Cat ca1 = new Cat();
int amount = 5;
Timer time = new Timer();
public ImageList imgCat = new ImageList();
public void newGame(ImageList cat)
{
imgCat = cat;
time.Start();
}
public void move()
{
ca1.Move(amount);
}
public void paint(Graphics g)
{
g.DrawImage(imgCat.Images[0], ca1.getLocation());
}
private void time_Tick(object sender, EventArgs e)
{
move();
}
}
}
猫:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace CatAndMouse
{
class Cat: Moveable
{
Random myCLoc = new Random();
private Moveable myCatMove;
public Point p = new Point(100, 100);
int dir = 0;
public void Move(int n)
{
if (dir == 0)
{
p.Y = p.Y - n;
}
if (dir == 1)
{
p.X = p.X + n;
}
if (dir == 2)
{
p.Y = p.Y + n;
}
if (dir == 3)
{
p.X = p.X - n;
}
}
private void KeyDown(KeyEventArgs e)
{
if (e.KeyCode == Keys.Up)
{
dir = 0;
}
if (e.KeyCode == Keys.Right)
{
dir = 1;
}
if (e.KeyCode == Keys.Down)
{
dir = 2;
}
if (e.KeyCode == Keys.Left)
{
dir = 3;
}
}
public void changeDirection()
{
}
public Point getLocation()
{
return p;
}
public void paint(PaintEventArgs e)
{
}
}
}
移动:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace CatAndMouse
{
public interface Moveable
{
void Move(int n);
void changeDirection();
//Point getLocation();
void paint(PaintEventArgs e);
}
}
所以,我没有任何调用KeyDown()的东西。如果它需要KeyEventArgs e,我如何调用KeyDown()?
Picturebox1 没有键关闭事件,form1 有。我还需要在 cat 类中使用 keydown 事件,以便它知道它面向哪个方向,以便知道要移动的方向。
-
代码中没有键盘事件。可能是你省略了它(代码太多了),但然后说点什么。
-
每次
move()
后,您需要Invalidate()
相关的控件,在本例中为 PictureBox。
您的课程中没有任何内容收到有关键控事件的通知。
要么你的 form1 类应该有一个用于键关闭的处理程序,并且你在那里实现移动逻辑,要么你的 Cat 类应该派生自 System.Windows.Forms.Control 在那里实现键下处理程序。
然后,一旦新控件 Cat 具有焦点,就会在您的控件上引发按键事件。