首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >2D数组的渲染距离--Minecraft 2D

2D数组的渲染距离--Minecraft 2D
EN

Stack Overflow用户
提问于 2012-02-18 08:56:36
回答 1查看 598关注 0票数 0

现在我从char的2D阵列加载我的地图,当我加载超过100个街区(10x10区域)时,游戏真的很慢。我让它只渲染离字符一定距离内的块。我也相信我知道为什么它运行得这么慢,但我不知道如何修复它。代码如下:

代码语言:javascript
运行
复制
public void renderBlocks(Graphics g) {
    super.paint(g);
    Graphics2D g2d = (Graphics 2D)g;
    for(int x = 0; x < 50; x++) {
        for(int y = 0; y < 50; y++) {
            //blocks[x][y] tells it which type of block to load
            Block next = new Block(blocks[x][y], x, y); 

            if((next.getX() - player.getX()) >= (-13*32) && 
            (next.getX() - player.getX()) <= (13*32)) {

                if((next.getY() - player.getY()) >= (-6*32) && 
                (next.getY() - player.getY()) <= (6*32)) {

                     g2d.drawImage(next.getImage(), (next.getX() - player.getX()),    
                      (next.getY() - player.getY()), this);
                }
            }
         }
     }
 }

这行代码:

代码语言:javascript
运行
复制
Block next = new Block(blocks[x][y], x, y);

是什么让它运行得非常慢。即使它没有将这些元素绘制到屏幕上,它仍然将blocks[x][y]的所有元素的Block next设置为等于new Block(blocks[x][y], x, y)。问题是我不能简单地删除这行代码,因为它决定了离字符有多远才能画块。我需要让它只将next设置为与绘制到屏幕上的blocksx的元素数量相等。

我已经尝试过了:

代码语言:javascript
运行
复制
if((x - player.getX()) >= (-13*32) && (x - player.getX()) <= (13*32)){
    Block next = new Block(blocks[x][y], x, y);
    ...Rest of Code here
}

绕过它,对y - playerY也是如此,但它不起作用,尽管理论上它应该起作用。

请回答这个问题,如果你知道一种方法来做到这一点,并使游戏运行的速度一样快,当我从ArrayList加载块,这允许我加载超过5000块,它运行在一个良好的每秒每秒速率。如果你需要游戏的源代码来帮助我解决这个问题,评论你需要它,我会发布它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-18 10:04:25

您可以仅在玩家周围的瓷砖上创建循环:

代码语言:javascript
运行
复制
super.paint(g);
Graphics2D g2d = (Graphics 2D)g;

// find the block with the player (might need correction)
int playerX = (int) (player.getX() / 32);
int playerY = (int) (player.getY() / 32);

int viewDist = 6;

int lowerX = Math.max(playerX - viewDist, 0);
int upperX = Math.min(playerX + viewDist + 1, 50);
int lowerY = Math.max(playerY - viewDist, 0);
int upperY = Math.min(playerY + viewDist +  1, 50);

for (int x = lowerX; x < upperX; x++)
{
    for (int y = lowerY; y < upperY; y++)
    {
        Block next = new Block(blocks[x][y], x, y);
        g2d.drawImage(next.getImage(), (next.getX() - player.getX()),    
                      (next.getY() - player.getY()), this);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9337488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档