【问题标题】:Why can't I multiply an object?为什么我不能乘以一个对象?
【发布时间】:2014-09-12 21:07:57
【问题描述】:

我正在使用 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 循环也不会停止。

我之前问过这个问题,但我找不到任何答案。希望你能帮助我,谢谢。

【问题讨论】:

  • “为什么我不能乘以一个对象”。你这是什么意思?
  • 哪个'for'循环永远不满足?
  • 我认为他们的意思是“while”循环?
  • 当您说“条件不再满足”时,您的意思是isRunning?看起来只有在应用程序暂停时才设置为 false。这是预期的行为吗?你确定onPause() 被叫到了吗?您可能想尝试使用Log.d 来确保它被调用。还可以尝试将volatile 添加到isRunning 的声明中。
  • 我的意思是“for”循环。因为当 int "i" 的值达到 3 时,循环应该停止。

标签: java android class object


【解决方案1】:

您在 while 循环的每个循环中创建一个包含 3 个敌人的新数组,一旦 while 循环完成执行,敌人数组将离开作用域并被销毁并创建一个新数组。如果您想保留这些敌人,您需要将它们存储在循环范围之外。

** 编辑 ** - 试试这个

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);
    }           
}
}

【讨论】:

  • 感谢您的回答。我该怎么做?
  • 在创建播放器或在新函数中创建敌人并将它们存储为类的成员,就像使用 canvas 或 float x 一样。然后在你的 run() 函数中,你所做的就是绘制已经创建的敌人。
  • 我并不想表现得粗鲁,但如果你想不通,那么对于你目前的技能水平来说,一个游戏可能有点过于雄心勃勃了。
  • 是的,我只是想学习。我在 void 函数中编写了 for 循环,但是当我在 Run 方法中调用它时,它完全一样:它被一遍又一遍地调用。
  • 你不要在 run 方法中调用它,它会完全按照你说的那样发生。尝试在调用 getHolder() 的 Player 构造函数中调用它;
【解决方案2】:

正如您所说,就像 for 循环永远不会停止一样。 因为那个 for 循环在 while(isrunning) 循环中,它永远不会停止并一遍又一遍地触发你的 for 循环。

您需要重新组织代码。

【讨论】:

  • 我正在开发一款游戏,所以如果我将循环设置在 while 循环之外,它将无法工作。对?因为它应该一直在运行。
  • 敌人的行为应该在那里并且不断地运行。这意味着人工智能。碰撞检查,死亡检查。但敌人的创造应该在别处
  • 我在 void 函数中编写了敌人的创建,但是当我在 Run 方法中调用它时,它与以前完全相同:它被一遍又一遍地调用。
  • 那是因为你打错地方了。您显然不了解自己的代码。你敌人的范围是无用的。你的解决方法是移动 Enemy[]enemy = new Enemy[3];作为 Player 类变量及其对 player 类构造函数的 forloop 初始化。但您需要的建议是从更简单的事情开始。至少去玩非实时游戏
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 2012-09-27
  • 1970-01-01
相关资源
最近更新 更多