`
xpenxpen
  • 浏览: 724990 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

魍魉校园(Java版AVG游戏开发入门)源码分析

阅读更多
0.前言
本例子取自cping1982早期公开的一个AVG源码,loon-simple-20090212,里面带了6个游戏。这次我们要分析的是AVGSimple这个游戏。截图如下:


下载地址:http://code.google.com/p/loon-simple/downloads/list

声明一下,这个程序不是我写的,是cping1982写的。本人在这里斗胆分析一下高手5年前写的代码,一来是提高自己,二来也是给众多小白以信心和勇气,分析完源码你会发现用java写一个AVG游戏还是不难的。
如果你无法访问google code,也可在本文文末下载我已经加上了注释的版本。

原作者的博客上有3篇文章,可谓说相当好。说的东西都是点到为止,需要读者自己去结合源码细细品味。
Java版AVG游戏开发入门[0]——游戏模式转换中的事件交互
Java版AVG游戏开发入门[1] —— CG的绘制
Java版AVG游戏开发入门示例[3]——脚本引擎的制作及应用

我这里稍微再详细的分析一点源码。

1. 游戏模式转换

IControl的抽象化是关键,可以避免像STG雷霆行动那样冗长的if else分支判断现在处于哪种模式,使得扩展更简单。其实我们看一下这张序列图可以发现,一切的东西都是绘制到画布上的(AVGCanvas.paint方法),只是“如何画”这个逻辑给分散到了不同的IControl子类里。而AVG.setControl可以达到方便的切换模式的作用。


IControl有这些子类
Title 标题模式
Script 游戏中模式(采用了脚本系统)
AqueductGame 水渠贯通小游戏模式



IControl有如下这些方法可供子类实现
invoke 转换控制器接口
draw  画图
mouseMoved 鼠标处理
mousePressed 鼠标处理
keyPressed 键盘处理

这样添加新的模式就很简单了,各个模式之间相对做到解耦,而且功能也都有了。

2. CG
就是实现IControl各个子类的draw方法。如何画?主要步骤就是先画背景图,再画前景。

下面举1例
2.1 Title的绘制


public void draw(Graphics g) {
	//1.先绘制背景图
	graphics.drawImage(title, 0, 0, null);
	//2.画窗体蓝色背景
	Message.setWindowMessage(graphics, MESSAGE_LINE_X1, MESSAGE_LINE_Y1,
			MESSAGE_LINE_X2, MESSAGE_LINE_Y2);
	//3.画窗体边框
	Message.setWindowFrame(graphics, MESSAGE_LINE_X1, MESSAGE_LINE_Y1,
			MESSAGE_LINE_X2, MESSAGE_LINE_Y2);
	//4.画菜单选项
	for (int i = 0; i < messages.length; i++) {
		// 选中
		if (i == selectFlag) {
			// 变更字体颜色。
			graphics.setColor(Color.white);
			// 设定浮标。
			Message.setWindowBuoyageMessage(selectFlag, 160, 34, graphics,
							MESSAGE_LINE_X1, MESSAGE_LINE_Y1,
							MESSAGE_LINE_X2 + fontSize + 2, MESSAGE_LINE_Y2
									+ fontSize + 40);
		// 未选中
		} else {
			graphics.setColor(Color.gray);
		}
		//一个字一个字的画出来
		for (int k = 0; k < messages[i].length(); k++) {
			Utility.drawDefaultString(messages[i].substring(k, k + 1).toString(), graphics, font * k + left, i
							* (font + fontSize) + font + top, 1, font);
			
		}

	}

	g.drawImage(screen, 0, 0, null);
	g.dispose();
}


用的是RPG Maker XP格式的窗体图。



第一步简单,把背景图画出来即可。
第二步如图,A区绘制窗体蓝色背景,会有一个比例扩大。
第三步如图,需要将B区的通过比例换算分8步画出来(上,下,左,右,还有4个角)
第四步画菜单选项。需要根据鼠标的移动高亮选中的菜单项。

同时,mouseMoved方法处理鼠标的移动,赋值selectFlag,以待下一次绘图时高亮菜单选项。
public void mouseMoved(MouseEvent e) {
	super.mouseMoved(e);
	int k = (Control.mouse.y - top) / (font + fontSize);
	//如果鼠标太上面
	if (k < 0) {
		return;
	}
	//如果鼠标太下面
	if (k >= messages.length) {
		return;
	}
	//赋值selectFlag,以待下一次绘图时高亮菜单选项
	for (int l = 0; l < messages.length; l++) {
		if (l == k) {
			selectFlag = k;
			continue;
		}
	}
	//如果鼠标x轴在框内,则标记“选中”
	if ((double) Control.mouse.x > this.MESSAGE_LINE_X1
			&& (double) Control.mouse.x < this.MESSAGE_LINE_X1
					+ (double) this.MESSAGE_LINE_X2
			&& (double) Control.mouse.y > this.MESSAGE_LINE_Y1
			&& (double) Control.mouse.y < this.MESSAGE_LINE_Y1
					+ (double) this.MESSAGE_LINE_Y2) {
		select = true;
	} else {
		select = false;
	}
}


3. 脚本系统

脚本系统的运用一方面可以使得开发效率提高,bug更少,另一方面可以使得后期维护简单。脚本系统一旦成熟,不懂java的人也可以维护甚至开发一个新的游戏。

比如下面脚本显示背景,再显示了2个人物(xiaoyanyan和ranmin)。
cg del
gb image/ghost.png
cg chara/xiaoyanyan.png 0
cg chara/ranmin.png 200
cgwait


原理和之前Title画面类似,主要就是nextScript方法执行脚本,赋给变量(修改model层),而draw方法根据变量不同来画图(view层)。两个方法搭配,比较好的实现了MVC模式。
修改model层
private synchronized int nextScript(final int index, final String s) {
        //......
	for (j = index; j < scriptContent.length; j++) {
		//显示信息
		if (messageFlag.equalsIgnoreCase("mes")) {
			isMessage = true;
			break;
		}
		//背景
		if (messageFlag.equalsIgnoreCase("gb")) {
			if (objectFlag == null) {
				return index;
			}
			if (objectFlag.equalsIgnoreCase("none")) {
				cg.setBackgroundCG(null);
			} else {
				cg.setBackgroundCG(Utility.loadImage(objectFlag));
			}
			continue;
		}
		//人物
		if (messageFlag.equalsIgnoreCase("cg")) {
			if (objectFlag == null) {
				return index;
			}
			if (objectFlag.equalsIgnoreCase("del")) {
				//删除原有人物
				if (orderFlag != null) {
					cg.removeImage(orderFlag);
				} else {
					cg.clear();
				}
			} else {
				//添加人物
				int x = 0, y = 0;
				if (orderFlag != null) {
					x = Integer.parseInt(orderFlag);
				}
				if (gotoFlag != null) {
					y = Integer.parseInt(gotoFlag);
				}
				cg.addImage(objectFlag, x, y);
			}
			continue;
		}
	}
}


view层
public void draw(final Graphics g) {
	//1.画背景,带晃动
	if (cg.getBackgroundCG() != null) {
		if (shakeNumber > 0) {
			//通过随机数,达到图片在小范围内晃动效果
			graphics.drawImage(cg.getBackgroundCG(),
					shakeNumber / 2 - Control.rand.nextInt(shakeNumber),
					shakeNumber / 2 - Control.rand.nextInt(shakeNumber), null);
		} else {
			graphics.drawImage(cg.getBackgroundCG(), 0, 0, null);
		}
	}
	//2.画人物
	for (int i = 0; i < cg.getCharas().size(); i++) {
		Chara chara = (Chara) cg.getCharas().get(i);
		graphics.drawImage(chara.getCharacterCG(), chara.getX(), chara
				.getY(), null);
	}
}


附件有比较详细的注释,可以参考。
  • 大小: 6.9 KB
  • 大小: 6.8 KB
  • 大小: 2.9 KB
  • 大小: 354.4 KB
  • 大小: 243.5 KB
  • 大小: 4.3 KB
分享到:
评论

相关推荐

    一个完整且功能齐全的编译器开发项目

    本编译器开发项目使用解析器生成器:ANTLR,生成一个 Java 解析器,该解析器可以从MicroC语法构建和遍历解析树。然后,可以配置 ANTLR 以自动生成 AST(抽象语法树)。最后,我们对生成的 AST 进行遍历并生成 Risc-V...

    围住神经猫

    【标题】"围住神经猫"是一款基于HTML5技术开发的经典游戏,它的出现标志着HTML5在游戏领域的广泛应用和巨大潜力。 【HTML5开发】HTML5是超文本标记语言的第五个版本,它提供了许多新的元素和API,旨在提高网页的...

    电子商务微服务架构(JAVA)

    基于事件驱动和微服务架构的电子商务后端项目,包含 Java、Spring、AWS SNS、AWS SQS、PostgreSQL、MySQL、MongoDB 和 Docker。 实施微服务: 配置服务器(负责集中应用程序配置) 发现服务器(中央服务器,维护应用...

    嵌入式 开发实验室课程(C 语言)

    嵌入式开发概述 目标受众 课程安排 会议日程

    Android版俄罗斯方块游戏(使用Android Studio构建)

    插图和音效许可证:GNU 通用公共许可证第 3 版 软件许可证:GNU 通用公共许可证第 3 版 得分 ------- 每清除一行的基本分数为: 1 行 100 分, 2 行 300 分, 3 行 500 分, 4 行 800 分(称为“俄罗斯方块”)。 ...

    MIPI协议相关

    在压缩包内的文件可能是MIPI DSI和CSI的规范文档、开发者指南、应用案例分析或者是硬件设计参考手册。这些文件将详细介绍MIPI协议的结构、工作原理、电气特性、时序图以及如何在实际项目中应用这些协议。学习和理解...

    SwiftUI/Swift 项目,学习如何以原生方式开发 iOS 应用程序

    功能: 1、开胃菜清单 可点开胃菜列表,附带菜品详情预览 2、订单 历史订单列表 3、帐户 用于编辑数据的简单表格

    蓝桥杯竞赛-算法竞赛技巧、常用数据结构、蓝桥杯题解

    蓝桥杯竞赛资源目录: 算法竞赛技巧 常用算法模板-Java 常用数据结构-Java 蓝桥杯题解 97.k倍区间 99.分巧克力 101.拉马车 153.洁净数 160.字符计数 168.倍数问题 182.小朋友崇拜圈 ...3518.三国游戏 ....

    Oracle 数据库数据仓库设计 ETL 流程和业务分析查询设计

    该项目使用 Oracle 和 PL/SQL 实现端到端数据仓库。它涉及设计星型模式、创建维度和事实表、优化 ETL(提取、转换、加载)流程以及开发业务分析仪表板,以全面了解销售、库存和员工绩效。

    “那碾”技巧在剧情创作中的运用.rar

    "那碾"技巧,源自日本推理小说家京极夏彦的作品《魍魉之匣》中的概念,是一种在剧情创作中制造悬念和反转的手法。它指的是在故事发展过程中,逐步揭示出与之前情节完全相反的事实,使读者或观众对已知信息产生怀疑,...

    心脏起搏器计划(Matlab语言)

    该项目由麦克马斯特大学和 SFWRENG 3K04 - 软件开发课程完成。 这项作业主要分为两部分。第一部分涉及在硬件平台上创建实时软件。第二部分涉及正确记录作业期间发生的开发。这项作业的主要目的是让学生能够解析所...

    【创新设计】2014高三语文二轮专题复习 考前题型滚动练1 基础知识+名著阅读+古诗文填空+诗歌鉴赏.doc

    - 读音辨析:如"魍魉(wǎng)"、"欺罔(wǎng)"等,学生需要掌握多音字和常见字的正确读音。 - 错别字识别:如"绵里藏针"应为"棉里藏针","美仑美奂"应为"美轮美奂",这要求学生有扎实的基础知识和细致的观察力。 2...

    基于Bootstrap与jQuery-validate的个人封装检验框架demo

    在IT领域,前端开发是构建用户界面的关键部分,而Bootstrap和jQuery-validate是两个非常流行的工具,用于提升网页设计和表单验证的效率。本项目"基于Bootstrap与jQuery-validate的个人封装检验框架demo"是一个很好的...

    ARM体系的汇编指令详解

    从1996年2月的第一版开始,到2005年7月的最终版(即问题I版)结束,其间有若干修订和更新。对于ARMv7-M架构的详细文档描述,可以在文档的附加阅读部分找到相关信息。 ARMv7架构定义了不同的架构配置文件,其中包括A...

    Objective-C-mingw 示例

    在 MinGW 开发环境中使用 Objective C 的一些示例

    setuna截图神器

    Setuna是一款广受欢迎的...无论是日常的工作交流,还是专业的项目开发,Setuna都能为用户提供高效、便捷的截图解决方案。如果你还没有尝试过Setuna,不妨下载体验一下,相信它会让你的屏幕截图工作变得更加得心应手。

    putty工具下载

    在Android开发和调试过程中,PuTTY可以作为一个实用工具,尤其是当开发者需要在没有图形用户界面的环境中操作设备时。 描述中提到了“连接方式选择adb”。ADB是Android开发者的重要工具,用于与Android设备进行通信...

    Owasp Testing Guide v4 中文版.pdf

    《Owasp Testing Guide v4 中文版》是OWASP(Open Web Application Security Project)组织发布的一份关于Web应用程序安全测试的重要指南,旨在帮助安全测试人员进行深入的渗透测试和代码评估,确保Web应用的安全性...

    YOLOs-CPP:单个 c++ 头文件和高性能应用程序

    YOLOs-CPP提供单个 c++ 头文件和高性能应用程序,该应用程序使用来自Ultralytics的各种 YOLO(You Only Look Once)模型进行实时对象...无论您是为研究、生产还是业余项目进行开发,此应用程序都能提供灵活性和效率。

Global site tag (gtag.js) - Google Analytics