如何用箭头键使形状移动?
Posted
技术标签:
【中文标题】如何用箭头键使形状移动?【英文标题】:How to make a shape move with the arrow keys? 【发布时间】:2020-10-23 14:48:43 【问题描述】:using System.Drawing;
using System.Windows.Forms;
public partial class Form1 : Form
int vx = 5;
int vy = 5;
int bx = 0;
int by = 50;
int px = 93;
public Form1()
InitializeComponent();
timer1.Interval = 100;
timer1.Start();
public class Ball
public int X;
public int Y;
public int W;
public int H;
public Ball(int x, int y, int w, int h)
X = x;
Y = y;
W = w;
H = h;
public class Paddle
public int X;
public int Y;
public int W;
public int H;
public Paddle(int x, int y, int w, int h)
X = x;
Y = y;
W = w;
H = h;
public class Brick
public int X;
public int Y;
public int W;
public int H;
public Brick(int x, int y, int w, int h)
X = x;
Y = y;
W = w;
H = h;
private void Form1_Paint(object sender, PaintEventArgs e)
int[] brickxs = 0, 51, 102, 153, 204, 255, 306, 357, 408, 459, 510, 561, 612, 663, 714, 765 ;
int bc = 0;
SolidBrush blueBrush = new SolidBrush(Color.Blue);
Ball b = new Ball(55, 55, 25, 25);
Paddle p = new Paddle(93, 377, 130, 30);
Brick br = new Brick(20, 20, 51, 20);
br.X = 0;
while (bc < 16)
br.X = brickxs[bc];
System.Drawing.SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Red);
System.Drawing.Graphics formGraphics;
formGraphics = this.CreateGraphics();
formGraphics.FillRectangle(myBrush, new Rectangle(br.X, 0, 49, 20));
myBrush.Dispose();
formGraphics.Dispose();
bc = bc + 1;
Rectangle ball = new Rectangle(bx, by, b.W, b.H);
Rectangle paddle = new Rectangle(px, p.Y, p.W, p.H);
//Rectangle brick = new Rectangle(br.X, br.Y, br.W, br.H);
e.Graphics.FillEllipse(blueBrush, ball);
e.Graphics.FillRectangle(blueBrush, paddle);
//e.Graphics.FillRectangle(blueBrush, brick);
private void Form1_KeyDown(object sender, KeyEventArgs e)
if (e.KeyData == Keys.Right)
px += 5;
private void MoveTimer_Tick(object sender, EventArgs e)
Invalidate();
private void timer1_Tick(object sender, EventArgs e)
bx = bx + vx;
by = by + vy;
if (px <= 0)
px = 0;
if (px >= 771)
px = 771;
WallCollision();
floorandCeilingCollision();
Invalidate();
public void WallCollision()
if (bx >= 771)
vx = -5;
if (bx <= 0)
vx += 5;
public void floorandCeilingCollision()
if (by >= 420)
vy = -5;
if (by <= 0)
vy = 5;
我正在创建一个游戏,我需要一些帮助。
在我的代码中,游戏的每个部分都有类:球、桨和砖。数组定位砖块。
我想用箭头键左右移动桨(只是一个矩形)。我尝试使用按键方法,但它不起作用。
您能否提出任何解决方案或指出我遗漏的任何内容?
【问题讨论】:
此代码需要进行太多更改才能使其正常运行。您必须开始删除它:System.Drawing.Graphics formGraphics; formGraphics = this.CreateGraphics();
并仅使用 Paint 事件提供的 e.Graphics
对象。只需创建一次 Paddle
和 Ball
。 brickxs
数组也是如此。在 Paint 事件之外声明固定的画笔,并在窗体关闭时处理这些画笔。我不知道MoveTimer_Tick
处理什么。我假设您有两个计时器试图为 Ball 和 Paddle 创建不同的速度。尝试为您的字段/变量分配有意义的名称。
【参考方案1】:
我个人用e.KeyCode代替e.KeyData,先试试这个。
确保您的表单具有焦点,而不是图片框或您在游戏中可能拥有的其他东西。因为您尝试为 Form 调用 KeyDown 事件,而不是为 Form 中的控件调用。
我从未使用过 Paint 事件,你确定它被调用了吗?您的游戏可能会注册移动但从未向您显示更改。我通常有一个单独的绘图方法,每次有变化我都会调用它,你也应该试试这个。
如果没有任何效果,请尝试调试。在您的 KeyDown 方法中设置一个断点以查看它是否被调用。如果是,请在 Paint 方法中设置它。这个肯定会在运行时被调用一次,但是如果你在那个时候点击“继续”并尝试移动你的对象。如果其他时间没有调用它,那么这就是你的答案:)
请告诉我你在尝试这些事情后的发现,如果你遇到困难或根本不知道还有什么可做的,请询问我下一步该怎么做:)
【讨论】:
以上是关于如何用箭头键使形状移动?的主要内容,如果未能解决你的问题,请参考以下文章
在 OpenGL 中使用箭头键移动一些形状 - 它缩小而不是移动