问题描述:从下面的paint草地和paint玩家其实已经发现问题了,画玩家位置的偏移值和画草方块的偏移值不匹配,会发生错位,图:
自己想到的方案:给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,如果大于就在数组里面往某个位置挪动一个位置。想法可行,也确实是有这种效果,但可能是因为,
图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玩家的代码截图
因为我目前只学了Java这个面向对象的语言,虽然会写HTML和js也可以独立完成一个中小项目的那种。但这些前端的东西总的而言还是有点单一的,所以我就想着能不能用Java做一个RPG小游戏出来,这段时间做这个小游戏也有在平台上问了三、四个问题,在制作这个游戏的过程也有不少人建议我直接用游戏引擎,但其实,对于面向对象的初学者我来讲,可能有点荒谬,但我还是耐不住好奇心想试试游戏在底层到底都做了什么物理算法,目前前面写了好几个基础的物理模拟,类似与碰撞检测,地图边界检测的镜头释放,npc自动寻路和自动攻击玩家,背包系统等等,但后面正式加入地图的时候问题就随之而来了,问题出来了,也稍微被问题点醒了一点,因为我发现我前面做的那些物理碰撞和地图边界,npcAI,在地图加进来的时候都用不上,后面发现了一个貌似可行的方法,就是直接把角色也变成地图的一部分,这样就可以在移动玩家时直接判断是否等于0值,如果是就可以走,反之,这样不就直接省去了很多繁琐的检测?所以希望可以授予一点点知识。
给你一个思路:
界面显示什么和后台数据是什么,是两回事
比如玩家坐标其实是100,100;
但是界面显示不一定非要把图形画在100,100上面,而是有一个动画效果,比如从90,100到100,100的一个连续行走,甚至干脆就是一段gif动画代替真的位移
也就是说图片坐标其实没动,动的是图片里的内容
总之手法很多,灵活运用就行了
还是强调一点:显示的坐标和实际用来判断的坐标应该是两组不同的坐标,不要都用同一组,那样让你的代码异常复杂,而且会把你自己的思维搞乱