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

| 我正在为Android开发2D游戏,主要是我作为一种经验来学习Android应用程序的编程内幕,因此自然而然地遇到了很多难题需要解决。当前,我的主要活动实例化一个自定义类,该类扩展了SurfaceView并实现了SurfaceHolder.Callback。该视图实例化一个线程,该线程处理大多数逻辑和所有图形处理(包括实例化画布并对其进行绘制等)。 好吧,由于我是一个初学者,所以我开始考虑画布的设计要比屏幕大得多,并允许用户滚动查看画布的所有部分……但是,\这就是我需要做的。 如果有简便的方法,请告诉我。 我最好的猜测是将画布的实际创建放在一个单独的类中,该类扩展了ScrollView,并以某种方式只是从我的线程中对该画布调用所有Draw()\。这可能吗?我的点击事件实际上是从主要活动中捕获的(仅供参考)。     
已邀请:
        最好的选择是使用相机翻译画布。做这样的事情:
// 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,但由于摄像机平移,它将移动指定的量。我希望这有帮助。玩得开心 :)     
        我睡在这个问题上,并提出了一个聪明,相对简单而优雅的解决方案(如果我自己不这么说的话)。不好意思嘟嘟响我自己的号角,但是我真的很高兴我能够提出这个建议。 如果有人正在考虑使用此方法,那么有几个条件使它成为一个不错的选择。首先,使用setBounds(int,int,int,int)方法,我所有的对象都是具有预定义位置的可绘制对象,所有对象还为画布上绘制的位置存储了自己的坐标,并且所有对象都在哈希图中被调用,这使我调用并处理所有存在的对象。 现在,我正在考虑kabuko所说的话,以及如何画一张大画布是多么浪费,以及id如何遇到点击事件问题,这就是我想到的。 当屏幕触摸事件发生在屏幕边缘附近时,将调用自定义方法Scroll(),该方法循环遍历每个对象,并根据用户尝试滚动的方向来调整对象位置的存储坐标。在增加对象位置后,它(并行)增加了x和y偏移量的一对变量。然后将此偏移量计入触摸事件的坐标中,以便无论屏幕滚动到什么位置,仍可以通过触摸选择对象。 然后出于性能考虑,使用了一个简单的if语句,以便仅当对象的坐标落在屏幕范围内时才在该对象上调用draw。 很抱歉,但是我真的很惊讶,这给我留下了深刻的印象,哈哈。我实际上只编写了大约一个月的代码,而我几乎拥有一个功能齐全的2D策略游戏! 傻瓜的Java获得了回报,哈哈。     
        您可以尝试一下自己的方法,即使这并不是我曾经使用过的策略。我怀疑您仍然会在这种方法上遇到一些问题。如果您的游戏已经使用触摸输入,那么您将有冲突。此外,如果根本不考虑性能(特别是如果有动画的话),则不希望采用这种方法。 如果您要深入研究线程,那么性能可能很重要。绘图很昂贵,而且如果您制作一块巨大的画布,则必须渲染整个东西,这将使您花费很多。您只应绘制屏幕上的内容(或多或少)。抱歉,您可能需要进行“大修” ... 也就是说,处理滚动确实还不错。您可能对所绘制的所有内容都有坐标。您需要做的只是跟踪您的“当前坐标”,然后将图形x和y转换为当前的x和y。处理性能问题时,您可以做很多事情,但是这开始变得有点题外话了。如果您想了解更多信息,请看以下视频: http://www.youtube.com/watch?v=U4Bk5rmIpic http://www.youtube.com/watch?v=7-62tRHLcHk     
横向滚动游戏的简单技巧是将您的世界划分为多个小块,其中每个小块都具有指定的面积。 显示基于图块的地图 滚动基于图块的地图     

要回复问题请先登录注册