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<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.

时间: 2024-10-14 06:07:12

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

JavaFX战旗类游戏开发 第四课 属性框和菜单的创建

上一课中,我们创建了游戏角色.这节课中,我们将会创建菜单,以便后面使用. 由于只是Demo,我创建的是最简单的形式,如下图所示: 基于游戏开发中的UI控件通常需要有事件(比如图中的移动,攻击,待机,是有事件处理的),我们应该首先创建自己的文字控件. 文字控件代码如下: import com.sun.javafx.tk.FontMetrics; import com.sun.javafx.tk.Toolkit; import javafx.scene.canvas.GraphicsContext;

JavaFX战旗类游戏开发 第三课 创建游戏角色

在上一节课程中,我们学习了在JavaFX中绘制游戏地图.这一节课,我们将会创建我们的游戏角色. 首先,同样的,我们创建一个简单的基类. import javafx.scene.canvas.GraphicsContext; /** * 游戏物体基类 * @author Wing Mei */ public abstract class BaseObject { protected double x, y; protected double width,height; protected bool

JavaFX战旗类游戏开发 第二课 游戏地图绘制

在上一节课中,我们对即将要完成的战旗Demo有了一个大概的了解,本节课当中,我们将会学习绘制游戏地图. 自从在JavaFX 2.2中增加了Canvas相关的功能,我们就可以使用Canvas来实现游戏绘制了. 游戏地图绘制主要用到GraphicsContext.drawImage方法. drawImage(Image image,double sx,double sy,double sw,double sh,double dx,double dy,double dw,double dh); 其中i

JavaFX横幅类游戏开发 教训 游戏贴图

上一节课,我们即将完成战旗Demo有了一个大概的了解.教训这,我们将学习绘制游戏地图. 由于JavaFX 2.2中添加了Canvas相关的功能,我们就能够使用Canvas来实现游戏绘制了. 游戏地图绘制主要用到GraphicsContext.drawImage方法. drawImage(Image image,double sx,double sy,double sw,double sh,double dx,double dy,double dw,double dh); 当中image 表示源图

JavaFX战旗游戏开发 第七课 回合逻辑(完)

上一节课中,我们讲述了SLG中获取移动范围的算法(获取攻击范围也是同理),相对如自动寻径来说,简单不少.由于个人时间问题,这一节课将会把内容讲完,将这个系列完结,并给出示例下载地址. 项目下载地址:JavaFX战旗类游戏开发示例 注意:该项目为e(fx)clipse项目 在战旗游戏开发中,最基本的回合逻辑就是敌方回合和我方回合.当然,在如今的SLG游戏中,往往是根据我方角色和敌方角色的某些数值计算(例如速度之类的),来排列角色操控的列表,而且某些技能还能中断某个角色的操作,将他往操作列表的后面移

【鹏派】网上棋类牌类游戏开发领军品牌-如何赚95%棋类牌类平台利润

[合肥鹏派]网上棋类牌类游戏开发领军品牌-如何赚95%棋类牌类游戏利润 曾孕育中国最早一批游戏玩家的街机电玩,在无比恋旧难舍情怀的时代,棋类牌类手游的代表作.百分之百移植捕鱼游戏等特色玩法的街机,获得了80后.90后这两代消费大军的广泛支持.万人在线同台竞技重温经典的移动电玩时代已全面到來.合肥鹏派于2015年从街机游戏植入网络版的碰碰车,飞禽走兽,森林舞会,金鲨银鲨等多款游戏开始,获得了广大玩家的热爱.但如何紧跟鹏派的步伐赚取棋类牌类游戏95%的利润,需要避免以下棋类牌类游戏开发商的引导误区!

Android手机棋牌类游戏开发

在多数外行人的眼中,开发手机游戏是很难的一件事情,其实,真实的情况是开发游戏其实比开发一些应用更简单.由于游戏的本身是根据程序逻辑来控制,而不是在屏幕上不断地胡乱显示和更新图片,只需要将主角绘制上去,再将编辑好的地图先绘制到屏幕上去,当我们按下了鼠标或其他键时,主角绘制的位置向变动动就可以实现我们的目的了.所以从某中程度来说,手机类棋牌游戏的开发并不复杂. 随着安卓智能手机的普及,手机棋牌类游戏由于玩法基本固定.规则相对明确,研发门槛更低,android类棋牌游戏开发,被业内人士称为继短信之后的

飞行射击类游戏开发实战(系列)-窗口建立

首先这是一个谢列,这个系列完以后,我们就完成了一个设计类游戏,注意采用面向对象的方式采用OpenGL可编程管线技术进行开发支持多平台.代码下载地址: #pragma once #include <Windows.h> #include <tchar.h> namespace CELL { class CELLWinApp { public: //! 实例句柄 HINSTANCE _hInstance; //! 窗口句柄 HWND _hWnd; //! 窗口的高度 int _widt

unity3D游戏开发实战原创视频讲座系列9之塔防类游戏开发第一季

解说文件夹 塔防游戏0基础篇... 第一讲  游戏演示和资源介绍... 第二讲  游戏场景的完毕... 第三讲  预制体的制作... 第四讲  敌人的随机产生和按路径行走... 第五讲  塔防工具的产生和设计... 第六讲  敌人血条的改变和分数使用... 第七讲  鼠标控制摄像头... 第八讲  玩家生命值的使用... 视持续更新中.... 视频存放地址例如以下:http://ipd.pps.tv/user/1058663622 或者:http://www.iqiyi.com/u/105866