2d坦克2d游戏地图设计工具,可以炸地图的

自制Unity小游戏TankHero-2D(4)关卡+小地图图标+碰撞条件分析
我在做这样一个坦克游戏,是仿照()这个游戏制作的。仅为学习Unity之用。图片大部分是自己画的,少数是从网上搜来的。您可以到我的github页面()上得到工程源码。
本篇主要记录关卡解析器、小地图图标和对碰撞的原理的探索,需要耐心分析。
关卡解析器
在一个关卡里,敌方坦克应该是一波一波地出现,每波敌人出现多少个,每个敌人是什么类型的坦克、出现在什么位置都应该是可配置的。这需要一个关卡解析器,把如下的文字解析为一个数据结构&Level&。
tank{0 0} |
tank{0 1} |
tank{0 2} |
tank{0 0} tank{0 1} tank{0 2} |
tank{0 0} tank{0 1} tank{0 2} tank{0 0} tank{0 1} tank{0 2} |
tank{0 0} tank{0 1} tank{0 2} tank{0 0} tank{0 1} tank{0 2} |
tank{0 0} tank{0 1} tank{0 2} tank{0 0} tank{0 1} tank{0 2} tank{0 0} tank{0 1} tank{0 2} |
tank{0 0} tank{0 1} tank{0 2} tank{0 0} tank{0 1} tank{0 2} tank{0 0} tank{0 1} tank{0 2} tank{0 0} tank{0 1} tank{0 2}
这段文字的意思是,第一波敌人是类型编号为0,出生位置编号为0的1个坦克;第二波敌人是类型编号为0,出生位置编号为1的1个坦克;。。。
这种东西我喜欢用编译原理解决,因为我在()有一个自己写的自动生成词法、语法分析器的工具。关于这个工具的介绍可参考我博客里关于编译原理的文章()。
先总结一下关卡的文法
1 &Level& ::= "level" "{" &StepList& "}";
2 &StepList& ::= &Step& &StepList& | null;
3 &Step& ::= "step" "{" &TankList& "}";
4 &TankList& ::= &Tank& &TankList& | null;
5 &Tank& ::= "tank" "{" &TankPrefab& &BornPoint& "}";
6 &TankPrefab& ::=
7 &BornPoint& ::=
然后用工具生成词法语法解析器代码。
剩下的就是自己写一下从语法树到数据结构的转换。代码如下。
public static Level GetValue(this SyntaxTree&EnumTokenTypeLevelCompiler,
EnumVTypeLevelCompiler, TreeNodeValueLevelCompiler& syntaxTree)
if (syntaxTree == null) { return null; }
var result = new Level();
_GetLevel(result, syntaxTree);
private static void _GetLevel(Level result, SyntaxTree&EnumTokenTypeLevelCompiler, EnumVTypeLevelCompiler, TreeNodeValueLevelCompiler& syntaxTree)
if (syntaxTree.CandidateFunc == LL1SyntaxParserLevelCompiler.GetFuncParsecase_Level___tail_levelLeave())
GetTankList(result, syntaxTree.Children[2]);
private static void GetTankList(Level level, SyntaxTree&EnumTokenTypeLevelCompiler, EnumVTypeLevelCompiler, TreeNodeValueLevelCompiler& syntaxTree)
if (syntaxTree.CandidateFunc == LL1SyntaxParserLevelCompiler.GetFuncParsecase_TankList___tail_tankLeave()
|| syntaxTree.CandidateFunc == LL1SyntaxParserLevelCompiler.GetFuncParsecase_TankList___tail_or_Leave())
var egg = GetTank(syntaxTree.Children[0]);
level.Add(egg);
GetTankList(level, syntaxTree.Children[1]);
else if (syntaxTree.CandidateFunc == LL1SyntaxParserLevelCompiler.GetFuncParsecase_TankList___tail_rightBrace_Leave())
//nothing to do
private static TankEgg GetTank(SyntaxTree&EnumTokenTypeLevelCompiler, EnumVTypeLevelCompiler, TreeNodeValueLevelCompiler& syntaxTree)
if (syntaxTree.CandidateFunc == LL1SyntaxParserLevelCompiler.GetFuncParsecase_Tank___tail_tankLeave())
var tankPrefab = GetTankPrefab(syntaxTree.Children[2]);
var bornPoint = GetBornPoint(syntaxTree.Children[3]);
var result = new TankEgg(tankPrefab, bornPoint);
else if (syntaxTree.CandidateFunc == LL1SyntaxParserLevelCompiler.GetFuncParsecase_Tank___tail_or_Leave())
var result = new TankEgg(-1, -1);
return null;
private static int GetBornPoint(SyntaxTree&EnumTokenTypeLevelCompiler, EnumVTypeLevelCompiler, TreeNodeValueLevelCompiler& syntaxTree)
if (syntaxTree.CandidateFunc == LL1SyntaxParserLevelCompiler.GetFuncParsecase_BornPoint___numberLeave())
var result = int.Parse(syntaxTree.Children[0].NodeValue.NodeName);
private static int GetTankPrefab(SyntaxTree&EnumTokenTypeLevelCompiler, EnumVTypeLevelCompiler, TreeNodeValueLevelCompiler& syntaxTree)
if (syntaxTree.CandidateFunc == LL1SyntaxParserLevelCompiler.GetFuncParsecase_TankPrefab___numberLeave())
var result = int.Parse(syntaxTree.Children[0].NodeValue.NodeName);
在VS2013里你可以获得Tip,便于coding。
解析器写好了,调用方式如下。
语法分析器的类型太长,只好用上图表示一下。
这样就有敌方坦克一波一波来袭的感觉了。
小地图图标
小地图上显示的坦克很不清晰,如果能显示出一个鲜艳的三角形就好了,尖头指向开炮的方向。如下图所示,绿色的为玩家坦克,红色的为敌方坦克。
首先给坦克的prefab增加一个显示箭头的子对象。
给子对象smallMapTankHero增加Sprite Renderer组件,在组件的Sprite属性里赋予下面的图片,并把此对象的Layer属性设置为自定义的"smallCamera"(Layer的名字无所谓)。
Hierarchy里的smallCamera对象是用来显示小地图的。设置其Culling Mask属性如下图所示,勾选smallCamera。这样,箭头就会显示在smallCamera里。
相应的,在主摄像机Main Camera里,设置Culling Mask属性如下图所示,取消勾选smallCamera。这样,箭头就不会显示在smallCamera里。
有点平行世界异次元的感觉。
小地图里仍旧会显示原有的坦克贴图,为了挡住坦克贴图,我们把小地图图标向上(靠近摄像机的方向)移动一点点。
当然,也可以通过把坦克对象的Layer设置为一个自定义的Layer(比如自定义为realworld),然后在smallCamera的Culling Mask属性中取消勾选realworld即可。不过这还需要把各种对象都放到自定义的Layer里去,太麻烦了。
Unity中的碰撞,有Collision(物理碰撞)和Trigger(触发器碰撞)两种。
这里我用精心设计的试验分析出了碰撞的产生条件。
触发碰撞的基本条件
下面,假设Hierarchy中有两个对象A和B,A和B都有Collider组件和Rigidbody组件。那么:
如果去掉其中任何一个的Collider,那么不会发生碰撞事件(只会穿透)。
如果去掉B的rigidbody,那么移动B去撞A时,不会发生碰撞事件(只会穿透)。
如果去掉B的rigidbody,那么移动A去撞B时,Collision和Trigger的碰撞都可以发生在A和B身上,但B不会受物理引擎影响而移动。
OnTriggerXXX的触发原则
下面,再假设A是Cube,B是sphere;A有3个Box Collider,设置第2个Box Collider的Is Trigger为true;B有4个Shpere Collider,设置第2、3个Sphere Collider的Is Trigger为true。
然后,给A和B分别添加如下的脚本组件:
1 public class TriggerTest : MonoBehaviour
// Use this for initialization
void Start()
// Update is called once per frame
void Update()
void OnTriggerEnter(Collider other)
Debug.Log(string.Format("{0} trigger {1}'s({2})", this.name, other.name, other.GetInstanceID()));
void OnCollisionEnter(Collision collision)
Debug.Log(string.Format("{0} collision {1}'s({2})", this.name, collision.transform.name, collision.collider.GetInstanceID()));
这样就可以记录自己碰撞了对方的哪个Collider。&
我们先让A撞B,再让B撞A,分别得到如下图左右所示的结果。
分析发现,虽然引发的碰撞事件的先后顺序有所不同,但碰撞事件是相同的,都是那16个Trigger事件和2个Collision事件。
据此我总结出Trigger事件的触发原则,如下图所示。
当A的第2个Collider设置为Is Trigger=true时,此Collider会与B的各个Collider都引发一次Trigger碰撞事件。B也同理。不过两边均为Is Trigger=true时,只会引发一次。数一下上图,可以看到有8条线,每条线在AB两方各引发一次Trigger碰撞事件,所以就是上文的16次。另外,每个Collider引发的次数也与上文的图示吻合。
OnCollisionXXX的触发条件
下面,我把A和B的所有Collider的Is Trigger都设为false,来研究Collision的触发条件。
下图展示了去掉B的Rigidbody后,分别用A撞B和用B撞A的情况。
可以看到,没有Rigidbody的B撞A,什么都不会发生,B直接穿透了A。
再用含有2个Collider的Cube和含有2个Collider的Sphere试验(此处略)就可以知道,A撞B则会使A的第1个Collider依次与B的各个Collider引发Collision碰撞事件。所以上图左侧会有1个A的Collider与4个B的Collider引发的Collision事件。
继续看下图,是同时具有Rigidbody的A和B相互碰撞的结果。
可以看到A和B都只有1次Collision事件。
根据上述试验,我认为Unity3D引擎在处理Collision事件时,是去找AB双方的Rigidbody,如果找到了就让它执行物理引擎;如果都找到了,此次碰撞就告结束,不再引发此次A和B的Collision事件。
我查了Unity一些资料,总结了一下Unity中关于碰撞的原则:
physics will not be applied to objects that do not have Rigidbodies attached.Kinematic Rigidbody 自身不受外力,但仍旧可对其它物体产生力。
您可以到我的github页面()上得到工程源码。
请多多指教~
阅读(...) 评论()U9论坛欢迎您,有任何疑问均可以发帖咨询!
看一看U9会员都在讨论什么~
欢迎关注游久网电竞专区。
查看: 3657|回复: 6
恶魔喵喵~呀咩爹~~~琳欣的猫咪
节操147 绿叶0 注册时间在线时间90 小时阅读权限20精华2主题听众数最后登录KPI值0
正式会员[中], 积分 1485, 距离下一级还需 15 积分
UID1157178帖子U9币1180 魅力618 声誉5 U菜花66
本帖最后由 Hunter恶魔 于
23:21 编辑
有什么BUG尽管说出来........
节操78 绿叶0 注册时间在线时间919 小时阅读权限30精华0主题听众数最后登录KPI值0
常驻会员[高], 积分 3270, 距离下一级还需 230 积分
UID1189117帖子U9币4860 魅力354 声誉5 U菜花4
美国大兵死后也 掉装备!!
节操2 绿叶0 注册时间在线时间63 小时阅读权限15精华0主题听众数最后登录KPI值0
正式会员[初], 积分 847, 距离下一级还需 153 积分
UID1119433帖子U9币8 魅力35 声誉5 U菜花0
我玩了一下幻影坦克,就玩了一下,因为我也正在做这种地图,我想知道你是怎么做的。
坦克阵亡后没有剩余复活时间提示,不好。
坦克之间又没有相生相克之处,最好给与一定的提示。
幻影坦克的变树,我有一个比你的稍好的表达方式,我可以传给你。幻影坦克的变小动物——有一个恢复的顺序,应当给出(即残留的小动物依次从哪一个动物身上复活,有心的人就会追着那个动物打,所以需要加强那个动物)
就试了一下,希望能共享交流一下
(166 KB, 下载次数: 13)
20:10 上传
点击文件名下载附件
我做的一些东西,你可以稍稍看下,当然一堆BUG是了,是不能玩的,只能看看
[ 本帖最后由 mailier 于
15:10 编辑 ]
模仿血翼·残月而已
恶魔喵喵~呀咩爹~~~琳欣的猫咪
节操147 绿叶0 注册时间在线时间90 小时阅读权限20精华2主题听众数最后登录KPI值0
正式会员[中], 积分 1485, 距离下一级还需 15 积分
UID1157178帖子U9币1180 魅力618 声誉5 U菜花66
原帖由 q 于
02:26 发表
美国大兵死后也 掉装备!!
这个在2.2版本中已经修改了
恶魔喵喵~呀咩爹~~~琳欣的猫咪
节操147 绿叶0 注册时间在线时间90 小时阅读权限20精华2主题听众数最后登录KPI值0
正式会员[中], 积分 1485, 距离下一级还需 15 积分
UID1157178帖子U9币1180 魅力618 声誉5 U菜花66
原帖由 mailier 于
14:50 发表
我玩了一下幻影坦克,就玩了一下,因为我也正在做这种地图,我想知道你是怎么做的。
坦克阵亡后没有剩余复活时间提示,不好。
坦克之间又没有相生相克之处,最好给与一定的提示。
幻影坦克的变树,我有一个比 ...
时间只有10秒 因为死的坦克有时候很多 所以提示时间的计时框会很多
动物 应该是&&那只鹰&&一般是.......
╇`邪魔ご遗忘
节操40 绿叶0 注册时间在线时间262 小时阅读权限30精华2主题听众数最后登录KPI值0
常驻会员[初], 积分 2012, 距离下一级还需 488 积分
UID4073226帖子U9币3416 魅力748 声誉5 U菜花136
生存图不用说,我支持啊
谢谢支持~~~~~
总评分:&U9币 + 5&
恶魔喵喵~呀咩爹~~~琳欣的猫咪
节操147 绿叶0 注册时间在线时间90 小时阅读权限20精华2主题听众数最后登录KPI值0
正式会员[中], 积分 1485, 距离下一级还需 15 积分
UID1157178帖子U9币1180 魅力618 声誉5 U菜花66
lianhao166
& & 谢谢支持
Powered by跪求一款很久的坦克游戏,是在文字形状的地图中作战。_坦克游戏吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:35贴子:
跪求一款很久的坦克游戏,是在文字形状的地图中作战。
本人在十几年前玩过的一款坦克游戏。该游戏己方是黄色的坦克没有老家,就是消灭所有的敌人,游戏的地图是在文字形状的地图内打。打开游戏时的画面是英文单词TANK,有四辆坦克在这四个字母内移动,第一关是个田字,第二关是个繁体的龍字,游戏播放的音乐有碟中谍的著名配乐等等。道具有穿甲弹(可不损坏墙壁而攻击敌人),破甲弹(打破墙壁),增加射速,定时炸弹等等都是过关奖励或打掉某些坦克掉下,每一关生命值都是固定的。敌人的坦克按生命值排列是红色,蓝色,浅蓝,绿色。而且只会在看到并且面向玩家的坦克时开炮,可以和敌人坦克对射以打掉炮弹。如果有哪位大哥曾近玩过或见过恳请各位告诉我更详细的游戏出处和名字以及下载地址。感激不敬。
贴吧热议榜
使用签名档&&
保存至快速回贴战地1亚眠地图猥琐玩法攻略_亚眠地图猥琐埋雷炸坦克方法
作者:佚名
字体:[ ] 来源:互联网 时间:10-31 18:27:57
下面小编就为大家带来一篇战地1亚眠地图猥琐玩法攻略_亚眠地图猥琐埋雷炸坦克方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
战地1亚眠地图猥琐怎么玩,今天小编就为大家带来战地1亚眠地图猥琐埋雷炸坦克方法,让我们来一起看看吧!
发现了亚眠一个特好玩的玩法,跑到敌人刷坦克的复活点,然后在必经之路上放3个地雷,然后坐等对面坦克重生,如图:
然后坐等对面坦克复活:
因为爹1的载具都是一刷出来30多个人抢得,所以你炸了也没人来报仇,很爽的...
一局炸了6辆坦克,对面坦克出不了窝,哈哈!
这要是以后的私服,估计要被T。
以上就是小编为大家带来的战地1亚眠地图猥琐玩法攻略_亚眠地图猥琐埋雷炸坦克方法的全部内容了,希望大家喜欢哦~
如果大家想了解更多游戏活动与游戏攻略,请持续关注本站,本站小编将在第一时间为大家带来最好看、最好玩、最新鲜的游戏资讯。更多精彩内容,尽在jb51游戏频道!
大家感兴趣的内容
12345678910
最近更新的内容地图场景 :
文件大小(M)
分辨率(宽)(px)
鄂ICP备号-12
本站素材均来自于网友分享,仅用于学习交流使用,版权归原作者/公司所有
提问和建议贴吧:
侵权举报投诉建议-站长邮箱:

我要回帖

更多关于 2d游戏地图设计工具 的文章

 

随机推荐