无法在像游戏这样的2D太空入侵者中获得激光

Rob*_*ard 6 c#

最近我一直在研究像游戏这样的太空入侵者,以帮助我提高我的编程技能.我陷入了一些问题.我已经研究了几天了,你将如何在keyUp上进行激光射击.

这是我到目前为止的尝试; 我可以让激光器发射,但是我发现为什么激光器不能继续向上移动......

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;
using System.IO;

namespace SpaceInvaders
{
    public partial class Form1 : Form
    {
        public int spriteX = 226;
        public int spriteY = 383;
        bool bulletFire = false;
        int fireTimer = 8;
        int laserFired;

        public Form1()
        {
            InitializeComponent();
        }

        private void exitToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        public void laserFire()
        {       
            //on laser fire i wont the bulle to move up while bullet timer is enabled
            //moving up slowly with set intervals
            while (bulletTimer.Enabled == true)
            {
                PictureBox laser = new PictureBox();
                laser.BackColor = Color.Chartreuse;
                laser.Width = 5;
                laser.Height = 30;
                laserFired = spriteY;
                laserFired = laserFired - 10;
                this.Controls.Add(laser);
                laser.Location = new Point(spriteX, laserFired);
            }
       }

        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            //Fire bullet
            if (e.KeyCode == Keys.Up)
            {
                bulletFire = true;

                if (bulletFire == true)
                {
                    laserFire();
                    bulletTimer.Enabled = true;
                }
            }

            //Controls Right movement
            if (spriteX <448)
            {
                if (e.KeyCode == Keys.Right)
                {
                    spriteX = spriteX + 20;
                }
            }

            //Controls Left Movement
            if (spriteX > 0)
            {
                if (e.KeyCode == Keys.Left)
                {
                    spriteX = spriteX - 20;
                }
            }

            //Points sprite to new location
            pctSprite.Location = new Point(spriteX, spriteY);
        }

        private void bulletTimer_Tick(object sender, EventArgs e)
        {
            if (fireTimer == 0)
            {
                bulletTimer.Enabled = false;
            }
            else { fireTimer = fireTimer - 1; }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

非常感谢帮助或建议.

Vic*_*let 3

您遇到的问题是,在循环的每次迭代中,您通过编写来重置项目符号的 y 位置laserFired = spriteY;

然而,一旦纠正了这个问题,您将遇到另一个问题:移动激光子弹的 while 循环仅在该laserFire方法中执行。这意味着:

  • 当激光子弹移动时,其他任何东西都不能移动(因为环路只移动激光)

  • 一旦激光子弹停止移动,它就永远不会再次开始移动(因为如果不再次调用,您就无法返回循环laserFire()

您需要有一个游戏循环来移动游戏中的所有内容,而不是为每个移动对象设置一个循环。