C# 不能让激光像游戏一样在2D空间入侵者中开火

C# 不能让激光像游戏一样在2D空间入侵者中开火,c#,C#,最近我一直在开发一款类似太空入侵者的游戏,以帮助我提高编程技能。我遇到了一些问题。我已经研究了几天了,关于如何在keyUp上进行激光点火 这是我迄今为止的尝试;我可以让激光发射,但它让我感到困惑,为什么激光不能继续向上移动 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; u

最近我一直在开发一款类似太空入侵者的游戏,以帮助我提高编程技能。我遇到了一些问题。我已经研究了几天了,关于如何在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; }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Windows.Forms;
使用System.IO;
名称空间入侵者
{
公共部分类Form1:Form
{
公共int spriteX=226;
公共int精神=383;
bool bulletFire=false;
int fireTimer=8;
激光点火;
公共表格1()
{
初始化组件();
}
private void exitToolStripMenuItem\u单击(对象发送者,事件参数e)
{
这个。关闭();
}
公共真空激光火焰()
{       
//在激光射击时,我不会在子弹计时器启用时使子弹向上移动
//以设定的间隔缓慢地向上移动
while(bulletTimer.Enabled==true)
{
PictureBox laser=新PictureBox();
laser.BackColor=Color.Chartreuse;
激光。宽度=5;
激光,高度=30;
laserFired=spriteY;
激光点火=激光点火-10;
这个。控制。添加(激光);
激光位置=新点(spriteX,激光点火);
}
}
私有void Form1\u KeyDown(对象发送方,KeyEventArgs e)
{
//子弹
if(e.KeyCode==Keys.Up)
{
bulletFire=正确;
如果(bulletFire==真)
{
激光点火();
bulletTimer.Enabled=true;
}
}
//控制右移
if(spriteX 0)
{
if(e.KeyCode==Keys.Left)
{
spriteX=spriteX-20;
}
}
//将精灵指向新位置
pctSprite.Location=新点(spriteX,spriteY);
}
私有无效bulletTimer_Tick(对象发送方,事件参数e)
{
如果(fireTimer==0)
{
bulletTimer.Enabled=false;
}
else{fireTimer=fireTimer-1;}
}
}
}

非常感谢您的帮助或建议。

您的计时器处理程序只需将
fireTimer
递减到零。是什么促使激光重新渲染?需要调用
laserFire
来重新渲染激光。也许您想从
bulletTimer\u Tick
调用
laserFire

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

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

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

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


你需要一个游戏循环来移动游戏中的所有东西,而不是每个移动的对象都有一个循环。

如果你对C#游戏开发感兴趣,我会研究一下XNA框架(来自微软)。如果有什么问题的话,它会让你知道如何设置代码,即使你不想使用XNA