1

我正在为 android 开发一款 2-D 游戏,我主要将其用作学习 android 应用程序编程的进出的经验,所以我自然会遇到很多难题来解决。目前,我的主要活动实例化了一个自定义类,该类扩展了 SurfaceView 并实现了 SurfaceHolder.Callback。该视图实例化了一个线程,该线程处理大部分逻辑和所有图形处理(这包括实例化画布并对其进行绘图等)。

好吧,作为一个初学者,当我开始将画布设计为比屏幕大得多并允许用户滚动查看画布的所有部分时,我并没有想到......但是,唉,这就是我的想法需要发生。

如果有一个简单的方法可以做到这一点,请告诉我。

我最好的猜测是将画布的实际创建放在一个单独的类中,该类扩展了 ScrollView 并以某种方式从我的线程中调用所有 Draw() 到该画布。这可能吗?我的点击事件实际上是从主要活动中捕获的(仅供参考)。

4

4 回答 4

4

最好的选择是使用相机来平移画布。做这样的事情:

// Creates a new camera object
Camera mCam = new Camera();
float startX;
float startY;

@Override
public void onTouch(MotionEvent event)
{
    if(event.getAction() == MotionEvent.ACTION_DOWN)
    {
        startX = event.getX();
        startY = event.getY();
    }
    else if(event.getAction() == MotionEvent.ACTION_MOVE)
    {
        float x = event.getX();
        float y = event.getY();

        // Lets you translate the camera by the difference
        mCam.translate(x -startX, startY - y, 0.f);
        startX = event.getX();
        startY = event.getY();
    }
}

@Override
public void onDraw(Canvas canvas)
{
    // Draw here the objects you want static in the background
    canvas.drawBitmap(mBackground, 0, 0, null);

    canvas.save();
    mCam.applyToCanvas();

    // Draw here the objects you want to move
    canvas.drawBitmap(mBall, 0, 0, null);

    canvas.restore();

    // Draw here the objects you want static on the forebround
    canvas.drawBitmap(mScore, 0, 0, null);
}

请注意,您在 0,0 处绘制 mBall,但由于相机平移,它会移动指定的量。我希望这有帮助。玩得开心 :)

于 2011-06-18T08:19:07.157 回答
1

我在这个问题上睡了一觉,想出了(如果我自己不这么说的话)一个绝妙的、相对简单和优雅的解决方案。很抱歉我自己的喇叭,但我真的欣喜若狂,我能够想出这个。

如果有人正在考虑使用这种方法,那么有几个条件使它成为一个不错的选择。首先,我的所有对象都是使用 setBounds(int,int,int,int) 方法具有预定义位置的可绘制对象,所有对象还存储自己的坐标以便在画布上绘制位置,并且所有对象都在哈希图中调用,这允许我调用和处理所有存在的对象。

现在我在想 kabuko 说了什么,画一个巨大的画布是多么的浪费,以及 id 是如何遇到点击事件问题的,这就是我想出这个的时候。

当屏幕边缘附近发生屏幕触摸事件时,将调用自定义方法 Scroll() 循环遍历每个对象并根据用户尝试滚动的方向调整对象位置的存储坐标。在它增加对象位置之后,它(并行)增加一对用于 x 和 y 偏移的变量。然后将此偏移量考虑到触摸事件的坐标中,以便无论屏幕滚动到哪个位置,仍然可以通过触摸选择对象。

然后为了性能起见,一个简单的 if 语句使得仅当对象坐标落在屏幕范围内时才在对象上调用 draw 。

很抱歉幸灾乐祸,但我真的对此感到惊讶和印象深刻,哈哈。我真的只写了大约一个月的代码,我几乎拥有了一个功能齐全的 2D 策略游戏!

傻瓜的Java得到了回报,哈哈。

于 2011-06-18T19:47:02.480 回答
0

您可以尝试一下您的方法,即使这不是我自己使用过的真正策略。我怀疑无论如何你都会遇到这种方法的一些问题。如果您的游戏已经使用触摸进行输入,那么您将遇到冲突。此外,如果性能是一个问题(特别是如果您有任何动画),您不希望采用这种方法。

如果您要处理线程,那么性能可能很重要。绘图很昂贵,如果你制作一个巨大的画布,你将不得不渲染整个东西,这将花费你。您应该只绘制屏幕上的内容(或多或少)。抱歉,但您可能需要“大修”...

也就是说,处理滚动真的没那么糟糕。你可能有你正在绘制的所有东西的坐标。您需要做的就是跟踪您的“当前坐标”,然后将您的绘图 x 和 y 转换为当前的 x 和 y。处理性能方面的事情,你可以做很多事情,但这开始有点离题了。如果您想了解更多信息,请观看这​​些视频:

http://www.youtube.com/watch?v=U4Bk5rmIpic

http://www.youtube.com/watch?v=7-62tRHLcHk

于 2011-06-18T04:01:49.710 回答
0

横向卷轴游戏的简单技巧是将您的世界划分为多个图块,其中每个图块具有指定的面积。

于 2011-06-18T19:54:33.617 回答