数组游戏地图怎么把玩家加到地图里

问题描述:从下面的paint草地和paint玩家其实已经发现问题了,画玩家位置的偏移值和画草方块的偏移值不匹配,会发生错位,图:

img


这个就是我想要解决的问题,到这里我需要先说一下至于我为什么要写角色移动偏移值为Indexx * 1而不是和草方块的一样*32,其实是因为Indexx 32时,角色移动很僵硬,就像是瞬移了一块一样,不知道大家有没有玩过老版推箱子,就特别像那种移动一下瞬移一大块,当然我为什么不直接让草地也变成1呢,那是因为地图会变成特别的小。我想的是让角色一点一点的移动,所以我特意的把玩家的位置偏移写少了,这样玩家移动时就像正常走一样,但问题也同时发生了,就上述所言的问题,其实我不说也能感觉到,假如这里是地图的边界的话会怎么样呢?

img


是的,玩家的位置才移动了一点点,就到边界了。

自己想到的方案:给playes玩家类加额外的x和y属性,让玩家在移动时先加x或y。

public void paint(Graphics g) {
        if (x <= 32 || y <= 32 || x >= -32 || y >= -32) {
            if (!recordLeft) {
                g.drawImage(currentRightState, Indexx * x, Indexy * y,ROLE_WIDTH,ROLE_HEIGHT,null);
            }else {
                g.drawImage(currentLeftState, Indexx * x, Indexy * y,ROLE_WIDTH,ROLE_HEIGHT,null);
            }
        }else {
            if (x <= 32) {
                x = 1;
            }else if(x >= -32) {
                x = -1;
            }else if (y <= 32) {
                y = 1;
            }else if(y >= 32) {
                y = -1;
            }
        }
}
public void move() {
      if(x <= 32 || y <= 32 || x >= -32 || y >= -32) {
            if (dir == Dir.LEFT) {
                x--;
            }else if (dir == Dir.RIGHT) {
                x++;
            }else if (dir == Dir.UP) {
                y--;
            }else if (dir == Dir.DOWN) {
                y++;
            }
      }else {//这里是对地图数组修改的代码}
}

然后在move方法和paint方法里写个判断判断x或y是否大于32,如果大于就在数组里面往某个位置挪动一个位置。想法可行,也确实是有这种效果,但可能是因为,

img

,paint刷新频率过快,导致有时可以正常对上,有时对不上。所以还是没能完全解决问题。大家帮我看看有没有其他方法可以解决?

图1:地图数组
1 ->边界;0 ->可移动区域;4 ->玩家
备注:因地图比较大,这里展示一部分,能理解就可以

static int[][] MapList = {
            {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
            {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
            {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
            {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
            {1,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
            {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
            {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
            {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
            {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
}

图2:paint草地的代码截图

img

图3:paint玩家的代码截图

img

因为我目前只学了Java这个面向对象的语言,虽然会写HTML和js也可以独立完成一个中小项目的那种。但这些前端的东西总的而言还是有点单一的,所以我就想着能不能用Java做一个RPG小游戏出来,这段时间做这个小游戏也有在平台上问了三、四个问题,在制作这个游戏的过程也有不少人建议我直接用游戏引擎,但其实,对于面向对象的初学者我来讲,可能有点荒谬,但我还是耐不住好奇心想试试游戏在底层到底都做了什么物理算法,目前前面写了好几个基础的物理模拟,类似与碰撞检测,地图边界检测的镜头释放,npc自动寻路和自动攻击玩家,背包系统等等,但后面正式加入地图的时候问题就随之而来了,问题出来了,也稍微被问题点醒了一点,因为我发现我前面做的那些物理碰撞和地图边界,npcAI,在地图加进来的时候都用不上,后面发现了一个貌似可行的方法,就是直接把角色也变成地图的一部分,这样就可以在移动玩家时直接判断是否等于0值,如果是就可以走,反之,这样不就直接省去了很多繁琐的检测?所以希望可以授予一点点知识。

给你一个思路:
界面显示什么和后台数据是什么,是两回事
比如玩家坐标其实是100,100;
但是界面显示不一定非要把图形画在100,100上面,而是有一个动画效果,比如从90,100到100,100的一个连续行走,甚至干脆就是一段gif动画代替真的位移
也就是说图片坐标其实没动,动的是图片里的内容
总之手法很多,灵活运用就行了
还是强调一点:显示的坐标和实际用来判断的坐标应该是两组不同的坐标,不要都用同一组,那样让你的代码异常复杂,而且会把你自己的思维搞乱