问题描述:从下面的paint草地和paint玩家其实已经发现问题了,画玩家位置的偏移值和画草方块的偏移值不匹配,会发生错位,图:
这个就是我想要解决的问题,到这里我需要先说一下至于我为什么要写角色移动偏移值为Indexx * 1而不是和草方块的一样*32,其实是因为Indexx 32时,角色移动很僵硬,就像是瞬移了一块一样,不知道大家有没有玩过老版推箱子,就特别像那种移动一下瞬移一大块,当然我为什么不直接让草地也变成1呢,那是因为地图会变成特别的小。我想的是让角色一点一点的移动,所以我特意的把玩家的位置偏移写少了,这样玩家移动时就像正常走一样,但问题也同时发生了,就上述所言的问题,其实我不说也能感觉到,假如这里是地图的边界的话会怎么样呢?
是的,玩家的位置才移动了一点点,就到边界了。
自己想到的方案:给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,如果大于就在数组里面往某个位置挪动一个位置。想法可行,也确实是有这种效果,但可能是因为,
,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草地的代码截图
图3:paint玩家的代码截图