最近我一直在研究像游戏这样的太空入侵者,以帮助我提高我的编程技能.我陷入了一些问题.我已经研究了几天了,你将如何在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)
非常感谢帮助或建议.
您遇到的问题是,在循环的每次迭代中,您通过编写来重置项目符号的 y 位置laserFired = spriteY;
然而,一旦纠正了这个问题,您将遇到另一个问题:移动激光子弹的 while 循环仅在该laserFire方法中执行。这意味着:
当激光子弹移动时,其他任何东西都不能移动(因为环路只移动激光)
一旦激光子弹停止移动,它就永远不会再次开始移动(因为如果不再次调用,您就无法返回循环laserFire()。
您需要有一个游戏循环来移动游戏中的所有内容,而不是为每个移动对象设置一个循环。