使我的画布可滚动而无需大修

时间:2011-06-18 03:28:39

标签: java android scrollview android-canvas draw

我正在开发一款用于Android的2D游戏,主要是我用它作为一种体验来学习Android应用程序的编程和编程,所以很自然地我遇到了很多谜题来工作通过。目前,我的主要活动实例化一个自定义类,它扩展了SurfaceView并实现了SurfaceHolder.Callback。该视图实例化一个处理大部分逻辑和所有图形处理的线程(这包括实例化画布和绘制它等等。

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

如果有简单的方法,请告诉我。

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

4 个答案:

答案 0 :(得分: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,但由于相机转换,它将按指定的数量移动。我希望这有帮助。玩得开心:))

答案 1 :(得分:1)

我睡了这个问题然后想出来(如果我不这么说的话)一个聪明,相对简单和优雅的解决方案。对不起,我自己的号角,但我真的很欣喜,我能够想出这个。

如果有人想要使用这种方法,有几个条件使这个选择成为一个好的选择。首先,我的所有对象都是使用setBounds(int,int,int,int)方法的预定义位置的drawables,所有对象也存储自己的坐标,用于在画布上绘制的位置,所有对象都以哈希图调用,这样我就可以调用和处理现有的所有对象。

现在我正在考虑kabuko所说的内容以及绘制一个巨大的画布以及如何识别点击事件问题是如此浪费,这就是我想出来的时候。

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

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

对不起幸灾乐祸,但我真的很惊讶,并为此留下了深刻的印象,哈哈。我真的只编写了大约一个月的时间,而且我几乎拥有一个功能齐全的2D策略游戏!

Java for dummies得到了回报,哈哈。

答案 2 :(得分:0)

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

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

那就是说,处理滚动真的不是那么糟糕。您可能有绘制所有内容的坐标。您需要做的就是跟踪“当前坐标”,然后用当前的x和y转换图形x和y。处理性能的东西,你可以做很多事情,但这开始有点偏离主题。如果您想了解更多信息,请查看这些视频:

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

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

答案 3 :(得分:0)

横向滚动游戏的简单技巧是将您的世界划分为每个图块具有指定区域的图块。