2013-10-07 80 views
0

我需要从Form1中获取一个方法,但是当我调用它时,会出现无限循环错误。我得到这个是因为我在Form1的开头创建了一个新的GameManager类,并且我在GameManager中创建了一个新的Form1。我怎样才能得到一个方法从form1到GameManager没有得到这个无限循环错误?我该如何解决这个无限循环/ StackOverFlow错误?

Form1中:

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; 

namespace CatAndMouse 
{ 
    public partial class Form1 : Form 
    { 
     GameManager myGM = new GameManager(); 
     int dir = 0; 
     public Form1() 
     { 
      InitializeComponent(); 
      newGame(); 
     } 

     private void pictureBox1_Paint(object sender, PaintEventArgs e) 
     { 
      if (this.myGM != null) 
       this.myGM.paint(e.Graphics); 
      //e.Graphics.DrawImage(imgMouse.Images[0], pointXMouse, pointYMouse); 
      //e.Graphics.DrawImage(imgCat.Images[0], 50, 100); 
      //e.Graphics.DrawImage(imgCheese.Images[0], 75, 100); 
     } 

     private void Form1_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (e.KeyCode == Keys.Up) 
      { 
       dir = 0; 
      } 
      if (e.KeyCode == Keys.Right) 
      { 
       dir = 1; 
      } 
      if (e.KeyCode == Keys.Down) 
      { 
       dir = 2; 
      } 
      if (e.KeyCode == Keys.Left) 
      { 
       dir = 3; 
      } 
     } 
     public void newGame() 
     { 
      timer1.Start(); 
      myGM.newGame(imgCat, imgMouse, imgCheese); 
     } 

     private void timer1_Tick(object sender, EventArgs e) 
     { 
      pictureBox1.Refresh(); 
     } 
     public int getDir() 
     { 
      return dir; 
     } 
    } 
} 

游戏管理:

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; 

namespace CatAndMouse 
{ 
    class GameManager 
    { 
     Form1 myForm = new Form1(); 
     Cat ca1 = new Cat(); 
     Mouse m = new Mouse(); 
     Cheese ch = new Cheese(); 
     int amount = 5; 
     int catdir = 0; 
     Timer time = new Timer(); 
     public ImageList imgCat = new ImageList(); 
     public ImageList imgMouse = new ImageList(); 
     public ImageList imgCheese = new ImageList(); 

     public void newGame(ImageList cat, ImageList mouse, ImageList cheese) 
     { 
      imgCat = cat; 
      imgMouse = mouse; 
      imgCheese = cheese; 
      time.Start(); 
     } 

     public void move() 
     { 
      ca1.Move(amount); 
      m.Move(amount); 
     } 

     public void paint(Graphics g) 
     { 
      g.DrawImage(imgCat.Images[0], ca1.getLocation()); 
     } 

     private void time_Tick(object sender, EventArgs e) 
     { 
      move(); 
      getDir(); 
     } 
     public void getDir() 
     { 
      catdir = myForm.getDir(); 
     } 
    } 
} 
+0

你想访问什么方法? – Brian

回答

2

传递表单对象作为参数传递给您的游戏管理对象。例如,在你的GameManager的构造函数中做另一个争论'Form1窗体'并且执行myForm = form;

从Form1调用构造函数时,将'this'作为参数传递。

+0

非常感谢!这工作得很好! –

0

如果您不想传递整个表单的引用,那么您可以仅将一个代理传递给GameManager构造函数。有关委托here

0

更多信息添加一个构造函数来GameManager

Form1 myForm; 
public GameManager(Form1 form) 
{ 
    myForm = form; 
} 

然后Form1

GameManager myGM; 
public Form1() 
{ 
    myGM = new GameManager(this); 
}