如何用箭头键使形状移动?

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 对象。只需创建一次 PaddleBallbrickxs 数组也是如此。在 Paint 事件之外声明固定的画笔,并在窗体关闭时处理这些画笔。我不知道MoveTimer_Tick 处理什么。我假设您有两个计时器试图为 Ball 和 Paddle 创建不同的速度。尝试为您的字段/变量分配有意义的名称。 【参考方案1】:

我个人用e.KeyCode代替e.KeyData,先试试这个。

确保您的表单具有焦点,而不是图片框或您在游戏中可能拥有的其他东西。因为您尝试为 Form 调用 KeyDown 事件,而不是为 Form 中的控件调用。

我从未使用过 Paint 事件,你确定它被调用了吗?您的游戏可能会注册移动但从未向您显示更改。我通常有一个单独的绘图方法,每次有变化我都会调用它,你也应该试试这个。

如果没有任何效果,请尝试调试。在您的 KeyDown 方法中设置一个断点以查看它是否被调用。如果是,请在 Paint 方法中设置它。这个肯定会在运行时被调用一次,但是如果你在那个时候点击“继续”并尝试移动你的对象。如果其他时间没有调用它,那么这就是你的答案:)

请告诉我你在尝试这些事情后的发现,如果你遇到困难或根本不知道还有什么可做的,请询问我下一步该怎么做:)

【讨论】:

以上是关于如何用箭头键使形状移动?的主要内容,如果未能解决你的问题,请参考以下文章

如何用svg在网页中画一条带箭头的连接线

如何用css使箭头垂直变窄?

在 OpenGL 中使用箭头键移动一些形状 - 它缩小而不是移动

Python之OpenGL笔记(22):箭头控制平面直角坐标系中的圆圈移动

如何用reactjs修复“预计在箭头函数中返回一个值”?

如何用bootstrap实现步骤箭头按钮样式