2014-09-12 4 views
1

Я работаю с Android (Java), а то, что хочу, - это взять класс и сделать из него 3 экземпляра, но с некоторыми переменными, установленными на случайные.Почему я не могу умножить объект?

public class MainActivity extends Activity{ 

    Player ourView; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     ourView = new Player(this); 
     setContentView(ourView); 
    } 

    protected void onPause() { 
     super.onPause(); 
     ourView.pause(); 
    } 

    protected void onResume() { 
     super.onResume(); 
     ourView.resume(); 
    } 
} 

Другой класс ...

public class Player extends SurfaceView implements Runnable { 

    Canvas canvas = new Canvas(); 
    SurfaceHolder ourHolder; 
    Thread ourThread = null; 
    boolean isRunning = true; 

    public Player(Context context) { 
     super(context); 
     ourHolder = getHolder(); 
     ourThread = new Thread(this); 
     ourThread.start(); 
    } 

    public void pause() { 
     isRunning = false; 
     while(true){ 
     try{ 
      ourThread.join(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     break; 
    } 
    ourThread = null; 
} 

    public void resume() { 
     isRunning = true; 
    } 

    public void run() { 
     while(isRunning) { 
      if(!ourHolder.getSurface().isValid()) 
       continue; 

       canvas = ourHolder.lockCanvas(); 
       canvas.drawRGB(30, 30, 200); 

       Enemy[] enemy = new Enemy[3]; 
       for(int i = 0; i<enemy.length; i++){ 
        enemy[i] = new Enemy(); 
        enemy[i].draw(); 
       } 

      ourHolder.unlockCanvasAndPost(canvas); 
     }   
    } 
} 

И "Враг" Класс:

public class Enemy{ 

    Canvas canvas = new Canvas(); 

    float x = (float) (Math.random()*200); 
    float y = (float) (Math.random()*200); 

    public void draw(){ 
     Bitmap bitmap = (Bitmap) BitmapFactory.decodeResource(getContext(), R.drawable.ic_launcher); 
     canvas.drawBitmap(bitmap, x, y, null); 

    } 
} 

Я могу видеть, что есть 3 растровых изображений, созданных, это круто. Но они не остаются неподвижными, это похоже на то, что цикл for никогда не останавливается, хотя условие больше не выполняется.

Я задал вопрос раньше, но я не мог найти ответа. Надеюсь, ты поможешь мне, спасибо.

+3

«Почему я не могу размножить объект». Что ты имеешь в виду? –

+1

Какой цикл «для» никогда не выполняется? – khriskooper

+0

Я думаю, что они означают цикл «while»? –

ответ

3

Вы создаете новый массив из 3-х врагов в каждом цикле цикла while, после того как цикл while завершит выполнение, массив врагов покинет область действия и будет уничтожен, и будет создан новый массив. Если вы хотите сохранить этих врагов, вам нужно будет хранить их вне сферы действия цикла.

** EDIT ** - Попробуйте

public class Player extends SurfaceView implements Runnable { 

Canvas canvas = new Canvas(); 
SurfaceHolder ourHolder; 
Thread ourThread = null; 
boolean isRunning = true; 
Enemy[] enemy; 

public Player(Context context) { 
    super(context); 
    ourHolder = getHolder(); 
    ourThread = new Thread(this); 
    ourThread.start(); 
    enemy = new Enemy[3]; 
    for(int i = 0; i<enemy.length; i++){ 
     enemy[i] = new Enemy(); 
    } 
} 

public void pause() { 
    isRunning = false; 
    while(true){ 
    try{ 
     ourThread.join(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    break; 
} 
ourThread = null; 
} 

public void resume() { 
    isRunning = true; 
} 

public void run() { 
    while(isRunning) { 
     if(!ourHolder.getSurface().isValid()) 
      continue; 

      canvas = ourHolder.lockCanvas(); 
      canvas.drawRGB(30, 30, 200); 


      for(int i = 0; i<enemy.length; i++){ 
       enemy[i].draw(); 
      } 

     ourHolder.unlockCanvasAndPost(canvas); 
    }   
} 
} 
+0

Спасибо за ответ. Как мне это сделать? – Gonzalo

+0

Создайте врагов при создании проигрывателя или в новой функции и сохраните их как члены класса, например, с помощью canvas или float x. Затем в вашей функции run() все, что вы делаете, это рисовать врагов, которые уже созданы. –

+0

Я не пытаюсь быть грубым, но если вы не можете понять это, игра может быть слишком амбициозной для проекта для вашего текущего уровня мастерства. –

1

точно так, как вы сказали, это как если цикл никогда не останавливается. , потому что цикл for находится в цикле while (isrunning), который никогда не останавливается и запускает цикл for снова и снова.

Вам необходимо реорганизовать свой код.

+0

Я работаю над игрой, поэтому, если я устанавливаю цикл вне цикла while, это не сработает. Правильно? Потому что он должен работать постоянно. – Gonzalo

+0

Враждебное поведение должно быть там и работать постоянно. это означает ИИ. проверка на столкновение, проверка на смерть. , но создание врага должно быть elswhere –

+0

Я написал создание врага внутри функции void, но когда я вызываю его внутри метода Run, он точно такой же, как и раньше: он вызывает снова и снова. – Gonzalo

Смежные вопросы