【问题标题】:Android game loop seems to not workAndroid 游戏循环似乎不起作用
【发布时间】:2013-10-17 14:58:58
【问题描述】:

我正在尝试创建一个简单的游戏循环(它还不是真正的游戏),它显示一个圆圈,然后在它滴答 100 次后绘制另一个圆圈。我还有一个文本字段,应该显示循环运行了多少次。相关代码如下:

主活动

public class MainActivity extends Activity
{
   @Override
   public void onCreate(Bundle savedInstanceState)
{
            super.onCreate(savedInstanceState);
    DrawView v = new DrawView(this);
    v.setBackgroundColor(Color.WHITE);
            setContentView(v);
     }
}

绘图视图

public class DrawView extends SurfaceView implements SurfaceHolder.Callback
{
Paint p = new Paint();
MainThread thread;
private int y=0;

public DrawView(Context c)
{
    super(c);   
    thread = new MainThread(this, getHolder());
    thread.running = true;
    getHolder().addCallback(this);
    setFocusable(true);
}

public void draw(Canvas c)
{
    if(c==null)
        return;
    super.onDraw(c);
    p.setColor(Color.RED);
    p.setTextSize(32);
    p.setTypeface(Typeface.SANS_SERIF);
    c.drawCircle(getWidth()/2-100,getHeight()/2, 50, p);
    c.drawText("y = " + y, 50, 50, p);
    if(y==100)
        c.drawCircle(getWidth()/2+100,getHeight()/2, 50, p);
    else
        y++;
}

public void surfaceCreated(SurfaceHolder p1)
{
    thread.start();
}

主线程

public class MainThread extends Thread
{
private DrawView page;
private SurfaceHolder holder;
public boolean running;

public MainThread(DrawView p, SurfaceHolder h)
{
    super();
    page = p;
    holder = h;
}

@Override
public void run()
{
    while(running)
    {
        Canvas c = holder.lockCanvas();
        page.draw(c);
        holder.unlockCanvasAndPost(c);
    }
}

}

它只显示第一个圆圈和“y = 2”的文字。似乎没有任何更新,或者它做了两次然后停止。我是 Android 编程新手,但不是 Java 新手。我确定我只是缺少一些简单的东西。感谢您的帮助。

编辑:经过进一步观察,线程似乎随机崩溃。每次我运行该应用程序时,它都会显示“y =”,然后每次显示不同的数字。我认为它在崩溃之前会产生很多滴答声。关闭应用程序后,我收到一条消息“不幸的是,MyApp 已停止”。我对 Android 的工作原理知之甚少,无法知道它为什么会崩溃。

编辑 2:我发现它在 holder.unlockCanvasAndPost(c) 行上抛出了 IllegalArgumentException。同样,我不确定为什么。谁能解释发生了什么以及如何解决它?

编辑 3:记录 y 每个刻度的值表明它正确计算并在达到预期的 100 时停止。出于某种原因,屏幕上发生的事情并未反映这一点。

【问题讨论】:

  • 欢迎来到 Stack Exchange 大家庭!我想指出,如果您询问游戏开发人员可能会提供更好答案的问题,您可以在 Game Dev SE 网站上提问:gamedev.stackexchange.com/?as=1 另外,您确定它正在循环吗?尝试将 if (y==100) 切换到 if (y % 100 == 0) 这将测试 y 是否是 100 的倍数,而不是仅当它是 100 时。如果您的游戏停止存在问题,可能是在第 3 次或第 4 次迭代中循环(其中 y == 2),这就是它停在那里的原因。尝试在调试模式下运行您的游戏。
  • 看起来就是这样。我不知道为什么它停止了。由于我是在平板电脑上使用 AIDE 编写的,因此我不确定我是否有某种调试模式。也感谢有关游戏开发网站的提示,我相信我会经常访问那里:)

标签: android loops


【解决方案1】:

我认为您正在寻找的是HandlerRunnable 的组合。

处理程序调用runnable,它运行一次,然后决定是否应该再次调用。

类似:

    private Handler renderHandler = new Handler();
    private Runnable renderRunnable = new Runnable() {

        @Override
        public void run() {
            //... do stuff here;
            if(shouldRunAgain){
                renderHandler.postDelayed(renderRunnable, 1000); // for 1 second
            }
        }
    };

    renderHandler.post(renderRunnable);

编辑: 在没有看到日志猫的情况下,我将假设 UI 更新是从主 UI 线程以外的线程发生的,从而导致崩溃。

看看thisthisthis - 我认为这些更符合您的需求。

【讨论】:

  • 这似乎更像是一种解决方法而不是解决方案。我想知道为什么游戏循环结构不起作用,因为我计划将其用作我的应用程序的基础。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 2018-10-25
  • 2019-05-24
  • 1970-01-01
相关资源
最近更新 更多