基于Starling的2d平台游戏,其平铺贴图大于最大纹理尺寸

时间:2014-07-24 04:13:08

标签: actionscript-3 starling-framework

我正在使用纯Starling for mobile(Android / iOS)(没有Citrus Engine)进行自上而下的2d平台游戏。我正在用平铺创建地图。通常地图比2048X2048更大,我正在寻找这个问题的解决方案。有一个相机类根据播放器移动地图。 我尝试的技术可能是错误的,因为我第一次这样做。所以,如果我做错了什么,请纠正我,并帮我解决这个问题。

这是我到目前为止所做的:

地图:

  • 使用平铺地图编辑器
  • 创建
  • 有多个图层,整个地图的最小尺寸为2000x2000,图块为20x20
  • 用于读取tmx文件我正在使用Starling TMXMap扩展(http://wiki.starling-framework.org/extensions/tmx_maps)(虽然我已对其进行了一些调整) 我的方法:
  • 我所做的是我创建了一个屏幕大小的渲染纹理(在我的情况下是1280x720),并试图绘制地图的可见区域
  • TMXTileMap类创建精灵并将它们存储在一个数组中......但是我添加了一个函数,它采用左上角坐标并仅在纹理上绘制可见的图块

问题:由于帧速率降至5-10fps,我在这里做了一些非常错误的事情。而且我也无法正确移动地图。

如果需要,我也可以发布一些代码......如果你可以指导我正确的方向或帮助我,那就太棒了。

  • 这些是我对帖子中链接的扩展名的TMXTileMap.as类所做的更改。
  • 在loadLayers()函数末尾有一个调用drawLayers()方法。我已经注释掉了这个方法并添加了我在循环中调用的下面的方法

  • '屏幕'是我要绘制地图的纹理(屏幕尺寸1280x720)(大于2000x2000)

  • ' screenRect'是我想要绘制的地图区域
  • 为了正确理解,您可能希望查看http://wiki.starling-framework.org/extensions/tmx_maps

    处的扩展类
    public function drawMapLayers(screen:RenderTexture, screenRect:Rectangle):void
    {
        screen.drawBundled(function():void
            {
                for (var i:int = 0; i < _numLayers; i++)
                {
                    var col:int = Math.floor(screenRect.x / _tileWidth);
                    var row:int = Math.floor(screenRect.y / _tileHeight);
                    var endCol:int = Math.floor((screenRect.x + screenRect.width) / _tileWidth) - 1;
                    var endRow:int = Math.floor((screenRect.y + screenRect.height) / _tileHeight) - 1;
    
                    var initNum:uint = row * (endCol - col + 1) + col;
                    var lastNum:uint = endRow * (endCol - col + 1) + endCol;
    
                    //var initNum:uint = col * (endRow - row) + row;
                    //var lastNum:uint = endCol * (endRow - row) + endRow;
    
                    //trace("Points", col, row, endCol, endRow, initNum, lastNum);
    
                    for (var k:int = col; k <= endCol; k++)
                    {
                        for (var l:int = row; l <= endRow; l++)
                        {
                            var gridNum:uint = l * (_mapWidth) + k;
    
                            if (_layers[i].layerData[gridNum] != 0)
                            {
                                //trace(gridNum, _layers[i].layerData[gridNum]);
    
                                if (findTileWithGID(_layers[i].layerData[gridNum]) != null)
                                {
                                    var img:Image = new Image(findTileWithGID(_layers[i].layerData[gridNum]).texture);
    
                                    if (_layers[i].properties["alpha"] != undefined)
                                    {
                                        img.alpha = Number(_layers[i].properties["alpha"]);
                                    }
    
                                    if (img.width > _tileWidth || img.height > _tileHeight)
                                    {
                                        img.x = k * _tileWidth;
                                        img.y = l * _tileHeight;
    
                                        img.y -= (img.height - _tileHeight);
                                    }
                                    else
                                    {
                                        img.x = k * _tileWidth;
                                        img.y = l * _tileHeight;
                                    }
    
                                    trace(gridNum, img.x, img.y);
                                    screen.draw(img);
                                }
                            }
                        }
                    }
                }
            });
    }
    

0 个答案:

没有答案