JavaFX战旗类游戏开发 第六课 移动范围的获取

  有一段时间没有写这个战旗游戏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 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 nearList = near.getNearNodeList(); //获取开始节点附近的4个节点
			addMoveWNode(nearList, start, near, step);  
		}
		return closeList;
	}

	public void addMoveWNode(LinkedList 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战旗类游戏开发 第六课 移动范围的获取_第1张图片

  

  突然觉得贴所有的代码还是比较的麻烦,这里就先讲原理,大家也可以自己试着写写。最后一课我将会把整个项目提供下载。

  那么这一课就到这里了,下一课我们将会讲述JavaFX战旗游戏里的回合逻辑。

 本文章为个人原创,版权所有,转载请注明出处:http://blog.csdn.net/ml3947。另外我的个人博客:http://www.wjfxgame.com. 

你可能感兴趣的:(JavaFX,JavaFX游戏开发)