处理/不能参考我在封闭范围

时间:2016-01-06 15:28:29

标签: java class unit-testing for-loop processing

我是处理/ Java的新手,我尝试制作一个小游戏...... 我已经创建了一个用于制作地图或布局的类,我将其称为Map类,它工作正常,我可以使用数组/图像或仅使用对象来创建“地图”。 所以现在我想在我的游戏中加入一些单位。它们不应该那么困难或复杂。我只是想移动他们,继承我的班级单位:

class Unit
{

int X;
int Y;
int Breite;
int Laenge;
boolean ausgewaelht = false;

Unit()
{



}

Unit(int x, int y, int breite, int laenge)
{



}

/ ---------------------------------------------- ---------------------

void create(UnitContent function)
{


  function.form();


}

void move(float geschwindigkeit)
{

  if(isTriggerd(X,Y,Breite,Laenge) == true){

  X = X+(int)geschwindigkeit;

  if(X > width)
  {

    X = 0;

  }
  }

}  

void setXandY(int x , int y)
 {

   X = x;
   Y = y;


 } 

 void setBreiteandLaenge(int breite, int laenge)
 {

   Breite = breite;
   Laenge = laenge;

 }  

/ ---------------------------------------------- ----------------------

 int getX()
 {

return X;

 }

 int getY()
 {

  return Y;

 } 

 int getBreite()
 {

  return Breite;

 }

 int getLaenge()
 {

   return Laenge;

 }    

/ ---------------------------------------------- ----------------------

 boolean isTriggerd(int x, int y, int breite, int laenge)
  {

    if(mouseX > x && mouseX < x+breite && mouseY > y && mouseY < y+laenge )
    {

      return true;

    }
    else 
    {

      return false; 

    }

 }

 }

如果我只使用1个单位,它可以正常工作^我可以亲自在课堂外选择我的单位在屏幕上绘制的形式......但是我如何绘制10个呢?

继承我的界面UnitContent:

interface UnitContent
{

   void form();

}

继承我的MainClass

Map testKarte;
Unit[] TestEinheit = new Unit[100];

int[][] array = {{0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0},
             {0,0,0,0,0,0,0,0}};

int a = 0;


void setup()
 {

 size(500,500);


 testKarte = new Map(1,1,"",50,50);

 for(int i = 0; i < TestEinheit.length; i++)
 {

   TestEinheit[i] = new Unit();
   TestEinheit[i].setXandY(0,0);
   TestEinheit[i].setBreiteandLaenge(50,50);

 }



 }




  void draw()
  {

    background(#FFFFFF);   

   testKarte.setCisClickable(true);
  testKarte.setIsRectOrPicture(true);
  testKarte.ubdate(new MapContent(){
             public void setMapContent(int a, int b, int c, int d){



               // rect(a,b,c,d);  

               for( int i = 0; i < TestEinheit.length; i++)
                  {                                                             
                    TestEinheit[i].create(new UnitContent()
                  {

                         public void form()
                         {

                                   rect(TestEinheit[i].getX(),TestEinheit[i].getY(),TestEinheit[i].getBreite(),TestEinheit[i].getLaenge());


                         }


              });
            }
            }



             public void setMapContentMouseOver(){





             }
            public void elseMapContentMouseOver()
            {

              // wenn die Maus nicht über dem Object ist
              // ebenfalls nicht unbedingt




            }});






   }

  void mousePressed()
{



}

当我尝试以下时:

 for( int i = 0; i < TestEinheit.length; i++)
               {                                                             
                  TestEinheit[i].create(new UnitContent()
                  {

                    public void form()
                     {


                                    rect(TestEinheit[i].getX(),TestEinheit[i].getY(),TestEinheit[i].getBreite(),TestEinheit[i].getLaenge());


                     }


                  });

它给出了以下错误:无法引用我在封闭范围内定义的非最终局部变量 顺便说一句,public void form只是一种接口方法:)

任何人都知道如何处理这个问题?

1 个答案:

答案 0 :(得分:0)

  

我正在寻找一种方法来处理......如果没有这个错误我怎么能这样做?

您有几个选项,具体取决于您希望form方法查看的内容

  • 创建创建<{1}} 时的i值,或
  • UnitContent的值,因为i被称为之后

创建创建UnitContent#formi的值

您需要一个UnitContent的子类,它接受UnitContent作为构造函数中的参数,将其存储在字段中,并在i中使用它。

E.g:

form

abstract class MyUnitContent extends UnitContent {
    protected int i;

    public MyUnitContent(int i) {
        this.i = i;
    }
}

(请注意,如果TestEinheit[i].create(new MyUnitContent(i) { public void form() { Unit entry = TestEinheit[this.i]; rect(entry.getX(), entry.getY(), entry.getBreite(), entry.getLaenge()); } }); 是本地的,则必须为TestEinheit。)

final被称为之后

时的值i

限制是您只能访问UnitContent#form 变量;它并不一定表示这些变量不能引用具有可变状态的对象。

所以你可以让final成为一个数组,例如:

i

现在,当final int[] i = new int[1]; for (i[0] = 0; i[0] < TestEinheit.length; i[0]++) { TestEinheit[i].create(new UnitContent() { public void form() { Unit entry = TestEinheit[i[0]]; rect(entry.getX(), entry.getY(), entry.getBreite(), entry.getLaenge()); } }); } 被调用时,它会读取form在调用它时的值(在上面的代码中,对于所有这些都是i[0])。< / p>

(请注意,如果TestEinheit.length是本地的,则它也必须是TestEinheit。)