2013-02-26 15 views
5

मैं एक टेट्रिस क्लोन लिखने की कोशिश कर रहा हूं, और कुछ शोध करने के बाद मैं एक उदाहरण में आया हूं जो ब्लॉक बनाने के लिए छोटे उपयोगकर्ता नियंत्रणों का उपयोग करता है और इसमें एक बड़ा उपयोगकर्ता नियंत्रण होता है ग्रिड।किसी अन्य उपयोगकर्ता नियंत्रण के भीतर उपयोगकर्ता नियंत्रण को स्थानांतरित करना

जो कुछ भी मैंने लिखा है वह पहले से ही ठीक काम करता है (ब्लॉक उत्पन्न हो रहे हैं और ग्रिड पर रखे गए हैं, अगर मैं कोड बदलता हूं तो मैं उन्हें कहीं और भी रख सकता हूं), लेकिन मुझे ब्लॉक नहीं मिल रहे हैं कार्यक्रम चल रहा है, जबकि स्थानांतरित करने के लिए। उदाहरण का उपयोग मैं प्रत्येक ब्लॉक की control.left संपत्ति को बदलकर करता हूं। मैंने कोशिश की है, इसे डीबग किया है और संपत्ति बदलते समय, ब्लॉक नहीं चलता है।

मैंने लगभग 4 घंटे के आसपास खोज की है। मैं एक नौसिखिया प्रोग्रामर हूं, इसलिए मुझे पता है कि यह शायद कुछ बेवकूफ है, लेकिन मुझे यह नहीं पता कि यह क्या है।

यहाँ तरीकों मैं लिखा है या नहीं:

//Class TetrisGame.cs 
public void MoveRight() 
     { 
      blok.MoveBlock("x", 1); 
     } 
//Class Shape.cs 
public void MoveBlock(string pos, int Amount) 
     { 
      if (pos == "x") 
      { 
       for (int i = 0; i < this.Shape().Count; i++) 
       { 
        ((Blokje)this.Shape()[i]).MoveSide(1); 
       } 
      } 
      if (pos == "y") 
      { 
       for (int i = 0; i < this.Shape().Count; i++) 
       { 
        ((Blokje)this.Shape()[i]).MoveDown(1); 
       } 
      } 
//And, the code that should actually move the block in Block.cs: 
     public void MoveSide(int Step) 
     { 
      this.Left += (Step * 20);//Blocks are 20*20 pixels so should move in steps of 20 pixels 
     } 

आकार वास्तव में एक ArrayList जो सिर्फ 4 ब्लाकों होता है। Block.cs एक आंशिक वर्ग के बाद से यह usercontrol छोटे वर्गों है कि पीछे कोड है, Shape.cs खंडों के आकार बनाता है और tetrisgame सिर्फ gamelogic है

कीप्रेस घटना:

private void Form1_KeyPress(object sender, KeyPressEventArgs e) 
     { 
      try 
      { 
       if (e.KeyChar == 'q')//left 
       { 
        if (!paused) 
        { 
         Game.MoveLeft(); 
        } 
       } 
       else if (e.KeyChar == 'd')//right 
       { 
        if (!paused) 
        { 
         Game.MoveRight(); 
        } 
       } 
       else if (e.KeyChar == 'p')//pause 
       { 
        if (paused) 
        { 
         tmrGame.Start(); 
        } 
        else 
        { 
         tmrGame.Stop(); 
        } 
       } 
       else if (e.KeyChar == 'z')//rotate 
       { 
        if (!paused) 
        { 
         Game.Rotate(); 
        } 
       } 
       else if (e.KeyChar == 'h')//help 
       { 
        Help.Show(); 
       } 
       else if (e.KeyChar == 'f')//save 
       { 

       } 
       else if (e.KeyChar == 's')//Drop 
       { 
        if (!paused) 
        { 
         Game.Drop(); 
        } 
       } 
      } 
      catch 
      { 
       //no error message has to be displayed, this is just to prevent runtime Errors when pressing keys before the game has started 
      } 
     } 
+0

आप इनपुट कैसे प्राप्त कर रहे हैं? कीबोर्ड और माउस? मुझे लगता है कि आपके दृष्टिकोण पर काम हो रहा है जब आपके पास केवल कुछ आइटम हैं। क्या आप डब्ल्यूपीएफ या विनफॉर्म का उपयोग कर रहे हैं? –

+0

मैं कुंजीपटल ईवेंट और विनफॉर्म के साथ कीबोर्ड का उपयोग कर रहा हूं। कुंजीपटल इनपुट काम करता है, क्योंकि मैं इसे सहायता फॉर्म खोलने के लिए भी उपयोग करता हूं। – Frederik

+1

यह सेट करने का प्रयास करें। स्थान = नया बिंदु (एक्स, वाई); –

उत्तर

0

ऐसा लगता है कि "बड़े उपयोगकर्ता नियंत्रण जिसमें ग्रिड होता है" इसके बच्चों के साथ पुन: खींचा नहीं जाता है। MoveSide बदलें:

public void MoveSide(int Step) 
    { 
     this.Left += (Step * 20); 
     Update(); 
    } 

तो सब कुछ सही ढंग से दोबारा बनाई है।

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