2010-11-07 11 views
6

हाल ही में मैं खेल की तरह एक अंतरिक्ष आक्रमणकारियों पर काम कर रहा है की तरह 2 डी अंतरिक्ष आक्रमणकारियों में आग, मुझे मेरे प्रोग्रामिंग कौशल को बढ़ावा देने में मदद करने के लिए नहीं मिल सकता है। मैं कुछ समस्याओं में गिर गया है। मैं कुछ दिनों के लिए शोध कर रहा हूं, कि आप 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; } 
     } 
    } 
} 

मदद या सलाह बहुत सराहना की जाएगी धन्यवाद।

उत्तर

3

समस्या आप हैं, वे पाश के हर यात्रा पर, आप laserFired = spriteY;

लेखन हालांकि, एक बार है कि सही है, तो आप एक और समस्या में पड़ जाएगा द्वारा गोली के y स्थिति रीसेट है: जबकि पाश है कि लेजर बुलेट को केवल laserFire विधि में निष्पादित किया जाता है। इसका मतलब है कि:

  • जबकि लेजर गोली चलता है, और कुछ नहीं, यह फिर से चलना शुरू कभी नहीं होगा के लिए कदम

  • एक बार लेजर गोली चलती बंद हो जाता है (क्योंकि पाश केवल लेजर चलता है) कर सकते हैं (क्योंकि आप laserFire() फिर से बुला के बिना लूप में वापस जा सकते हैं नहीं।

आप एक ही खेल पाश अपने खेल में सब कुछ चलता है कि, बजाय हर चलती वस्तु के लिए एक पाश होने के की आवश्यकता है।

+0

मैं (माइक्रोसॉफ्ट से) यदि आप सी # में खेल विकास के बारे में उत्सुक हैं XNA ढांचे पर गौर चाहते हैं। अगर कुछ भी आपको एक अच्छा विचार देगा कि आप अपना कोड कैसे सेट अप करें, भले ही आप एक्सएनए का उपयोग नहीं करना चाहते हैं –

0

आपका टाइमर हैंडलर बस fireTimer decrements जब तक यह शून्य है। क्या लेजर की पुन: प्रतिपादन को उत्तेजित करता है? कुछ laserFire आह्वान करने के लिए लेजर को फिर से प्रस्तुत करने के लिए की जरूरत है। शायद आप bulletTimer_Tick से laserFire कॉल करने के लिए मतलब था?

संबंधित मुद्दे