flappy bird电脑版 中的对象有哪些属性

《Flappy Bird》自火了以后,关于它的讨论就不绝于耳,尽管目前游戏已经被下架,但模仿品层出不穷,甚至有几款还登上了一些地区的排行榜。似乎很多人都希望通过对《Flappy Bird》的探索和挖掘寻找可以复制的成功模式,网上也出现了许许多多的分析。但是,我们真的明白《Flappy Bird》为什么火吗?或许我们并不明白。原文作者Itzhak Wolkowicz。
近期一夜爆红(又突然下架)高人气独立游戏《Flappy Bird》俨然在游戏界称为了一个现象级产品,人们都对其议论纷纷。在该游戏占领IOS市场的随后几周,无时无刻都会听到人们谈论这个游戏。我的同事们都在说&我们应该从这个款游戏中学习XXXX&&&,而我的朋友们则会问我&为什么你没做出这样的游戏?&。于是乎,《Flappy Bird》突然就成为了比肩《愤怒的小鸟》或者《糖果粉碎传奇》的作品,但它与《怒鸟》或是《糖果》不同,它是一款独立游戏,仅由一人完成&&阮阿东(Dong Nguyen),一位来自越南的29岁游戏开发者。
《Flappy Bird》的成功催生了一系列探讨它的文章,这些文章的标题诸如:
类似上述等等的文章,还有很多。而实际上,如果你在搜索引擎中用&可以从Flappy Bird中学到&作为关键词来搜索,你甚至可以发现一个专属的博客页面,名为&教堂可以从Flappy Bird和CVS中学到哪些?&(What the Church can learn from CVS and Flappy Bird)。当然,可以肯定的说,在这款游戏火了之后写出的作为热点炒作的一系列的相关文章,至少在一定程度上可以影响SEO/ SMO的价值。我也认同这类一夜爆红的游戏难免令人费解,毕竟每个人都会问:怎么做到的?
别误会我的意思。&怎么做到的?&是个很合理的提问,它总是能透过种种成功的故事来为你指点迷津。但在我看来,很显然在这个事件中,&怎么做到的?&是个贬义提问,并非是来自对这款游戏的虚心学习和挖掘,更多的是出于对它的质疑:一个默默无闻的越南开发者,没有市场推广营销经费的支持,怎么会登上iOS排行榜榜首?并且这款游戏的模仿痕迹明显&&游戏的画面和音效很明显是受到《超级玛丽》的影响,游戏玩法与《无尽奔跑者》(Endless Runner)相差无几,为什么它就火了呢?关于Flappy Bird的成功有不同观点,但在我看来实际上都并不成立:
1、人们玩Flappy Bird是因为这游戏不拘一格地挑战了现今游戏设计者公认的理念
但是Flappy Bird真的有那么特别吗?我承认,如果一个由大厂商开发的作品,没有升级系统、成就系统、或者递进式的难度,那一定令人吃惊。但这是一款独立游戏,独立游戏常常出现这种简单的模式,不关注收入和用户留存,只是出于做游戏的乐趣。对于那些&编程马拉松&式制作出来的游戏产品,把它们的成功归结到品质上并不是太有说服力。(手游网注:编程马拉松(hackathon)是指目前国外流行的一种编程形式,原文主要指自由无限制的编程行为)。
2、Flappy Bird具有与热卖大作相似的属性
的确,它画面不俗(当然是对于像素的风格而言),界面友好(图形颜色鲜艳有趣),并且开发者此前有积累过类似游戏的研发经验(虽然没有如今这么成功)&& Flappy Bird是基于作者从前积累下的知识。上述的是确实的,但Flappy Bird恐怕还没有独特到能与热卖大作相媲美。(手游网注:原文提到的&热卖大作&例如愤怒的小鸟、你画我猜、糖果粉碎传奇等)
3、Flappy Bird通过某些作弊行为才蹿升到榜首的
实际上这款游戏在半年前就已经发布。在今年1月份的时候突然爆红的确会让人产生一些怀疑。但对于该游戏可能通过作弊手段来上位(例如刷榜、刷分,手游网注),那么为什么阮阿东要选择在半年后刷?如果阮阿东追求的是名利、金钱和荣誉,他更没有理由在游戏最火爆的的时候将这款游戏下架。
4、Flappy Bird是借助病毒营销,突破某个阈值后,就会迎来爆发
毫无疑问,如果要借助病毒营销的力量,势必要在前期进行大规模的市场营销行为。但我们并没有看到Flappy Bird在前期在营销上有何举动,很神秘,对不对?
放到2011年《Piou Piou vs. Cactus》(一款和Flappy Bird很相似的作品,手游网注)这款游戏发布的时候,上述观点可能很有用。Flappy Bird看起来就像一款对《Piou Piou vs. Cactus》的复制(即便阮阿东表示没有参考该游戏)。并且《Piou Piou vs. Cactus》就是那么一款&不拘一格地挑战了现今游戏设计者公认的理念&的作品,但是这已经是一年前的事情了,有谁能解释为什么Flappy Bird的模式没能让《Piou Piou vs. Cactus》在当时火起来呢?
Piou Piou vs. Cactus
所以作为从业者,我们可以从&Flappy Bird现象&中学到什么呢?也许,如果我们放下对Flappy Bird的关注,就会开始关注到一个事实:我们是如此迷恋它。
&从来就没有完美的游戏。&或许透过整个事件我们能看到这点。即便抄袭模仿的文化能催生一大批类似《糖果粉碎传奇》《开心农场》等克隆产品(包括现在数不清的克隆《Flappy Bird》的手机游戏),但这不意味着就能诞生Zynga、King这样的公司,或是下一个阮阿东。对于推出一款热门大作的途径:从个人层面上说,是需要不断的努力和探索的;而在公司层面上说,需要建立起一个顶级团队、积累无数经验。这是可能是所谓&成功法则&中可行的部分,而剩下的就是靠运气了。
手游网总结:
对于《Flappy Bird》的火爆,一时间国内外都有无数的研究,但在手游网看来,无非四个字&机缘巧合&,或者就像原文作者所言,没有所谓的&成功法则&,靠的是经验积累,更主要的是运气。
返回7K7K首页flappy bird的分数和玩家的智商有关吗? - 知乎53被浏览8016分享邀请回答369 条评论分享收藏感谢收起4添加评论分享收藏感谢收起查看更多回答1 个回答被折叠()Flappy bird玩的好的人说明他什么能力好?
Flappy bird玩的好的人说明他什么能力好?
【17173整理报道】
《Flappy Bird》玩的好的人,说明他的什么能力好?
1.空间感知能力
首先,我觉得主要是判断运动物体轨迹的能力,这属于空间感知能力的一种。
游戏本身的机制很简单:小鸟自己在水平方向保持匀速运动,同时还有不知道符不符合牛顿定律的垂直下落;玩家唯一能做的操作就是让小鸟临时获得一个向上的速度。这三种速度合在一起,结果就是一个有点诡异的抛物线。玩家需要依据小鸟现有的位置和速度,快速判断自己施加操作之后会形成怎样的轨迹,并依靠这个轨迹躲避障碍物。
有很多研究表明,人类在估计运动物体的轨迹时会存在稳定的微小误差,这就是所谓的表征动量(representational momentum)现象,而游戏中小鸟的轨迹比这些实验使用的运动轨迹还要复杂得多。更令人发指的是,小鸟里柱子的宽度设计成了至少需要点击两次才能通过,因此玩家需要判断的是多个轨迹叠加后的结果;而且柱子的开口位置也是随机的,只有在屏幕上出现之后,才能做出相应的反应。这些设计对于玩家的判断准确度和速度提出了更高的要求,因此刚开始玩的时候一般都会觉得比较困难。
好在游戏内容比较单一,玩家可以在短时间内反复锻炼这个判断过程,不断获得对于判断结果的反馈(通过还是挂掉);经过这样一段时间的练习之后,表现就会有所进步。这种进步通常发生在内隐层面,很难用语言来描述,只能说是“找到感觉了”。
2.心理运动技能
除了轨迹判断之外,还有对于手指运动的控制,这属于心理运动技能,涉及到了手眼协调等能力。轨迹判断得准确,但手上功夫糙,总没法按到点上,也是不行的。
此外可能还有持久性,这个还没找到专业的说法叫什么。。。游戏本身的流程没有任何变化,过第1根柱子和第9999根柱子的过程是完全相同的,但需要一直保持高度紧张的状态,投入大量心理资源,这样很快就会疲劳。疲劳之后判断准确性下降,操作误差增大,就会觉得越来越难。要解决这个问题,办法也是多练。相关的加工过程经过反复使用之后,变得更加熟练,更加自动化,耗费的认知资源就会减少,也就没那么容易疲劳了。
3.闲得蛋疼
当然,要练就以上技能,你需要大量的时间,总结一个字就是:闲
来源:果壳问答
【来源:】
类型:大型RPG
特征:动作
类型:大型RPG
特征:沙盒
类型:大型RPG
特征:沙盒
你不知道点进去会是什么
Wan网页游戏免费玩cocos2d-x v3.2 FlappyBird 各个类对象具体代码分析(5)
今天介绍的是管道层
PipeLayer.h
PipeLayer.cpp
管道层主要实现的是管道从右边往左边平移,结束后移除,而且管道还要长短高低不一样,然后就是如何判断小鸟通过一个管道。先说管道的平移,这个很简单,用一个函数把两跟管道封装好,让它moveby或者moveto好了,平移结束后,用一个回调函数移除自己就够了,当然封装好管道后,我们要把每一个管道放到一个数组里,方便管理嘛;然后就是管道高低不一样这里用一张图表示:
最后就是小鸟通过管道判断,这里我们是判断一个完整的管道是否通过屏幕中心线(因为小鸟是固定在屏幕中心,上下移动的)。这个类大致就这些内容。
下面这张图解释了为什么管道停止移动后,要取消向上管道的物理模型,防止小鸟死亡后直接掉在管道上:
下面是代码分析:
//PipeLayer.h
#pragma once
#include "cocos2d.h"
class PipeLayer:public cocos2d::Layer
PipeLayer();
~PipeLayer();
bool init();
//添加一个移动的组合管道
void addPipe(float);
//管道移动结束后的回调函数
void pipeMoveOver(cocos2d::Ref *);
//管道停止移动
void stopPipe();
//计时器执行函数
void update(float);
//管道开始移动
void startPipe();
CREATE_FUNC(PipeLayer);
//管道数组一
cocos2d::Array * pipe_
//管道数组二
cocos2d::Array * pipe_arr2;
//PipeLayer.cpp
#include "PipeLayer.h"
#include "define.h"
#include "NumberLayer.h"
USING_NS_CC;
PipeLayer::PipeLayer()
PipeLayer::~PipeLayer()
//析构函数释放数组
pipe_arr->release();
pipe_arr2->release();
bool PipeLayer::init()
if (!Layer::init())
//两个数组初始化,其实只要一个数组就够了,楼主刚开始写的时候傻逼了
//pipe_arr 这个数组是用来检测加分的
//pipe_arr2 这个数组是为了方便统一处理管道
pipe_arr=Array::create();
//防止被自动释放
pipe_arr->retain();
pipe_arr2=Array::create();
pipe_arr2->retain();
void PipeLayer::addPipe( float )
log("this pipe");
//向上管道初始化
auto pipe_up=Sprite::createWithSpriteFrameName("pipe_up.png");
pipe_up->setPosition(Point(pipe_up->getContentSize().width/2,pipe_up->getContentSize().height/2));
auto body_up=PhysicsBody::create();
auto body_shape_up=PhysicsShapeBox::create(pipe_up->getContentSize());
body_up->addShape(body_shape_up);
body_up->setDynamic(false);
body_up->setGravityEnable(false);
body_up->setCategoryBitmask(1);
body_up->setCollisionBitmask(-1);
body_up->setContactTestBitmask(-1);
pipe_up->setPhysicsBody(body_up);
//向下管道初始化,这边的THROUGH_HEIGHT是两根管道之间的空隙
auto pipe_down=Sprite::createWithSpriteFrameName("pipe_down.png");
pipe_down->setPosition(Point(pipe_down->getContentSize().width/2,pipe_down->getContentSize().height/2+pipe_up->getContentSize().height+THROUGH_HEIGHT));
auto body_down=PhysicsBody::create();
auto body_shape_down=PhysicsShapeBox::create(pipe_down->getContentSize());
body_down->addShape(body_shape_down);
body_down->setDynamic(false);
body_down->setGravityEnable(false);
body_down->setCategoryBitmask(1);
body_down->setCollisionBitmask(-1);
body_down->setContactTestBitmask(-1);
pipe_down->setPhysicsBody(body_down);
//这边的node相当于一个容器把这两个管道封装在一个节点中并设置target
auto node=Node::create();
node->addChild(pipe_up,0,PIPE_UP);
node->addChild(pipe_down,0,PIPE_DOWN);
node->setAnchorPoint(Point::ANCHOR_BOTTOM_LEFT);
//关于管道Y坐标的设置(就是管道上下长度不一样的处理),大家还是看图例,说不清楚
//管道是从右边移动到左边,所以PIPE_X的值肯定比游戏的width要大这里设定是300
int range=rand()%PIPE_RANGE;
node->setPosition(Point(PIPE_X,PIPE_Y+range));
//管道移动的时间,距离,以及方向
auto moveby=MoveBy::create(PIPE_TIME,PIPE_VELOCITY);
//管道移动结束后执行的回调函数
auto callback=CallFuncN::create(CC_CALLBACK_1(PipeLayer::pipeMoveOver,this));
//把管道移动和结束后的回调放到列队中
auto sequence=Sequence::create(moveby,callback,NULL);
node->runAction(sequence);
this->addChild(node);
//把管道放到两个数组中
pipe_arr->addObject(node);
pipe_arr2->addObject(node);
//启动计时器,这个计时器是用来判断得分的
//也就是小鸟是否通过管道
//只要启动一次就够了,所以这边有个btn
this->scheduleUpdate();
//移动结束后,从这个类和数组中移除管道
void PipeLayer::pipeMoveOver(Ref * r)
Sprite * sp=(Sprite* )r;
this->removeChild(sp);
pipe_arr2->removeObject(sp);
//停止管道移动(小鸟死亡后)
void PipeLayer::stopPipe()
this->unschedule(schedule_selector(PipeLayer::addPipe));
this->unscheduleUpdate();
//这里取消了向上管道的物理结构
//这样子做是为了当小鸟撞到向下管道死亡了,不跌落在向上管道上
CCARRAY_FOREACH(pipe_arr2,p)
auto n=(Node*)p;
//管道停止移动
n->stopAllActions();
//向上管道取消物理结构
n->getChildByTag(PIPE_UP)->getPhysicsBody()->setEnable(false);
void PipeLayer::update(float)
auto origin=Director::getInstance()->getVisibleOrigin();
auto visibleSize=Director::getInstance()->getVisibleSize();
//如果管道数量为0,则直接返回
if (pipe_arr->count()getObjectAtIndex(0);
//如果管道整体过了场景的一半,那就加分
//同时在这个数组中,移除了这个管道
//这样,位于这个管道后的下一管道就变成最前面的管道了
//index: 0 1 2 3 4
//array: A B C D E
这是序列为0的管道A,当它过完场景中点时,它在数组中就被移除了,然后就变成
//index: 0 1 2 3 4
//arrat: B C D E F
//管道B就变成序列0了,然后再检测
if ( tn->getPositionX()getContentSize().width);
pipe_arr->removeObjectAtIndex(0);
CocosDenshion::SimpleAudioEngine::getInstance()->playEffect("sounds/sfx_point.mp3");
NumberLayer::getInstance()->addScore();
//管道开始移动
void PipeLayer::startPipe()
this->schedule(schedule_selector(PipeLayer::addPipe),PIPE_FRE);

我要回帖

更多关于 flappy bird 源码 的文章

 

随机推荐