2014-09-01 43 views
0

我是Java的新手,所以我希望这不是一个愚蠢的问题。我有一个叫“敌人”的课。Android:我如何乘一个类并创建其变量的不同实例?

我知道如何乘以类,我使用“for”循环。现在,问题是变量x和y(移动位图的变量)对于类的每个实例都具有相同的值。我希望它们有所不同,以创造一些“随机性”。

主类:

public class MainActivity extends Activity{ 


    Player ourView; 

    @SuppressLint("ClickableViewAccessibility") protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
          WindowManager.LayoutParams.FLAG_FULLSCREEN); 

     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(null); 
        enemy[i].draw(); 
       } 

      ourHolder.unlockCanvasAndPost(canvas); 
     }   
    } 
} 

而这里的 “敌人” 类:

public class Enemy extends Player{ 

    public Enemy(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 
    } 

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

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

    } 
} 

我也试着在“Enemy”类中声明这些变量,但它们不起作用。位图保留在(0,0)中。

注意:“Player”和“Enemy”类是在“MainActivity”类中声明的。

+0

每个类都应该有它自己的java文件;)。如果你这样做了,你可以为'Enemy'创建一个构造函数,并在其中填充x和y变量:'public Enemy(){x =(float)(Math.random()* 200); y =(float)(Math.random()* 200); }'。这样,每个“Enemy”的实例都有自己的坐标。 – Tom 2014-09-01 21:45:09

+0

非常感谢您的评论。我试过了,它似乎不起作用。位图停留在坐标(0,0)处。 – Gonzalo 2014-09-01 21:47:00

+0

您能否更新您的问题并显示使用您的更改? – Tom 2014-09-01 21:47:51

回答

0

你的Enemy类不应该扩展Player类,因为它们不共享除画布和上下文之外的任何相似性。 一种可能实现你的敌人的看起来是这样的:

public class Enemy { 
    private Bitmap bitmap; 
    private Canvas canvas; 
    private Context context; 
    private float x, y; 

    public Enemy(Canvas canvas, Context context) { 
    bitmap = BitmapFactory.decodeResource(
     context.getResources(), R.drawable.ic_launcher); 
    x = (float) (Math.random() * 200); 
    y = (float) (Math.random() * 200); 
    } 

    public void draw() { 
    canvas.drawBitmap(bitmap, x, y, null); 
    } 

    public void printCoordinates() { // just used for printing 
    System.out.println("x = " + x + "/y = "+ y); 
    } 
} 

Player类只需要一个小的调整,以创造适当的Enemy类:

Enemy[] enemy = new Enemy[3]; 
for(int i = 0; i < enemy.length; i++){ 
    enemy[i] = new Enemy(canvas, context); 
    enemy[i].printCoordinates(); // just used for printing the generated coordinates 
    enemy[i].draw(); 
} 

你只需要提供适当的canvascontext实例为新的敌人实例。您也可以删除上下文实例,因为您(当前)不会在该类中使用它。

这是上面的代码示例打印:

x = 27.236885/y = 7.8905525 
x = 61.842735/y = 158.4654 
x = 186.16629/y = 20.208426 

如果你真的想延长Player类,那么你仍然可以做到这一点。这在Enemy class中不会有太大变化。

+0

它的工作!非常感谢你。唯一的事情就是它在一个永无止境的循环中。它为它们中的每一个生成随机值,但始终。我希望创建这些值,然后将位图留在那个位置。我怎样才能做到这一点? – Gonzalo 2014-09-02 01:48:26

+0

当'Player'线程运行时,您正在创建新的'Enemy'实例,这就是为什么您在画布上获得越来越多的位图。你应该考虑你真正想要的东西。如果你只想在屏幕上出现3个敌人,那么你应该将“Enemy'循环提取到分离方法,以检查是否有3个可用实例并在必要时创建新实例。您还应该将可用的敌方实例存储在'List '中作为'Player'类中的变量,以允许访问当前的敌人。使用该List而不是'Enemy []'。 – Tom 2014-09-02 01:56:38

+0

好吧,我会那样做的。非常感谢您花时间。 – Gonzalo 2014-09-02 01:59:17

相关问题