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

时间:2010-11-07 10:44:13

标签: 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; }
        }
    }
}

非常感谢帮助或建议。

2 个答案:

答案 0 :(得分:3)

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

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

  • 当激光子弹移动时,没有其他东西可以移动(因为环路仅移动激光)

  • 一旦激光子弹停止移动,它将永远不会再开始移动(因为你不能再次调用laserFire()就不能回到循环中。

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

答案 1 :(得分:0)

您的计时器处理程序只会递减fireTimer直到它为零。什么促使重新渲染激光?需要调用laserFire来重新渲染激光。也许您打算从laserFire致电bulletTimer_Tick