一种类似飞机头的发型于不要撞上的游戏,飞机(好像)点击就会撞上有颜色附在屏幕

59094被浏览7097422分享邀请回答
/v_show/id_XNzE1OTkzNjYw.html
6. 疯狂填字系列填字游戏,跟朋友家人一起玩感觉很好!而且关卡多,绝对耐玩。7.小东西长久远找物游戏,画面很可爱,就是有点伤眼睛。8.Numerity也是找物,在一群数字中找出特定的数字,最后会组成一幅画,挺有创意的。推荐几款适合短时间,比如上厕所或者坐地铁的时候适合玩的小游戏吧~9.Threes!想必大家挺熟悉的,游戏就是通过滑动屏幕上的数字来组合成3以及其3的倍数,得到的数字越大分数越高,要拿高分还是有一定规律的,截一个我自己的最高分。10.2048和threes一样,不过改成了2的倍数,难度也降低了,只要将最大的数字放在一个角落就行了。11. 1010!俄罗斯方块式的消除游戏,简单但是会上瘾。。。。12. Poptile点击相同颜色色块的消除游戏,画面简单但是很舒服,也是会上瘾的。13.Infinite Loop ∞再环点击游戏里的半圆全部连起来,类似于连水管的那种游戏,画面很简约,非常消磨时间,已经玩到了快400关,不知道一共有多少关。。。4.4K181 条评论分享收藏感谢收起
/page/f/o/q/f0013kfnvoq.html?start=51
我想说,看完这个视频你应该跃跃欲试了吧,好吧,那就快去玩吧,我不废话了。29.胶囊太空站(Rymdkapsel)好难的游戏!首先从画面上说,这款游戏真的做到了极简的程度。无关卡,无层级,整个画面一目了然,如同俄罗斯方块拖拽般的构建太空站的各个功能区,却真的没有想象那么简单。主动限制绝对会让你绞尽脑汁。30.单词解谜(Spelltower)好吧,这个是ios app store里暂时遇见的最好的拼词游戏。其他的不解释。31.爱犬大营救这是一款让你感觉像是在看一场真实动画电影的游戏,充满街机动作的温情冒险,这是一个小男孩儿与小狗的童话。好吧,那我也没必要说什么了。美工音效真的都很出色,只是还有个Bug没弄好,现在如何我不知道,还是觉得可以一玩。32.缤纷彩带(Strata)玩家使用多种颜色、多种丝带覆盖对应的小方块,最后编织出色彩艳丽的“网格”。一款简洁、精美、极富挑战性的益智游戏,带给您真正独一无二的动脑体验。33.纪念碑谷这是我所有女性死党超过八成评论说最符合她们少女情怀的游戏.....(?Д`)其他答案里应该也有推荐了,但为了她们的少女情怀...我还是写一下吧......34.纸境(Tengami)一款日系风大赞的解谜冒险类游戏,《Tengami纸境》正如它的名字一般,其最大的特色,就是将整个游戏做成了一本立体弹起式纸装书,里面的风景、建筑、人物、动物均是用纸的各种形态来形成,结合了剪纸、立体折纸以及纸雕等传统的工艺艺术,与其说是游戏,这更像是一件艺术品。35.多克罗(Dokuro)从电脑上移植过来的就不说了,谁都有电脑,但!PSV不是谁都有的,这款游戏也是其中一个佳作。游戏的整体素质相当不错,玩法简单但难度却不小,画面灰暗却又十分可爱有趣。36.战斗之心:传承(Battleheart Legacy)这款ARPG游戏绝13让我菊花一紧,游戏将以战斗开始,《传承》是一款庞大的,非线性的RPG游戏,更多的剧情和探索取代了以往的单调升级。游戏的操控也有所改变,因为本作中,战场将以华丽的3D形式展现,战斗也将会变得更为智能。另外一个变化是,在本作中,玩家将只能控制一个英雄,然而,“可制定的主角”可搭配游戏中的任何技能,每个玩家都可玩出自己的特色。37.海之号角(Oceanhorn)说道BattleHeart,就突然想起这款神作。好吧,其实我是冲着植松伸夫去的。游戏人物好好好萌啊!有木有! 38.暴力街区来一款爷们儿点的游戏,大四上的时候这游戏和同寝室的玩了N久,游戏的画面比较令人满意,战斗过程中的动画也做得很到位,虽然没有勇者之心的画面看起来那么有动感,但跟同类其他游戏相比已算是出色。操作方面没什么特别的,和勇者之心完全一样,只不过在技能系统上更加丰富,能组合出来的招数也更多。39.方块迷阵(Cuboid: 3D Puzzle)有朋友在前面答案里面推荐了类似滚方块儿入洞的游戏,既然推荐就推荐最棒的,就是这款。规则相同自然要用画面取胜。40.极速方块(dEXTRIS)一款街机风格的避让类游戏,控制绿红小方块不停地闯过障碍。玩家需要控制一绿一红两个小方块,以顺利地穿过前方各式的刺状障碍物为目标,尽可能久地保持下去。通道中的障碍物主要有两种布局方式,左右两边是突出的长刺状物,中间也会有菱形物体出现。遇到第一种情况,两个小方块是可以同时穿过去的,但后者就更加考验玩家的快速反应能力了,要快速地将两个方块都穿过去才行。41.节奏过山车Zero(Groove Coaster Zero)相比前作追加了歌曲包,我怎么之前没想到这个在我手机里足足停了半年的游戏!这款音乐游戏同样是心意之作!42.【多人5】指尖功夫(Bam fu)又从朋友pad上找到一款优秀的多人游戏。就是比手速看谁能把石头半数点成自己的颜色。43.爆破青蛙卡罗(Kero Blaster)又一个像素向游戏!千万别小看他!真的是佳作!!!别被这简陋的画面所迷惑!!44.拯救基瓦努卡(Kiwanuka)一款简单有趣的益智解谜游戏,玩家需要通过操作魔杖搭建桥梁拯救基瓦努卡人,虽然可以随意设置桥梁的长度和方向,但寻找最佳路径仍然是游戏的最终目标。这款游戏性堪比《纪念碑谷》的休闲解谜游戏一定能带给你不一样的惊喜.45.植物精灵(Botanicula)和机械迷城相同的厂商。却与《机械迷城》的工业元素不同,这款游戏有着色彩华丽的治愈系风格,同时该作也被称作环保题材游戏,描述有害的生物威胁森林的生态,5位精灵战士前来保护森林,守护植物种子。被有害生物污染的植物会以黑白来表现,非常细腻的艺术风格。46.孤独的托马斯(Thomas Was Alone)游戏以一个抑郁的背景展开,单调的色彩和灰色的阴影都体现了“孤独”这一主题。但事实上,游戏想要表达的是对于友情、爱情这类情感的歌颂。在游戏中玩家也能体会到相互依赖、互利共生这样的生活元素,让人对生活有更加积极的向往和追寻。游戏的玩法非常简单,两个方向键控制前后移动,加上一个跳跃键,初期关卡玩家全靠这三个按键完成。而随着关卡的递增,孤独的小方块终于遇见了新的伙伴,玩家可以通过屏幕两边的图标进行小伙伴间的切换。而游戏的益智性到此才算真正展开,从这里开始便不再是单纯的跳跃游戏。我是有多喜欢阴郁系的游戏(?Д`)........47.完美路径(Perfect Paths)达芬奇说过一句名言“Simplicity is the ultimate sophistication.”(至繁归于至简)也就是说简约才是复杂设计的最终目标,用这句话来形容Perfect Paths《完美路径》这个解谜游戏最恰当不过了。游戏的目的其实非常简单,在网格里,玩家需要绘制一条路径,引领小方块们找到自己对应的颜色。但是《完美路径》中的“完美”二字并不是摆设,也许有很多条路径都可以达成目标,但是要找到那条最佳路径还是有点难度的,同时也是充满挑战的。这是我最近上手且爱不释手的游戏,推荐给你。48.和谐2(Har mo ny 2)有一个让我觉得脑袋不够用的......真的是小清新,移动彩色方块使对应方块变成和谐色条,好吧,第三关已经就要死了。49.Folt一款有趣的小游戏,通过随机出现的方块指定步数路线,并消除自己所摆下方块的游戏。好吧,这游戏基本没啥人下,也推荐一下吧。50.蒙特祖玛的宝藏3(The Treasures Of Montezuma 3)这款游戏没人说是不是有点奇怪,难道这不是大多数女生爱玩的游戏吗?????????51.David52.冒险公司传奇(Tales of the Adventure Company)53.王国之路(Bardadum: The Kingdom Roads)54.地牢迂回战(Devious Dungeon)55.Quadblast56.Reckless Run57.Democracy 358.100m stunt59.梦幻之谜佐贺(Fantasy Puzzle Saga)60.Siralim61.Mad Bullets62.Swords & Poker Adventures63.Buzz Killem64.Z Hunter65.Bio Inc. - Biomedical simulator66.Red Ball 467.Zombie Commando68.Guardians of the Galaxy: The Universal Weapon69.Bladelords - fighting revolution70.Battle Fleet 2: WW2 in the Pacific71.Marble Drop72.Hellraid: The Escape73.Super Scrapped Robot74.Secret Files Tunguska75.daWindci Deluxe76.PlunderNauts77.Monsters Ate My Birthday Cake78.VVVVVV79.World of Tanks Blitz80.Desert Fox81.The Wolf Among Us82.Castle Doombad: Free to Slay83.TwoDots84.剑无生(苹果商店价格1元钱)这款游戏是苹果一元大抢购时候,我看图标随便买的8款游戏之一。玩了一会儿爱不释手,以至于两天废寝忘食到通关。作为中国独立游戏厂商——禹石游戏的开山大作,如此表现实在让我感动。以至于我希望推荐给各位,并恳请哪怕你是越狱党,也劳烦您就花一元钱表示支持。这款游戏未必能让你和我一样有感动,但一定不会让你失望。P.S.:这款游戏其实有一些人物选择与技能选择的连击小伎俩,如果有兴趣以后再议。85.世界2 魔物狩猎(苹果商店价格1元钱)动作手游《世界2 Online》的单机版本。在我看来,如今一个好游戏的不缺德表现就是本应该做成单机的游戏不仅弄成Online版本敛财,而所谓商业良心则是做了一个单机的精品游戏还没有内购!这边是我为何要推荐这款游戏的原因。当然,说它不缺德和有良心的前提是,这游戏本身足够出色。《世界2:魔物狩猎》游戏采用Unity引擎打造,画面均采用3D效果呈现,同时也模拟了几近真实的物理碰撞效果,怪物或玩家都可以破坏关卡中的物件,战斗场景和效果相当之酷炫。而游戏的操作则延续了ARPG的虚拟按键的传统,通过摇杆式的控制和技能释放来进行对战。86.魔塔(这貌似不是一个特别新的游戏,只是我今天才找到。)小时候玩的魔塔是童年之一,只是在苹果商店下载到的很多名字里带有“魔塔”的游戏都是老游戏的照搬照抄。这款由CatCap开发的游戏却是个同类游戏的重新精心设计,所以依然值得无聊打发时间。87.Hero Emblems首先,确实,这是一个三消游戏。很多人特别不喜欢,但问题是这款三消有些特别,在单机里的确比别的有趣,并且无内购。有媒体将其评为“三消游戏的救世之作”,体会下。我是玩了这个游戏才决定推荐给你们并且再一次表决心要重新更新这个答案的。(囧)我喜欢将三消游戏分为三类:换邻三消、连线三消和长移三消。这款属于换邻三消(相邻两块互换达到三消),之后推荐的三消游戏会用这三个种类子分类。88.Gemini Strike曾经被腾讯的雷霆战机每天的宝箱搞死,于是退出以回复真人体力,一直到现在我试过了近乎所有的类似雷电的手机飞行类游戏,但这款确实是最棒的。目前为止。有宝箱、有大招、有大量差别装备、有画面。89.卡牌萌兽横版跑酷+卡牌,这个的确是只得在Itunes商店首页推荐的。喜欢卡牌类游戏,玩了那么多,这款真的不算坑钱,只是对于我等无耐心的穷人而言,实在是要把人逼死。但这不影响这游戏的优秀。90.Tap Titans我特别懒,证明就是我懒得玩一个游戏自己有太多参与感,还TM想玩,于是就迷上了挂机类游戏,ios商店上的所有挂机类游戏,手游或是单机都下了玩了。这款真的是上乘之作,国内也有山寨货。挂机类游戏的意思就是:你什么都不用管,他自己打,然后如果你想刷存在感,就重复点击屏幕增加攻击次数,并且在适当的时候用攻击怪兽获得的金币升级攻击力技能和佣兵(听上去好傻......)所以如果你玩了觉得无聊别怪我,不是我的错,是挂机类游戏的错......%&_&%P.S.:上图是我自己的游戏截图,这么一看,我竟然无聊的坚持到了100多关,囧。91.万智牌2015我IPAD上现在有6个游戏,这个游戏算是唯一一个大游戏(对我而言300MB以上的都挺大的了(?Д`)),卡牌对战类游戏接触比较多的只有三个:万智牌、游戏王和炉石传说。说实话三个游戏的规则对比和卡牌设置来看,我最不喜欢的是炉石传说,因为游戏自由度是相对最低的。万智牌的规则稍微复杂,所以对于新手而言入门门槛稍高,但这也证明了规则制定的细化与不粗糙。其实真正上手之后,游戏起来还是更多乐趣的。所以如果你是和我一样的RP极低非RMB者,在炉石的世界每天卡包都几乎蓝天白云并且被吊打严重,建议你重新接纳一款游戏,会给你惊喜。唯一的缺点是,这款游戏在非正是游戏过程运行上稍微有一点慢(菜单进入等),所以稍微有些耐心。毕竟是300MB以上的大游戏o(╯□╰)o-------------------------------------待续---------------------------------------4.9K208 条评论分享收藏感谢收起用指头划屏幕可以调动飞机的游戏叫什么? 就是有三种飞机的_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
用指头划屏幕可以调动飞机的游戏叫什么? 就是有三种飞机的
我有更好的答案
雷霆战机,好玩,我就在玩,不懂可以问我
采纳率:28%
雷霆战机,在微信里下载
为您推荐:
其他类似问题
飞机的相关知识
换一换
回答问题,赢新手礼包苹果软件上有一个点击屏幕用小钢球撞击各种积木建筑物之类的东西以不断前进的要是撞到就会死的游戏叫啥啊_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
苹果软件上有一个点击屏幕用小钢球撞击各种积木建筑物之类的东西以不断前进的要是撞到就会死的游戏叫啥啊
苹果软件上有一个点击屏幕用小钢球撞击各种积木建筑物之类的东西以不断前进的要是撞到就会死的游戏叫啥啊。谢谢了告诉我。
我有更好的答案
不知道,不过你描述的跟smash hit很像
简直非常感谢啊
采纳率:19%
弹珠游戏 弹珠游戏 弹珠游戏
无敌弹珠。很好玩。
请球入洞吧!那应该是电脑游戏吧
用途uurrrrrrrrrrr
其他2条回答
为您推荐:
其他类似问题
积木的相关知识
换一换
回答问题,赢新手礼包&nbsp&#8250&nbsp&nbsp&#8250&nbsp
一个简单的飞机游戏
1&&&&&&概述& & & & 前些天看了《Android游戏编程之从零开始》一书中一个简单飞机游戏的实现代码,一时手痒,也写了一个练练手。虽然我的本职工作并不是写游戏,不过程序员或多或少都有编写游戏的情结,那就写吧,Just for fun!游戏的代码部分我基本上全部重写了,至于游戏的图片资源嘛,我老实不客气地全拿来复用了一下,呵呵,希望李华明先生不要见怪啊。&& & & & 在Android平台上,SurfaceView就足以应付所有简单游戏了。当然我说的是简单游戏,如果要写复杂游戏,恐怕还得使用各种游戏引擎,不过游戏引擎不是本文关心的重点,对于我写的简单游戏来说,用SurfaceView就可以了。&& & & & 飞机游戏的一个小特点是,画面总是在变动的,这当然是句废话,不过却能引出一个关键的设计核心,那就是“帧流”。帧流的最典型例子大概就是电影啦,我们知道,只要胶片按每秒钟24帧(或者更高)的速率播放,人眼就会误以为看到了连续的运动画面。飞机游戏中的运动画面大体也是这样呈现的,因此游戏设计者必须设计出一条平滑的帧流,并且帧率要足够快。&& & & & 从技术上说,我们可以在一个线程中,构造一个不断绘制“帧”的while循环,并在每次画好帧后,调用Thread.sleep()睡眠合适的时间,这样就可以实现一个相对平滑的帧流了。&& & & & 另一方面,游戏的逻辑也是可以融入到帧流里的,也就是说,每次画好帧后,我们可以调用一个类似execLogic()的函数来执行游戏逻辑,从而(间接)产生新的帧。而游戏逻辑又可以划分成多个子逻辑,比如关卡背景逻辑、敌人行为逻辑、玩家飞机逻辑、子弹行为逻辑、碰撞逻辑等等,这个我们后文再细说。&& & & & 大概说起来就是这么多了,现在我们逐个来看游戏设计中的细节。&2&&&&&&平滑的帧流& & & & 我们先写个全屏显示的Activity:public&class&HLPlaneGameActivity&extends&Activity
&&&&@Override
&&&&public&void&onCreate(Bundle&savedInstanceState)
&&&&&&&&super.onCreate(savedInstanceState);
&&&&&&&&this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&WindowManager.LayoutParams.FLAG_FULLSCREEN);
&&&&&&&&requestWindowFeature(Window.FEATURE_NO_TITLE);
&&&&&&&&setContentView(new&PlaneGameView(this));
}这个Activity的主视图是PlaneGameView类,它继承于SurfaceView。public&class&PlaneGameView&extends&SurfaceView&implements&Callback,&Runnable&&&&&&&&&&一旦surface创建成功,我们就启动一个线程,这个线程负责运作帧流。@Override
public&void&surfaceCreated(SurfaceHolder&holder)
&&&&GlobalInfo.screenW&=&getWidth();
&&&&GlobalInfo.screenH&=&getHeight();
&&&&mSurfaceWorking&=&
&&&&mGameManager&=&new&GameManager(getContext());
&&&&mGameThread&=&new&Thread(this);
&&&&mGameThread.start();
}&&&&&&&& mGameThread线程的核心run()函数的代码如下:@Override
public&void&run()
&&&&while&(mSurfaceWorking)
&&&&&&&&long&start&=&System.currentTimeMillis();
&&&&&&&&drawFrame();&&&&//&画帧!
&&&&&&&&execLogic();&&&&//&执行所有游戏逻辑!
&&&&&&&&long&end&=&System.currentTimeMillis();
&&&&&&&&try
&&&&&&&&&&&&if&(end&-&start&&&50)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&Thread.sleep(50&-&(end&-&start));&&&&//&睡眠合适的时间!
&&&&&&&&&&&&}
&&&&&&&&catch&(InterruptedException&e)
&&&&&&&&&&&&e.printStackTrace();
}画帧、游戏逻辑、合适的sleep,一气呵成。为了便于计算,此处我采用了每秒20帧的帧率,所以每帧平均50毫秒,而且因为画帧和执行游戏逻辑都是需要消耗时间的,所以合适的sleep()动作应该写成:Thread.sleep(50 - (end - start))。&3&&&&&&GameManager3.1&&整合游戏中所有元素& & & & 为了便于管理,我设计了一个GameManager管理类。这个类到底是干什么的呢?简单地说,它整合了游戏中的所有元素,目前有:绘制关卡背景;所有敌人;爆炸特效;所有子弹、炮弹;玩家(player)飞机;游戏信息面板;当然,以后还可以再扩展一些东西,它们的机理是接近的。&& & & & GameManager的代码截选如下:public&class&GameManager
&&&&private&Context&mContext&=&
&&&&private&GameStage&&&&&&&mCurStage&&&=&
&&&&private&Player&&&&&&&&&&mPlayer&&&&&=&
&&&&private&EnemyManager&&&&mEnemyMgr&&&=&
&&&&private&BulletsManager&&mPlayerBulletsMgr&=&new&BulletsManager();
&&&&private&BulletsManager&&mEnemyBulletsMgr&&=&new&BulletsManager();
&&&&private&ExplodeManager&mExplodeMgr&&&&&&&&=&
&&&&private&GameInfoPanel&&&mGameInfoPanel&&&&&=&&& & & & GameManager的总模块关系示意图如下:&既然在“帧流”线程里最重要的动作是drawFrame()和execLogic(),那么GameManager类也必须提供这两个成员函数,这样帧流线程只需直接调用GameManager的同名函数即可。&3.2&&GameManager的画帧动作& & & & 帧流线程的drawFrame()函数,其代码如下:public&void&drawFrame()
&&&&Canvas&canvas&=&
&&&&&&&&canvas&=&mSfcHolder.lockCanvas();
&&&&&&&&if&(canvas&==&null)
&&&&&&&&&&&&
&&&&&&&&mGameManager.drawFrame(canvas);
&&&&catch&(Exception&e)
&&&&&&&&//&TODO:&handle&exception
&&&&finally
&&&&&&&&if&(canvas&!=&null)
&&&&&&&&&&&&mSfcHolder.unlockCanvasAndPost(canvas);
}其中GameManager的drawFrame()函数如下:public&void&drawFrame(Canvas&canvas)
&&&&mCurStage.drawFrame(canvas);
&&&&mEnemyMgr.drawFrame(canvas);
&&&&mExplodeMgr.drawFrame(canvas);
&&&&mPlayerBulletsMgr.drawFrame(canvas);
&&&&mEnemyBulletsMgr.drawFrame(canvas);
&&&&mPlayer.drawFrame(canvas);
&&&&mGameInfoPanel.drawFrame(canvas);
}无非是调用所有游戏角色的drawFrame()而已。&&&&&&&&&&每个游戏角色有自己的存活期,在其存活期中,可以通过drawFrame()向canvas中的合适位置绘制相应的图片。示意图如下:在上面的示意图中,两个enemy的生存期都只有5帧,当帧流绘制到上图的紫色帧时,会先绘制enemy_1的第1帧,而后绘制enemy_2的第5帧,最后绘制player的当前帧。(当然,这里我们只是简单阐述原理,大家如有兴趣,可以再在这张图上添加其他的游戏元素。)绘制完毕后的最终效果,就是屏幕展示给用户的最终画面。&&&&&&&&&&每个游戏角色都非常清楚自己当前应该如何绘制,而且它通过执行自己的子逻辑,决定出下一帧该如何绘制,这就是游戏中最重要的画帧流程。&3.3&&GameManager管理所有的子逻辑& & & & 其实,游戏的整体运作是由两个方面带动的,一个是“软件内部控制”,主要控制所有“非player角色”的移动和动作,比如每个enemy下一步移动到哪里,如何发射子弹等等;另一个是“用户操作”,主要控制“player角色”的移动和动作(这部分我们放在后文再说)。在前文所说的帧流线程里,是通过调用GameManager的execLogic()来完成所有“软件内部控制”的,其代码如下:public&void&execLogic()
&&&&mCurStage.execLogic();
&&&&mEnemyMgr.execLogic();
&&&&mPlayer.execLogic();
&&&&mPlayerBulletsMgr.execLogic();
&&&&mEnemyBulletsMgr.execLogic();
&&&&mExplodeMgr.execLogic();
&&&&mGameInfoPanel.execLogic();
&&&&execCollsionLogic();&&&&&&&//&碰撞逻辑
}&&&&&&&&&从上面代码就可以看出,GameManager所管理的子逻辑大概有以下几个:关卡运作子逻辑所有敌人的运作子逻辑玩家角色的子逻辑玩家发射的子弹的子逻辑敌人发射的子弹的子逻辑管理爆炸效果的子逻辑游戏信息面板的子逻辑碰撞子逻辑&4&&&&&&游戏子逻辑4.1&&关卡运作子逻辑――GameStage& & & & 我们先看前面execLogic()函数里的第一句:mCurState.execLogic(),这个mCurState是GameStage类型的,这个类主要维护当前关卡的相关数据。目前这个类非常简单,只维护了关卡背景图以及本关enemy的出现顺序表。&4.1.1&&&关卡背景图由StageBg类处理一般来说,飞机游戏的背景是不断滚动的。为了实现滚动效果,我们可以绘制一张比屏幕长度更长的图片,并首尾相接地循环绘制它。&&&&&&&&&&&在StageBg里,mBackGroundBmp1和mBackGroundBmp2这两个域其实指向的是同一个位图对象,之所以写成两个域,是为了代码更易于阅读。另外,mBgScrollSpeed用于表示背景滚动的速度,我们可以通过修改它,来体现飞行的速度。&4.1.2&&&关卡中的敌人的出场安排GameStage的另一个重要职责是向游戏的主控制器(GameManager)提供一张表示敌人出场顺序的表,为此它提供了getEnemyMap()函数:public&int[][]&getEnemyMap()
&&&&//&ENEMY_TYPE_NONE&&&&&&=&0;
&&&&//&ENEMY_TYPE_DUCK&&&&&&=&1;
&&&&//&ENEMY_TYPE_FLY&&&&&&&=&2;
&&&&//&ENEMY_TYPE_PIG&&&&&&&=&3;
&&&&int[][]&map&=&new&int[][]&{
&&&&&&&&&&&&{0,&0,&0,&0,&1,&0,&0,&0,&0},
&&&&&&&&&&&&{0,&0,&0,&1,&1,&1,&0,&0,&0},
&&&&&&&&&&&&{0,&0,&0,&1,&0,&1,&0,&0,&0},
&&&&&&&&&&&&{0,&0,&0,&0,&0,&0,&0,&0,&0},
&&&&&&&&&&&&{0,&2,&1,&0,&0,&0,&1,&2,&0},
&&&&&&&&&&&&{0,&2,&2,&1,&0,&1,&2,&2,&0},
&&&&&&&&&&&&{0,&0,&0,&0,&0,&0,&0,&0,&0},
&&&&&&&&&&&&{0,&0,&0,&0,&0,&0,&0,&1,&1},
&&&&&&&&&&&&{0,&0,&0,&0,&0,&0,&1,&1,&1},
&&&&&&&&&&&&{0,&2,&2,&0,&0,&0,&2,&2,&0},
&&&&&&&&&&&&{0,&2,&2,&0,&0,&0,&2,&2,&0},
&&&&&&&&&&&&{0,&0,&0,&0,&0,&0,&0,&0,&0},
&&&&&&&&&&&&{0,&0,&0,&0,&0,&0,&0,&0,&0},
&&&&&&&&&&&&{0,&0,&0,&0,&3,&0,&0,&0,&0},
&&&&&&&&&&&&};
&&&&return&
}该函数返回的二维数组,表达的就是敌人的出场顺序和出场位置。我们目前是这样安排的,将屏幕均分为9列,每一列的特定位置对应二维数组中的一个整数,当数值为0时,表示此处没有敌人;当数值为1到3之间的整数时,分别代表此处将出现哪种敌人。现在我们只有3种敌人:DUCK,FLY,PIG。&&& & & & & 这一关卡只有一个BOSS,其类型为3型,对应上面的PIG。我们可以看到,它只会在上面出场表的最后一行出现一次。&4.2&&EnemyManager关卡里的所有敌人最好能统一管理,所以我编写了EnemyManager类。EnemyManager的定义截选如下:public&class&EnemyManager&implements&IGameElement
&&&&private&ArrayList&Enemy&&mEnemyList&=&new&ArrayList&Enemy&();
&&&&private&int[][]&mEnemyMap&=&
&&&&private&int&mCurLine&=&0;
&&&&private&int&mEnemyCounter&=&0;
&&&&private&Context&mContext&=&
&&&&private&EnemyFactory&&&mEnemyFactory&=&
&&&&private&BulletsManager&mBulletsMgr&&&=&
&&&&private&ExplodeManager&mExplodeMgr&&&=&
&&&&private&Player&mPlayer&=&其中mEnemyList列表中会记录关卡里产生的所有敌人,当敌人被击毙之后,程序会把相应的Enemy对象从这张表中删除。mEnemyMap记录的其实就是前文所说的敌人的出场顺序表。另外,为了便于创建Enemy对象,我们可以先创建一个EnemyFactory对象,并记入mEnemyFactory域。&&&&&&&&&&另外,我们还需要管理所有Enemy发出的子弹,我们为EnemyManager添加了mBulletsMgr域,意思很简单,日后每个Enemy发射子弹时,其实都是向这个BulletsManager添加子弹对象。与此同理,我们还需要一个记录爆炸效果的爆炸管理器,那就是mExplodeMgr域。每当一个Enemy被击毙时,它会向爆炸管理器中添加一个爆炸效果对象。&4.2.1&&&drawFrame()EnemyManager的绘制动作很简单,只需遍历一下所记录的Enemy列表,调用每个Enemy对象的drawFrame()函数即可。@Override
public&void&drawFrame(Canvas&canvas)
&&&&Iterator&Enemy&&itor&=&mEnemyList.iterator();
&&&&while&(itor.hasNext())
&&&&&&&&Enemy&b&=&itor.next();
&&&&&&&&b.drawFrame(canvas);
}&span&style=&font-family:&Arial,&Helvetica,&sans-&background-color:&rgb(255,&255,&255);&&&&/span&4.2.2&&&execLogic()& & & & 执行逻辑的动作也差不多,都需要遍历Enemy列表:@Override
public&void&execLogic()
&&&&execAddEnemyLogic();&&&//&添加enemy的地方!
&&&&Iterator&Enemy&&itor&=&mEnemyList.iterator();
&&&&while&(itor.hasNext())
&&&&&&&&Enemy&b&=&itor.next();
&&&&&&&&b.execLogic();&&//&执行每个enemy的execLogic。
&&&&//&EnemyManager还需要负责清理“已死亡”的enemy
&&&&itor&=&mEnemyList.iterator();
&&&&while&(itor.hasNext())
&&&&&&&&Enemy&b&=&itor.next();
&&&&&&&&if&(b.isDead())
&&&&&&&&&&&&itor.remove();&&
}& & & & &请注意,EnemyManager的execLogic()在一开始会调用execAddEnemyLogic()函数,因为我们总需要一个地方添加关卡里的enemy吧。private&void&execAddEnemyLogic()
&&&&mEnemyCounter++;
&&&&if&(mEnemyCounter&%&24&==&0)
&&&&&&&&if&(mCurLine&&&mEnemyMap.length)
&&&&&&&&&&&&for&(int&i&=&0;&i&&&mEnemyMap[mCurLine].&i++)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&addEnemy(mEnemyMap[mCurLine][i],&i,&mEnemyMap[mCurLine].length);
&&&&&&&&&&&&}
&&&&&&&&mCurLine++;
}我们用一个mEnemyCounter计数器,来控制添加enemy的频率。帧流里每流动一帧,耗时大概50毫秒(因为我们设的帧率是20帧/秒),那么24帧大概会耗时24 * 50 = 1200毫秒。也就是说,每过1.2秒,我们就会向EnemyManager里添加一行enemy。至于这一行里具体有什么类型的enemy,是由mEnemyMap[ ]数组决定的。&&&&&&&&& addEnemy的代码如下:private&void&addEnemy(int&enemyType,&int&colIdx,&int&colCount)
&&&&Enemy&enemy&=&
&&&&int&enemyCenterX,&enemyCenterY;
&&&&enemy&=&mEnemyFactory.createEnemy(enemyType);
&&&&if&(null&==&enemy)
&&&&enemy.setBulletsManager(mBulletsMgr);
&&&&enemy.setExplodeManager(mExplodeMgr);
&&&&enemy.setTarget(mPlayer);
&&&&mEnemyList.add(enemy);
&&&&switch&(enemyType)
&&&&case&EnemyFactory.ENEMY_TYPE_DUCK:
&&&&case&EnemyFactory.ENEMY_TYPE_FLY:
&&&&&&&&int&colWidth&=&(int)((double)GlobalInfo.screenW&/&colCount);
&&&&&&&&enemyCenterX&=&colWidth&*&colIdx&+&colWidth&/&2;
&&&&&&&&enemyCenterY&=&-1&*&enemy.getHeight();
&&&&&&&&enemy.setInitInfo(enemyCenterX,&enemyCenterY,&8);
&&&&case&EnemyFactory.ENEMY_TYPE_PIG:
&&&&&&&&enemyCenterX&=&GlobalInfo.screenW&/&2;
&&&&&&&&enemyCenterY&=&-1&*&enemy.getHeight();
&&&&&&&&enemy.setInitInfo(enemyCenterX,&enemyCenterY,&8);
&&&&default:
}代码很简单,先利用EnemyFactory根据不同的enemyType,创建相应的enemy对象。然后为每个enemy设置重要的关联对象,比如mBulletsMgr、mExplodeMgr、mPlayer。这是因为enemy总是要发子弹的嘛,那么它每发一颗子弹,都要向“子弹管理器”里添加子弹对象。同理,当enemy爆炸时,它也会向“爆炸管理器”里添加一个爆炸效果对象。又因为enemy常常需要瞄准玩家发射子弹,那么它就需要知道玩家的位置信息,因此setTarget(mPlayer)也是必要的。&& & & & 接着我们将enemy对象添加进EnemyManager的mEnemyList列表中。另外还需要为不同enemy设置不同的初始信息,比如初始位置、运行速度等等。&4.3&&BulletsManager& & & & 游戏中所有的子弹,不管是enemy发射的,还是玩家发射的,都必须添加进“子弹管理器”加以维护。只不过为了便于处理,我们把enemy和玩家发射的子弹分别放在了不同的BulletsManager里。这就是为什么在GameManager里,会有两个BulletsManager的原因:private&BulletsManager&&&&mPlayerBulletsMgr&=&new&BulletsManager();
private&BulletsManager&&&&&mEnemyBulletsMgr&&=&new&BulletsManager();& & & & BulletsManager的代码如下:public&class&BulletsManager
&&&&private&ArrayList&Bullet&&mBulletsList&=&new&ArrayList&Bullet&();
&&&&public&void&addBullet(Bullet&bullet)
&&&&&&&&mBulletsList.add(bullet);
&&&&public&void&drawFrame(Canvas&canvas)
&&&&&&&&Iterator&Bullet&&itor&=&mBulletsList.iterator();
&&&&&&&&while&(itor.hasNext())
&&&&&&&&&&&&Bullet&b&=&itor.next();
&&&&&&&&&&&&b.drawFrame(canvas);
&&&&public&void&execLogic()
&&&&&&&&Iterator&Bullet&&itor&=&mBulletsList.iterator();
&&&&&&&&while&(itor.hasNext())
&&&&&&&&&&&&Bullet&b&=&itor.next();
&&&&&&&&&&&&b.execLogic();
&&&&&&&&itor&=&mBulletsList.iterator();
&&&&&&&&while&(itor.hasNext())
&&&&&&&&&&&&Bullet&b&=&itor.next();
&&&&&&&&&&&&if&(b.isDead())
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&itor.remove();
&&&&&&&&&&&&}
&&&&public&ArrayList&Bullet&&getBullets()
&&&&&&&&ArrayList&Bullet&&bullets&=&(ArrayList&Bullet&)mBulletsList.clone();
&&&&&&&&return&
}从代码上看,它的drawFrame()和execLogic()和EnemyManager的同名函数很像。在execLogic()中,每当发现一颗子弹已经报废了,就会把它从mBulletsList列表里删除。嗯,用isDead()来表达子弹是否报废了好像不太贴切,不过大家应该都能够理解吧,呵呵。&&&&&&&&& BulletsManager还得向外提供一个getBullets()函数,以便外界进行碰撞判断。这个我们在后文再细说。&4.4&&ExplodeManager& & & & 爆炸效果管理器和子弹管理器的逻辑代码差不多,所以我们就不贴它的execLogic()和drawFrame()的代码了。&&&&&&&&&&每个爆炸效果会对应一个Explode对象。因为爆炸效果一般都会表现为动画,所以Explode内部必须记录下自己当前该绘制哪一张图片了。在我们的程序里,爆炸资源图如下:这张爆炸图会在Explode对象构造之时传入,而且外界会告诉Explode对象,爆炸图中总共有几帧。Explode的构造函数如下:public&Explode(int&explodeType,&Rect&rect,&Bitmap&explodeBmp,&int&totalFrame)
&&&&mType&&&&&&&=&explodeT
&&&&mCurRect&&&&=&new&Rect(rect);
&&&&mExplodeBmp&=&explodeB
&&&&mTotalFrame&=&totalF
&&&&mFrameWidth&&=&mExplodeBmp.getWidth()&/&mTotalF
&&&&mFrameHeight&=&mExplodeBmp.getHeight();
}& & & & &每当ExplodeManager遍历执行每个Explode对象的execLogic()时,会改变当前应该绘制的帧号。这样当游戏总帧流流动时,爆炸效果也就动起来了。Explode的execLogic()函数如下:public&void&execLogic()
&&&&mCurFrameIdx++;
&&&&if&(mCurFrameIdx&&=&mTotalFrame)
&&&&&&&&mState&=&STATE_DEAD;
}& & & & &具体绘制爆炸帧时,我们只需把爆炸图中与mCurFrameIdx对应的那一部分画出来就可以了,这就必须用到clipRect()。Explode的drawFrame()函数如下:public&void&drawFrame(Canvas&canvas)
&&&&Rect&srcRect&=&new&Rect(mCurFrameIdx&*&mFrameWidth,&0,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&(mCurFrameIdx&+&1)*mFrameWidth,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&mFrameHeight);
&&&&canvas.save();
&&&&canvas.clipRect(mCurRect);
&&&&canvas.drawBitmap(mExplodeBmp,&srcRect,&mCurRect,&null);
&&&&canvas.restore();
}一开始计算的srcRect,表示的就是和mCurFrameIdx对应的绘制部分。&&&&&&&&&&其实,不光是爆炸效果,我们的每一类Enemy都是具有自己的动画的。它们的绘制机理和爆炸效果一致,我们就不赘述了。下面只贴出三类Enemy的角色动画图:&4.5&&Player& & & & 现在我们来看玩家控制的角色――Player类。它和Enemy最大的不同是,它是直接由玩家控制的。玩家想把它移到什么地方,他就得乖乖地移到那个地方去,为此它必须能够处理MotionEvent。&4.5.1&&&doWithTouchEvent()public&boolean&doWithTouchEvent(MotionEvent&event)
&&&&int&x&=&(int)event.getX();
&&&&int&y&=&(int)event.getY();
&&&&switch&(event.getAction())
&&&&case&MotionEvent.ACTION_DOWN:
&&&&&&&&mOffsetX&=&x&-&mCurRect.
&&&&&&&&mOffsetY&=&y&-&mCurRect.
&&&&&&&&return&
&&&&case&MotionEvent.ACTION_UP:
&&&&&&&&mOffsetX&=&mOffsetY&=&0;
&&&&&&&&return&
&&&&case&MotionEvent.ACTION_MOVE:
&&&&&&&&int&curX&=&x&-&mOffsetX;
&&&&&&&&int&curY&=&y&-&mOffsetY;
&&&&&&&&if&(curX&&&0)
&&&&&&&&&&&&curX&=&0;
&&&&&&&&if&(curY&&&0)
&&&&&&&&&&&&curY&=&0;
&&&&&&&&if&(curX&+&mWidth&&&&GlobalInfo.screenW)
&&&&&&&&&&&&curX&=&GlobalInfo.screenW&-&mW
&&&&&&&&if&(curY&+&mHeight&&&GlobalInfo.screenH)
&&&&&&&&&&&&curY&=&GlobalInfo.screenH&-&mH
&&&&&&&&mCurRect.set(curX,&curY,&curX+mWidth,&curY+mHeight);
&&&&&&&&return&
&&&&default:
&&&&return&
}&&&&&&&&&注意,为了保证良好的用户体验,我们需要在用户点击屏幕之时,先计算一下手指点击处和Player对象当前所在位置之间的偏移量,以后在处理ACTION_MOVE时,还需用x、y减去偏移量。这样,就不会出现Player对象从旧位置直接跳变到手指点击处的情况。&4.5.2&&&碰撞判断& & & & 现在我们来说说碰撞处理。在飞机游戏里,一种典型的碰撞情况就是被子弹击中啦。对于Player来说,它必须逐个判断敌人发出的子弹,看自己是否已和某个子弹亲密接触,如果是的话,那么Player就得减血,如果没血可减了,就算被击毙了。&& & & & 对于简单的游戏而言,我们只需判断子弹所占的Rect范围是否和Player所占的Rect范围有交集,如果是的话,就可以认为发生碰撞了。当然,为了增加一点儿趣味性,我们是用一个比Player Rect更小的矩形来和子弹Rect比对的,这样可以出现一点儿子弹和Player擦身而过的惊险效果。&&&&&&&&&&在GameManager的execLogic()的最后一步,会调用execCollsionLogic()函数。该函数的代码如下:private&void&execCollsionLogic()
&&&&mPlayer.doWithCollision(mEnemyBulletsMgr);
&&&&mEnemyMgr.doWithCollision(mPlayerBulletsMgr);
}意思很简单,Player需要和所有enemy发出的子弹进行比对,而每个enemy需要和Player发出的子弹比对。我们只看Player的doWithCollision()函数,代码如下:public&void&doWithCollision(BulletsManager&bulletsMgr)
&&&&if&(mState&==&STATE_EXPLODE&||&mState&==&STATE_DEAD)
&&&&ArrayList&Bullet&&bullets&=&bulletsMgr.getBullets();
&&&&Iterator&Bullet&&itor&=&bullets.iterator();
&&&&int&insetWidth&&=&(int)((mCurRect.right&-&mCurRect.left)&*&0.2);
&&&&int&insetHeight&=&(int)((mCurRect.bottom&-&mCurRect.top)&*&0.15);
&&&&Rect&effectRect&=&new&Rect(mCurRect);
&&&&effectRect.inset(insetWidth,&insetHeight);
&&&&while&(itor.hasNext())
&&&&&&&&Bullet&b&=&itor.next();
&&&&&&&&Rect&bulletRect&=&b.getRect();
&&&&&&&&if&(effectRect.intersect(bulletRect))
&&&&&&&&&&&&b.doCollide();
&&&&&&&&&&&&doCollide(b.getPower());
}其中那个effectRect就是比Player所占矩形更小一点儿的矩形啦。我们遍历BulletsManager中的每个子弹,一旦发现哪个子弹和effectRect有交集,就执行doCollide()。private&void&doCollide(int&power)
&&&&if&(mState&==&STATE_ADJUST&||&mState&==&STATE_EXPLODE&||&mState&==&STATE_DEAD)
&&&&if&(power&&&0)
&&&&&&&&//&kill&me&directly
&&&&&&&&mState&=&STATE_EXPLODE;
&&&&else&if&(power&&&0)
&&&&&&&&mMyHP&-=&
&&&&&&&&if&(mMyHP&&=&0)
&&&&&&&&&&&&mMyHP&=&0;
&&&&&&&&&&&&mState&=&STATE_EXPLODE;
&&&&&&&&else
&&&&&&&&&&&&mState&=&STATE_ADJUST;
&&&&&&&&&&&&mAdjustCounter&=&0;
}&&&&&&&&&如果写得复杂一点儿的话,不同enemy发出的子弹的威力应该是不一样的。不过在本游戏中,每颗子弹的威力都定为1了。也就是说,传入doCollide()的power参数的值总为1。每次碰撞时,Player就减一滴血(mMyHP -= power),然后立即跳变到STATE_ADJUST状态或STATE_EXPLODE状态。&&&&&&&&&&另一方面,enemy和Player发出的子弹也有类似的判断,只是判断条件更加宽松一些,这样可以给玩家增加一点儿射击的爽快感,呵呵。关于这部分的代码我们就不重复贴了。&4.5.3&&&被击中后的闪烁效果& & & & Player需要完成的另一个效果是被击中后,闪烁一段很短的时间,在这段时间内,它会暂时处于无敌状态,这样做可以避免玩家出现被多颗子弹同时击中而被瞬杀的情况。为此我们设计了一个“调整状态”,就是我们刚刚看到的STATE_ADJUST状态啦。&&&&&&&&&&一旦Player被击中,只要它的mMyHP(血值)没有减到0,那么它立即跳变到STATE_ADJUST。在这种状态下,我们不再每次都绘制Player图片了,而是隔一帧绘制一次,这样就可以达到闪烁的效果了。当然这个状态的维持时间很短,我们会记录一个mAdjustCounter计数变量,每次执行execLogic()会给这个计数器加1,直到加到6,我们就从STATE_ADJUST状态,跳变回普通状态(STATE_ALIVE状态)。public&void&execLogic()
&&&&if&(mState&==&STATE_ALIVE)
&&&&&&&&doFireBulletLogic();
&&&&else&if&(mState&==&STATE_EXPLODE)
&&&&&&&&doExplode();
&&&&else&if&(mState&==&STATE_ADJUST)
&&&&&&&&doFireBulletLogic();
&&&&&&&&mAdjustCounter++;
&&&&&&&&if&(mAdjustCounter&&&6)
&&&&&&&&&&&&mState&=&STATE_ALIVE;
&&&&&&&&&&&&mAdjustCounter&=&0;
}public&void&drawFrame(Canvas&canvas)
&&&&boolean&shouldDraw&=&
&&&&if&(mState&==&STATE_DEAD)
&&&&&&&&Log.d(&Player&,&&mState&==&STATE_DEAD&);
&&&&else&if&(mState&==&STATE_ADJUST)
&&&&&&&&if&(mAdjustCounter&%&2&==&0)
&&&&&&&&&&&&shouldDraw&=&
&&&&else&if&(mState&==&STATE_EXPLODE)
&&&&&&&&//&should&draw
&&&&Log.d(&Player&,&&mState&==&&&+&mState);
&&&&if&(shouldDraw)
&&&&&&&&Rect&src&=&new&Rect(0,&0,&mPlayerBmp.getWidth(),&mPlayerBmp.getHeight());
&&&&&&&&canvas.drawBitmap(mPlayerBmp,&src,&mCurRect,&null);
}&span&style=&font-family:&Arial,&Helvetica,&sans-&background-color:&rgb(255,&255,&255);&&&&/span&4.6&&GameInfoPanel& & & & 飞机游戏还需要一个简单的“信息显示板”,来显示一些重要的信息。在本游戏中,我只显示了Player的剩余血量(每滴血用一个红心表示),大家有兴趣可以再添加玩家分数等信息。&&&&&&&&&&我们设计的信息显示板是GameInfoPanel,它的逻辑非常简单:public&void&execLogic()
&&&&mPlayerHP&=&mPlayer.getHP();
}只是简单地记录一下Player的血量而已。&&&&&&&&&&绘制时,它根据所记录的血量值绘制相应的红心图片就可以了:public&void&drawFrame(Canvas&canvas)
&&&&Rect&&&&src&&&&&=&new&Rect(0,&0,&mHPBmp.getWidth(),&mHPBmp.getHeight());
&&&&Rect&dest&&&&=&new&Rect();
&&&&for&(int&i&=&0;&i&&&mPlayerHP;&i++)
&&&&&&&&dest.left&&&=&mRect.left&+&i&*&mHPiconW
&&&&&&&&dest.top&&&&=&mRect.
&&&&&&&&dest.right&&=&dest.left&+&mHPiconW
&&&&&&&&dest.bottom&=&dest.top&+&mHPiconH
&&&&&&&&canvas.drawBitmap(mHPBmp,&src,&dest,&null);
}5&&&&&&尾声至此,我们已经把这个小游戏的主要设计方面都讲到了。当然,因为这个游戏只是我为了好玩而写的一个demo程序,所以肯定有很多地方并不完备,这个我想大家也是可以理解的。那么就先说这么多吧。最后让我们来贴两张游戏截图,乐呵一下。&&&&& &&
上一篇: 1 概述 Android 系统(本文以 Android 4.4 为准)的属性( Property )机制有点儿类似 Windows 系统的注册表,其中的每个属性被组织成简单的键值对( key/value )供外界使用。 我们可以通过在 adb shell 里敲入 getprop 命令来获取当前系统的所有属性内容,
下一篇: AndroidL带来了许多新特性,其中就包括了大量的动画效果,你可以在自己的应用中使用。本文中我将详解这些动画和如何在应用中使用。本文中的所有代码可以在github上找到。 波纹和强调 现在安卓支持少量的预定义样式属性,不过只限于应用特定部分例如状态栏、

我要回帖

更多关于 飞机要撞上星星了 的文章

 

随机推荐