有一段时间没有写这个战旗游戏Demo的教程了。现在来继续。
战旗类游戏的范围获取其实并不复杂,主要是节点的遍历和权值的比较。
大家知道,在A*Star最短寻径算法里,权值是有个G值和H值的,G值是起点到当前点的移动量(通常相邻两格移动量在1),H值是当前点到目标点的移动量估算值。
当然,对于SLG游戏中寻找移动范围,并没有这么复杂,我们在这里只需一个G值,用于表示移动量。
主要算法原理:
1.有两个List----OpenList,CloseList。
2.将要移动的角色位置,添加到OpenList和CloseList中。
3.将OpenList中第一个位置点取出,并获取这个点的上下左右四个点。
4.根据上下左右四个地图方块的权值,给这些点计算权值。
5.如果这些点,在链表中不重复,并且权值小于角色的移动力(我们在这里将角色的移动力作为最大的权值),则将这些点加入到这两个链表。另外在这一个步骤中,我们也可以判断该点能否移动(例如该点有其他角色,该点为不可移动的石墙等等)。
循环重复3-5的操作,直到OpenList为空后,CloseList则是我们角色可以移动的范围点。
主要逻辑代码如下:
public LinkedList<WNode> SearchMoveScan(Point2D location, int step) { WNode start = new WNode(location); start.setValueG(0); start.setParent(null); levelList.add(start); closeList.addFirst(start); while (levelList.size() > 0) { WNode near = (WNode) levelList.toArray()[0]; levelList.remove(0); LinkedList<WNode> nearList = near.getNearNodeList(); //获取开始节点附近的4个节点 addMoveWNode(nearList, start, near, step); } return closeList; } public void addMoveWNode(LinkedList<WNode> near, WNode start, WNode before, int step) { for (int i = 0; i < near.size(); i++) { WNode nearWNode = near.get(i); double x = nearWNode.getPoint().getX(); double y = nearWNode.getPoint().getY(); try { switch (map[(int)y][(int)x]) { case 0: nearWNode.setValueG(before.getValueG() + 1); break; case 7: nearWNode.setValueG(before.getValueG() + 4); break; case 18: nearWNode.setValueG(before.getValueG() + 2); break; } } catch (Exception e) { nearWNode.setValueG(before.getValueG() + 1); } boolean isOpen = contains(levelList, nearWNode); boolean isClose = contains(closeList, nearWNode); boolean isHit = isHit((int) nearWNode.getPoint().getX(), (int) nearWNode.getPoint().getY()); if (!isOpen && !isClose && !isHit && nearWNode.getValueG() <= step) { levelList.addM(nearWNode); closeList.addFirst(nearWNode); } } } public boolean isHit(int x, int y) { //判断当前该地点能否移动 if (map_sprite != null) { if (map_sprite[y][x] != 0) return true; } return false; }
主要达到如下图的效果:
突然觉得贴所有的代码还是比较的麻烦,这里就先讲原理,大家也可以自己试着写写。最后一课我将会把整个项目提供下载。
那么这一课就到这里了,下一课我们将会讲述JavaFX战旗游戏里的回合逻辑。
本文章为个人原创,版权所有,转载请注明出处:http://blog.csdn.net/ml3947。另外我的个人博客:http://www.wjfxgame.com.