通过Unity2D独立开发一款瓷砖式RPG游戏需要学习哪些知识

【纯JAVA语言做RPG游戏】1.做个瓷砖地图生成器 -
- ITeye技术网站
博客分类:
开个坑,想做个JAVA游戏。
虽然现在有着各种游戏引擎,使得做游戏的效率提高了很多,但是用着别人的代码来做感觉对自己也没啥提升,而且在游戏的模式上也不得不去迎合别人的思维,所以露珠准备应用前面学到的所有JAVA知识,来完成这个不用引擎的游戏项目,也算是一个对前面知识的总结与复习吧 O(∩_∩)O~
嗯,下面开始正题。
说到RPG游戏,首先想到的是现在市面上各种各类的3D巨作,可这些是我这种菜鸟暂时无法企及的,所以呢,目标就定为2D的RPG游戏了.
一想到2D的RPG游戏,立马回想起了一系列的以前电子词典上面的《金庸群侠传》《侠客行》之类的,这种游戏的共同点便是,所有的游戏元素都是一个一个的小方块,而游戏画面也就是由这一个一个的小方块构成。
这些不同的小方块组成了游戏的地图,因为他们的上下左右都是对齐的,这样我们自然的就想到了用一种熟悉的数据结构来在游戏内部表示和储存它,那便是二维数组。我们用二维数组的位置i,j来确定小方块在地图中的坐标位置,而二维数组中元素的值便用来代表这一格元素的类型,例如用0来代表草地,用1来代表石头等等...
这样选择好游戏的基本数据结构之后,我们首先想象我们的游戏已经完成,打开游戏程序后要进行的第一件事便是出现游戏的窗体,也就是说第一件事就是得载入游戏的地图,所以做这个游戏第一步便是在游戏开始之前就要编辑好一个二维数组,这个二维数组就是游戏的地图。
这个数组我们不可能凭空去给他赋值,所以就需要一个图形化界面来让我们方便的去设置数组中的值:
这便是这次的任务,做一个瓷砖地图编辑器,编辑完之后保存一个二维数组到一个文件中,以后写的游戏程序就能直接调用那个保存好的地图文件来载入地图了。
由于是自己写的编辑器,就可以按自己的需求来配置这个地图编辑器的内容了
------------------------------------------------------------------------------------------------------------------------
1.首先写一个Mapconfig的接口,用来设置我们生成的地图的一些基本配置。(用接口来做配置文件是因为其他的类)
public interface MapConfig {
//素材的大小
int eleWidth = 50;
int eleHeight = 50;
//地图的大小
int MapWidth = 2000;
int MapHeight= 2000;
//地图保存的位置
String path = "D:\\mygame\\map\\map1.map";
//用到的图片素材
ImageIcon icon0 = new ImageIcon("000草地.png");
ImageIcon icon100 = new ImageIcon("100红树.png");
ImageIcon icon101 = new ImageIcon("101绿树.png");
ImageIcon icon102 = new ImageIcon("102绿竹.png");
//将所有的图片素材对象放入一个数组中,便于窗体上的下拉列表添加所有的图片素材
ImageIcon[] allicons = {icon0,icon100,icon101,icon102};
2.接下来便是写一个窗口类来实现上面那个地图配置接口,用来作为我们设置地图的窗口。(这里又有了一个问题,一个地图中有一些地形是可以通过的,而有一些地形是不能过的。这里我采用的区别方式是一个地图用三个二维数组表示,这三个数组分别代表【人物脚下的素材】,和【人物同一平面的素材】,以及【人物头上的素材】,这样分层定义地图,规定同一个层面的素材都是互斥不能通过的,就很好的解决了这个问题)
* 图形化设置地图数组
* @author yy
public class SetMap extends JFrame implements MapConfig{
//用来选择素材的下拉表(前面)
JComboBox&ImageIcon&
//用来选择素材层数的下拉表
JComboBox&Integer&
//用来储存建立的地图数组的二维数组
(map1脚下素材
map2地表素材
map3上层素材)
static int[][] map1 = new int[40][40];
static int[][] map2 = new int[40][40];
static int[][] map3 = new int[40][40];
//用来存储对应的图片的二维数组 (这里的icon数组,只是用来将我们设置好的数组在界面上显示出来,不用保存进文件)
static ImageIcon[][] icons1 = new ImageIcon[40][40];
static ImageIcon[][] icons2 = new ImageIcon[40][40];
static ImageIcon[][] icons3 = new ImageIcon[40][40];
//编辑中的地图显示的面板
* 程序入口主函数
* @param args
public static void main(String[] args) {
SetMap sm = new SetMap();
sm.init();
* 设置窗体的方法
public void init(){
this.setTitle("地图数组生成");
this.setSize();
this.setDefaultCloseOperation(3);
this.setLayout(new FlowLayout());
//设置面板类
panel = new MySetPanel();
panel.setPreferredSize(new Dimension(MapWidth, MapHeight));
JScrollPane jsp = new JScrollPane(panel);
jsp.setPreferredSize(new Dimension(600, 600));
jsp.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
//创建选择素材层的下拉列表 (这里选择1表示当前编辑的是第一层的元素,2表示的当前编辑第二层元素,3同前面)
boxtype = new JComboBox&Integer&();
boxtype.addItem(1);
boxtype.addItem(2);
boxtype.addItem(3);
//创建选择素材的下拉列表
box = new JComboBox&ImageIcon&();
//将我们前面配置文件中的所有图片素材放入下拉表的方法
setBox(box);
//创建按钮
JButton create = new JButton("创建");
create.setActionCommand("create");
this.add(jsp);
this.add(boxtype);
this.add(box);
this.add(create);
this.setVisible(true);
//给面板安装鼠标监听器
PanelListenner plis = new PanelListenner();
panel.addMouseListener(plis);
//给按钮安装事件监听器
Buttonlistenner blis = new Buttonlistenner();
create.addActionListener(blis);
//设置地图中的素材下拉表
public void setBox(JComboBox box){
for(int i=0;i&allicons.i++){
box.addItem(allicons[i]);
* 临时地图面板类
* @author yy
class MySetPanel extends JPanel{
public void paint(Graphics g) {
super.paint(g);
for(int i=0;i&MapHeight/eleHi++){
for(int j=0;j&MapWidth/eleWj++){
//画第一层元素
if(icons1[i][j]!=null){
g.drawImage(icons1[i][j].getImage(), getDrawX(j), getDrawY(i), eleWidth, eleHeight, null);
//画第二层元素
if(icons2[i][j]!=null){
g.drawImage(icons2[i][j].getImage(), getDrawX(j), getDrawY(i), eleWidth, eleHeight, null);
//画第三层元素
if(icons3[i][j]!=null){
g.drawImage(icons3[i][j].getImage(), getDrawX(j), getDrawY(i), eleWidth, eleHeight, null);
//将数组下标转化成对应的图片左上角坐标
public int getDrawX(int j){
int x = j*50;
//将数组下标转化成对应的图片左上角坐标
public int getDrawY(int i){
int y = i*50;
* 按键监听类
* @author yy
class Buttonlistenner implements ActionListener{
public void actionPerformed(ActionEvent e) {
//如果按下了创建按钮,就保存当前设置好的3个二维数组
if(e.getActionCommand().equals("create")){
System.out.println("开始保存");
//得到文件输出流
FileOutputStream fos = new FileOutputStream(path);
//将文件输出流包装成基本数据输出流
DataOutputStream dos = new DataOutputStream(fos);
//从配置的接口中得到二维数组的大小(由于本类已经实现了上面的Mapconfig接口,所以可以直接用里面的数据)
int i = MapHeight/eleH
int j = MapWidth/eleW
//先数组的大小写入文件
dos.writeInt(i);
dos.writeInt(j);
//按顺序将三个二维数组写入文件,记住这里的写入方式,后面游戏读取地图的时候也要按这种顺序读回来
for(int ii=0;ii&i;ii++){
for(int jj=0;jj&j;jj++){
dos.writeInt(map1[ii][jj]);
dos.writeInt(map2[ii][jj]);
dos.writeInt(map3[ii][jj]);
//强制流中的数据完全输出完
dos.flush();
//关闭输出流
dos.close();
System.out.println("保存完成");
}catch(Exception ef){
ef.printStackTrace();
* 面板监听类
* @author yy
class PanelListenner extends MouseAdapter{
public void mouseClicked(MouseEvent e) {
//得到该位置对应的数组下标
int j = e.getX()/eleW
int i = e.getY()/eleH
System.out.println(i+"&&"+j);
//得到选择框中的图片
ImageIcon icon = (ImageIcon)box.getSelectedItem();
//得到该图片的编号,此处默认取名字的前三位数字
PS:这里也可以用其它的处理方式,楼主只是想复习一下string
int num = str2int(icon.toString().substring(0, 3));
//修改数组中的值
if((int)boxtype.getSelectedItem()==1){
map1[i][j] =
icons1[i][j] =
}else if((int)boxtype.getSelectedItem()==2){
map2[i][j] =
icons2[i][j] =
}else if((int)boxtype.getSelectedItem()==3){
map3[i][j] =
icons3[i][j] =
System.out.println((int)boxtype.getSelectedItem());
panel.repaint();
* 将一个三位的字符串,转为一个int
* @param numstr
public int str2int(String numstr){
for(int i=0;i&3;i++){
if(numstr.charAt(i)!=0){
numstr = numstr.substring(i);
int num = Integer.parseInt(numstr);
numstr = numstr.substring(2);
int num = Integer.parseInt(numstr);
3.程序启动如下
这样就可以通过控制两个下拉列表选择素材的层,和素材的类型,然后通过鼠标点击面板中来该表相应数组中元素的值了,完了之后点击【创建】按钮来将编辑好的地图存入文件。
这只是一个初步的模版,以后要加入什么NPC或者是什么传送门,还是野怪之类的,就换不同的素材就行了,以后的地图就可以用这个模式来创建了,游戏的第一步地图的生成也算是基本上完成了...
写这么一篇没什么内容的博客比码几个小时的代码都累,o(︶︿︶)o 唉,对程序员来说表达能力是大问题啊
下载次数: 115
用FX吧,感觉比用swing强点儿。。。目前只学了Swing,就顺便拿来当个复习了..
不知道楼主想做个什么样的游戏。就是那种像RPG Maker做出来的那种类型的吧...
浏览: 19945 次
我想问地图有多大?怎么无限行走的,没有终点吗?用第一章的代码我 ...
我的运行不对啊,行走的指令就是按鼠标左键对吧
你好,我想问一下,可以将图像数组保存为文件,然后读取吗?通过Unity2D独立日式RPG游戏需要学习哪些知识?_游戏制作吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:22,121贴子:
通过Unity2D独立日式RPG游戏需要学习哪些知识?
问题很对胃口,我来答一记,水平有限,先说说在Tiled 地图方面的经验(多图流量预警!)。1、一开始是打算做个《英雄无敌3》的独立Unity游戏,最先想到要做的就是Tile地表编辑器,先贴张《英雄无敌3》编辑器的图。要说2D Tiles地图的美术表现,除掉斜45度的《破坏神2》,顶视图的冠军非《英雄无敌3》莫属。另外,刷地表功能的一个要点在于能以各种笔刷(泥地、沙地、海、草地)随意的刷地表,地表跟临接其他类型地表的衔接关系一定是对的,有了这个,不仅是策划或者美术编辑修改方便,而且自动生成关卡才有可能。《英雄无敌3》的NB之处就在于多种Tiles之间的衔接非常自然,注意上图中宝物1右边的红框区域,这个格子里有泥地、草地、沙地三种纹理衔接,这在基于Tiles的2D地图里非常少见。所以呢,我先把《英雄无敌3》的资源解出来,看看怎么才能做得如此NB:所以为啥人家这么NB呢?素材规划强啊,刚才提到的红框区域泥草沙三种纹理混合图就在最后一排的中间(做了水平镜像的操作)。简单的说,沙地和泥地,算是基础地形,其他地形都有跟跟沙地和泥地衔接的图素,所以如果其他地形之间要衔接,就在中间夹沙地或者泥地(注意第一张图中间区域的火山地形和草地衔接之间的泥地过渡)。明白了这个道理,又有了图素,就开始做呗,正式美术资源什么的等编辑器好了再找美术按着这个规则做吧。所以我就开始写代码了。写了几千行代码,弄了个这么个东西:但做到这份上只做到了海面和两种基础地表的混合,接下来就要引入一张图素三种地形的类型了,我心里琢磨了一下算法,突然发现工作量比我想象的大,我似乎对这种Tile衔接的规则总结得不太到位,那么上网找找吧。--------------------------------------------------分割线,谢谢-------------------------------------------------------2、神器出现了:Tiled Map Editor这简直是赤裸裸的打我脸啊,以后做啥事之前能不能先上网搜搜?造轮子再快能快过直接开车吗?Tiled是个开源项目,编辑器框架基于QT,有很多游戏都基于Tiled制作地图,斜45度或者顶视图都可胜任,贴几张图上来给大家看下:我试用了一段时间,这个编辑器最NB的就是对地表类型编辑归纳,并且自动衔接其他类型地表的功能。举例给大家看看:以上面斜45度地形的图素为例,如果美术给你做了所有的衔接图,你导入所有图素,选定某种类型的地表(左边列表中的Sea2),然后在右边图库中标识哪些图片的哪些区域(左上、右上、左下、右下)是该种类型(蓝色高亮区域)。标识完成后,你就可以在主视窗用该笔刷任意涂刷了,程序会自动为你做地表衔接。教学到此为止,那么,题主是要做Unity2d的Tiled地图啊,这个编辑器编辑的成果如何导入Unity项目呢?--------------------------------------------------分割线,谢谢-------------------------------------------------------3、Tiled to UnityUnity Assert Store里搜索“Tiled”,你会很容易找到将Tiled地图导入Unity的插件:第一个是:Tiled Tilemaps 详细的去商店看介绍吧。另一个更神奇一点,名字跟我这节名字一样:Tiled to Unity这玩意儿能把Tiled 2d地图映射到3D元素上,生成Unity3d地图。我想2D转3D应该不是题主的需求吧,但这东西看起来确实吸引人,就是不知道渲染效率如何,不知道有没有做渲染批次合并...而且有点贵......本人没试用过,看起来评论区 钟磊 同学有经验,感兴趣的同志可以移步向他请教。总之呢,基于开源软件的Tiled地图本身地图存储格式也是很清晰的,就算自己写读取地图也不会太难。--------------------------------------------------分割线,谢谢-------------------------------------------------------4、Tiled图素资源题主问到美术素材,一看就是准备单人Solo的节奏,遇到这样的同学我就很高兴,虽然知道十之八九是死路一条吧,但就是喜欢这种“虽万人吾亦往”的调调。单人Solo最麻烦的是素材的版权问题,以下是我觉得可以考虑的素材来源:1) Google + Tileset:国外网站有很多免费开源的美术资源,比如OpenGameArt.org,使用前请仔细区分基于什么开源协议,就是里面要挑出刚好合适有好看的不容易。2)Unity Assert Store:虽然大多是收费,但一般品质相当高,举个例子:3)淘宝,非常惭愧,介绍这玩意儿简直是助涨无视知识产权的邪恶力量。但如果是做前期技术准备,这里真能找到不少合适的资源。--------------------------------------------------分割线,谢谢-------------------------------------------------------5、没想好....其实是有个念头,大家干嘛非得单人Solo呢?要不咱们跟GitHub上弄个开源游戏项目可好?
每个爱抖腿的人心里都有...
随后会放制作过程
不废话,看图! 二楼正...
喝了这一碗,我的心里暖...
本周五4部备受瞩目的电...
冬天怎么化妆好看?这是...
帖序 —————————————————...
NO.1喜欢美食的来,带你吃
几个月前开过这个贴现在...
我不知道,为什么一些演...
从类型电影的角度来看,...
地表最强, 周而复始, ...
转自知乎作者
贴吧热议榜
使用签名档&&
保存至快速回贴

我要回帖

 

随机推荐