2010-11-07 91 views
6

最近,我一直致力于太空入侵者游戏,以帮助我提升编程技能。我陷入了一些问题。我一直在研究几天,在keyUp上如何开展激光射击。无法在2D空间入侵者中激发激光,如游戏

这是我迄今的尝试;我能得到的激光射击,但它绊倒我,为什么激光不上动起来进行......

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; } 
     } 
    } 
} 

帮助或建议,将不胜感激感谢。

回答

3

你的问题是,在循环的每次迭代中,通过编写laserFired = spriteY;

然而,一旦被纠正,你会遇到另一个问题重置子弹的y位置:在while循环移动激光子弹只能在laserFire方法中执行。这意味着:

  • 虽然激光子弹动作,其他什么都可以移动(因为仅环移动激光)

  • 一旦激光子弹停止移动,它绝不会再次开始移动(因为你不能去回到环路不会再次调用laserFire()

你需要有一个单一的游戏循环在你的游戏移动的一切,而不必为每个移动物体一个循环。

+0

如果你对C#中的游戏开发充满好奇,我会研究XNA框架(来自微软)。如果有的话,即使你不想使用XNA,它也会给你一个关于如何设置你的代码的好主意 – 2010-11-07 13:51:01

0

你的定时器处理程序简单地递减fireTimer,直到它为零。什么鼓动重新渲染激光?需要调用laserFire重新渲染激光。也许你打算从bulletTimer_Tick拨打电话laserFire