即便从未见过&Peter&Vesterbacka&其人,但当这个芬兰大叔坐在酒店大堂里,你还是能够一眼辨别出他与&Rovio&的关系——从一身红色《》帽衫&T&恤,到手持的三星手机,连&iPad&保护套都是《愤怒的小鸟》主题系的,都俨然一个活体代言人。你可能不知道芬兰公司&Rovio,但你应该不会不知道《愤怒的小鸟》这款风靡全球的游戏:为了报复偷走鸟蛋的绿皮猪们,各种颜色的小鸟以自己的身体为武器,去攻击肥猪们的堡垒。这么一个简单逻辑的游戏,借助大屏多点触控智能手机的兴起,不仅在短短&4&年时间里实现了&20&亿次的,而且一度成为一种文化现象,辐射到了主题乐园、衣服、食品、玩具、书籍等领域。第&52&款游戏《愤怒的小鸟》对于&Rovio&的意义,就如同米老鼠之于迪士尼。事实上,如果没有《愤怒的小鸟》,Rovio&可能还是一家做外包的普通公司。Peter&告诉我们,在《愤怒的小鸟》家喻户晓之前,Rovio&在手机游戏制作领域已经有近&5&年的发展历史。“没有《愤怒的小鸟》这款游戏就不会有公司的今天。对于很多新兴的初创企业来说都是一样的,很可能需要很长时间才能成功。”Peter&回忆说,2003&年,来自赫尔辛基阿尔托大学的大学生的尼可拉斯·赫德和他的两个小伙伴凭借一款多人在线游戏《King&of&the&Cabbage&World》赢得了由诺基亚和惠普合办的手机游戏大赛冠军。赛后,这三个年轻人在时任赛会组织者的&Peter&的鼓励下,成立了&Relude&公司。经过一系列兼并与变动,Relude&公司改名为&Rovio,Rovio&逐渐从一个只能做游戏开发和外包的小工作室成为具备了每月发布一款新游戏的实力的游戏公司。但矛盾随之而来,公司一部分员工认为公司游戏的开发方向应该以硬派游戏,特别是战争游戏为主,然而以&CEO&米卡尔为首的元老们认为游戏开发的方向应该以休闲游戏为主。“硬派游戏”虽然赢得了内部斗争但是并没有赢得市场,而&2005&年手机硬件配置确实支撑不起需要高端配置的硬派战争游戏,&由于策略的失误,仅仅一年多&Rovio&就烧光了所有的投资,Rovio&再次回到外包时代。在&2008&年最困难的时候,整个公司仅留下不到十个人。转机出现在&2009&年,伴随着米克尔的回归,Rovio&的重心重新回到“休闲”游戏的理念上来,2009&年&3&月一次创意展示会,公司里一位游戏设计师设计了一款游戏,没有人理解这款游戏,但是大家都很喜爱这款游戏中的主人公—鸟。于是就决定用这个鸟的角色做一款游戏。排行榜第&1&名简单的操作,但极度微小的偏差操作就会得到截然不同的分数,其实《愤怒的小鸟》弹射的操作方式也是在几经修改后才确定下来的操作方式。2009&年这款由鸟和猪组成的《愤怒的小鸟》一跃成为芬兰手游第一名,春天成为瑞典手游的第一名,但始终不能打入英美市场,为此,Rovio&公司与游戏发行商&Chillingo&展开合作,终于在这家公司的撮合下,他们针对&iPhone&进行优化的《愤怒的小鸟》登上英国&App&Store&的当周主打游戏,2010&年&3&月、4&月《愤怒的小鸟》成为美国、英国手游的第一。除去&Rovio&开始推出一些阶段性的小游戏策略,Rovio&将《愤怒的小鸟》推向了&Android&平台。第一次推出就在&Android&平台拿到了&2000&万次下载的惊人成绩,这些广告费用支撑《愤怒的小鸟》继续进入更多的平台,并相继推出了更多的版本。2009&年&11&月&11&日,公司只有&11&人,现在我们有&700&多人。“而且&Rovio&除了在赫尔辛基的办公室之外,在上海、东京、首尔、德里、圣莫尼卡都有工作室。”Peter&表示。随着购买收费手游向免费手游支持内购的方向的变化,公司的运营利润开始出现下滑,公司开始在其他游戏上做一些尝试,包括像素风游戏最火的时候,Rovio&也曾尝试推出这种类型的游戏。立志成为手游界迪士尼截止&2013&年&1&月,《愤怒的小鸟》系列游戏应用已经拥有&2.6&亿玩家。智能手机的风潮依旧不减,手机游戏方面已经开始展开了跨界合作,推出一系列的新型模式和版本,《愤怒的小鸟》先后推出了配合情人节、万圣节等节日的“季节版”,与电影《里约大冒险》配合的“里约版”,零重力玩法的“太空版”,以及最近与卢卡斯影业合作推出的“星球大战版”。同时公司也开始对外宣布&Rovio&不想将游戏作为单一的收入。Rovio&不只是想做一个游戏公司,《愤怒的小鸟》的品牌价值才是重中之重。Rivio&和孩之宝(Hasbro)推出了《愤怒的小鸟》卡牌玩具产品,此外,更是将《愤怒的小鸟》定位为他们自己的米老鼠,并且希望将成为时尚的符号。除游戏外,Rovio&开始加大周边产业的投资力度,他们跟一些看上去“搭不上边”的广告商、企业甚至品牌进行合作,《愤怒的小鸟》跟福克斯电影合作,跟星球大战品牌合作,甚至还要跟中国当地的“山寨”小鸟形象主题乐园谈合作,在中国推出《愤怒的小鸟》月饼等。《愤怒的小鸟》开始进入各行各业,涉足广告、玩具、主题服饰,甚至搞起了主题乐园,然后进入教育行业。至此,《愤怒的小鸟》有电影,有游戏,甚至几岁的孩子都知道这款游戏:猪是坏的,鸟是愤怒的。他们喜欢这个品牌的衣服,喜欢跟父母一起玩这款游戏,这种现象开始超越了游戏本身,成为一种文化。“《愤怒的小鸟》不在意到底是游戏更受欢迎还是消费产品。《愤怒的小鸟》明年的重点是大电影,这也是给其他产品宣传的很好机会。总的说来,愤怒的小鸟希望所有产业都赢利,主要是靠授权形象来赢利。”Peter&眼神坚定的看着我说。裁员,14&年同比利润下降&73%理想总是美好的,现实是残酷的。“2014&年的游戏收入稳定增长,主要得益于新发布的&6&款手游,但收入整体下滑的原因是周边产品不如人意。”Rovio&的&CEO&在财报会议上表示。相关报告称,《愤怒的小鸟》母公司&Rovio&在去年开始宣布裁员,在起初裁掉了&110&人,在上个月的时候,它们开始宣布新一轮裁员计划:裁掉了芬兰总公司的&230&个岗位,以及全球&30&个左右的海外岗位。裁员数超过公司总人数的三分之一。官方提供的业绩报告显示,这家公司&2014&年税前利润同比下降&73%,总营收额下降&9%,降到&1.58&亿欧元。这似乎是公司裁员的主要原因,虽然《愤怒的小鸟》官方制作《愤怒的小鸟&2》上架仅一周就吸引了&2000&万次下载,但&Rovio&对其营收表现只字未提,就连主创团队的回答也显得支支吾吾,他们显然不接受这样的结果。2014&年初,这家公司发布&2013&年财报时称公司拥有&800&名员工。而不到两年的时间,这家公司的员工规模就发生了如此变化。Rovio&决定重新审视自己的主题乐园和游乐场扩张计划。他们决定将业务主要归列成三块:游戏、玩具和电影。爱范儿:作为一款拥有悠久历史的手游,《愤怒的小鸟》&这款游戏目前拥有多少个版本,用户的下载量趋势呈现了一个怎样的变化?Peter:《愤怒的小鸟》共有&30&亿的下载量,其中&9&亿下载量来自中国。《愤怒的小鸟&2》发布至今已经有5000&万下载量,三分之一来自中国。《愤怒的小鸟&2》也和中国本土企业&KUNLUN&有所合作。《愤怒的小鸟》有&10&个系列,比如原始版,太空版,星球大战版,星球大战&2&版。我们每天拥有数千万的活跃玩家,超过&100&万的玩家持续玩超过几个月。数以百万计的玩家每天都在玩。在北欧、俄罗斯,《愤怒的小鸟》软饮也很受欢迎。总的说来,《愤怒的小鸟》通过不同的方式拥有了很庞大的粉丝群。爱范儿:公司运营数据是什么样的,方便用数据体现一下《愤怒的小鸟》的盈利模式,以及目前的盈利状态么?玩具,电影或者是周边产品的比重以及盈利状态大概都是怎样的?Peter:《愤怒的小鸟》不在乎哪一个板块更赚钱,因为这也和公司在此段时间内的工作侧重点有关,《愤怒的小鸟》不在意到底是游戏更受欢迎还是消费产品。《愤怒的小鸟》明年的重点是大电影,这也是给其他产品宣传的很好机会。总的说来,《愤怒的小鸟》希望所有产业都赢利,主要是靠授权形象来赢利。爱范儿:中国的手游有时会出现“短平快”的现象,基本在一波浪潮过去之后就消失了,你是如何看待中国的手游行业的?Peter:特别局限、本地化,不寻求国际市场。我很想尝试中国手游,可是由于他们都十分本地化,所以都是中文的,而我不会中文,所以没有办法。中国手游不寻求国际市场也是很符合常理的,因为中国的市场很大,做好本地市场已经足够。爱范儿:像《愤怒的小鸟》这样的手游或者说&Rovio&这样的手游公司保持自身竞争力的诀窍有哪些?Peter:就像&Hello&Kitty&一样,《愤怒的小鸟》是个品牌,而不仅仅是一个游戏。Rovio&更注重为用户带来更多体验。《愤怒的小鸟&2》现在已经有超过&5000&万的下载量,《愤怒的小鸟》更多的是品牌形象,而不仅仅是游戏。Rovio&的职责是使得《愤怒的小鸟》形象与品牌相结合,《愤怒的小鸟》是以粉丝为上的一个品牌。围绕《愤怒的小鸟》,Rovio&做了很多,一直保持品牌的新鲜感。比如说昨天推出的夏奇拉鸟形象,就又是一个创新。在《愤怒的小鸟&2》中,夏奇拉鸟也是一个角色。而且&Rovio&也推出了&fight&这个新游戏版本,通过不断地更新,新鲜全新有意思的《愤怒的小鸟》系列产品。爱范儿:看您在很多展会上穿了很多《愤怒的小鸟》主题的衣服,我们也能看到很多这种动漫、游戏品牌推出或者授权这些周边产品,如何看待这些周边对于游戏本身的意义?Peter:Rovio&的宗旨是粉丝和品牌。Rovio&想要为粉丝们提供全方位的体验,所以才有游戏、卡通片、消费产品、主题公园、电影。每一个周边产品都对品牌有促进作用,品牌也对产品有促进作用。就像迪士尼和Hello&Kitty一样,Rovio&也是一个为了粉丝而提供全方位产品的品牌。爱范儿:《愤怒的小鸟》也宣布在教育行业做点事情,为什么想要从手游进入教育行业?这个《愤怒的小鸟》的教育跟我们传统的教育有什么不同?目前有哪些成果分享么?Peter:《愤怒的小鸟》不仅仅是游戏,而是一个品牌。93%&中国人知道这个品牌,91%&印度人、90%&美国人知道,所以这是一个很强大的品牌,允许我们可以进入教育行业。Rovio&的成功很大程度来自于芬兰的高水平教育,我们只有&500&万人口,却产出了&Linux&系统、&数据库、诺基亚、现在有愤怒的小鸟,在很大程度上都是因为芬兰的教育。我们想将&Rovio&公司和教育相结合,在芬兰我们和赫尔辛基大学合作、在中国和北京师范大学合作,致力于教育行业。我们开创了快乐学习的方式,使得学习很有趣。(芬兰男生英语比女生好,因为他们玩英文游戏,在娱乐中学习了)。Rovio&也出了一本快乐学习的书,也有幼儿园教育的项目,致力于三到六岁孩子的白天看护(在上海、成都、南京、新加坡、明尼阿波里斯)。寓教于乐,芬兰式的教育和中国的教育很不同。(自己有两个孩子,9&点开始上学,2&点回家)生活和学习相结合、得以平衡,这样才能培养出创造力。所以五百万人口的芬兰有《愤怒的小鸟》,而十三亿人口的中国没有。爱范儿:裁员、缩减开支等一系列公司方向的变化,是否说明公司的战略出现了一些问题?如果是,你们是如何补救的?Peter:Rovio&的策略仍然是全心为品牌为粉丝,现在更多得是和合作伙伴共同合作。最大的改变是&Rovio&不再亲力亲为所有事情,而是寻求合作,以达到精简部门,高效的目的。Rovio&成长的非常迅速,与其所有事情亲力亲为,不如外包一部分给合作伙伴,因为在特定的领域,合作伙伴会更有经验。比如&fight&这款游戏版本,是&Rovio&授权、出品,但是游戏是由东京的一家工作室制作的。又比如明年的大电影,是由&Rovio&出资出品的,但是制作是由温哥华的索尼&IMAGE。Rovio&的职责在于把控品牌及用户体验,而不需要什么事情都亲自去做,由&Rovio&授权,和合作伙伴共同完成是最佳选择。爱范儿:游戏本身,电影、主题周边等很多业务会在公司展开,在未来,公司或《愤怒的小鸟》团队会主要做什么样的事情,有什么样的目标?Peter:做像&Hello&Kitty,&Micky&Mouse,&Mario&那样的企业。Rovio&并不想做&100&天的游戏公司,而是&100&年的品牌。所以&Rovio&制作了更多得游戏、电影,以满足粉丝的需求。Rovio&想要不断地吸纳粉丝,让更多的人喜爱。品牌、形象最重要。
投诉欺诈商家:
天津重庆哈尔滨沈阳长春石家庄呼和浩特西安太原兰州乌鲁木齐成都昆明贵阳长沙武汉郑州济南青岛烟台合肥南京杭州东莞南宁南昌福州厦门深圳温州佛山宁波泉州惠州银川
本城市下暂无经销商
下载中关村在线Android 客户端
下载中关村在线 iPhone 客户端
下载中关村在线Windows8客户端
成为中关村在线微信好友您所在的位置: &
Lua简介:开发《魔兽争霸》和《愤怒的小鸟》的语言
Lua简介:开发《魔兽争霸》和《愤怒的小鸟》的语言
在最新一期的编程语言排行榜中Lua语言的排名已经上升到第十名。本文我们将介绍Lua语言这门小巧轻型的脚本语言,希望51CTO的介绍能让你开始Lua语言的开发。
一年前,苹果决定在iOS系统上使用Lua语言,凡是Objective-C能做的,Lua也能做!《愤怒的小鸟》的成功让开发者开始关注Lua语言。
Lua 是一个小巧的脚本语言。作者是巴西人。该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。它的主页是
www.lua.org。
1. Lua的特点
Lua最著名的应用是在暴雪公司的网络游戏《魔兽争霸》和iOS著名应用《愤怒的小鸟》中。
Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和维护。
Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切
都决定了Lua是作为嵌入式脚本的最佳选择。
Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能,这将给Lua带来更加优秀的性能。请访问
http://luajit.luaforge.net/ 来了解这个项目。
和Python等脚本不同,Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。不过Lua还是具备了比如数学运算和字符串处理等基本的功能。
Lua 目前的最新版本是 5.1
Lua只有一种数据类型,table. 实际上就是hash表。它用这个来模拟数组,链表等等。 在语法上,Lua支持如下形式:
data&=&{}&--定义一个table&&data.i&=&1&&data.name&=&&jason&&&data.package&=&{1,2,2,3,56,7}&&data.others&=&{}&&data.others.a&=&1&&data.others.b&=&1.1&
这使得Lua具有了跟C的struct类似的形式,非常便于设计C函数的参数,用一个table就可以传入很复杂的参数。
2. 数据交换介绍
Lua和C程序通过一个堆栈交换数据: struct lua_State
堆栈的序号可以从栈顶和栈底计数,从栈底计数,则栈底是1,向栈顶方向递增。从栈顶计数,则栈顶是-1,向栈底方向递减。一般都用从栈顶计数的方式。堆栈的默认大小是20,可以用lua_checkstack修改.用lua_gettop则可以获得栈里的元素数目。并不是说在栈顶有一个整形元素。而是计算了一下栈顶元素在栈里的正index,相当于元素数目。
Lua 调用C函数用的堆栈是临时的,调用结束之后就被销毁了。
如何从堆栈中获取从Lua脚本中的参数
如果知道Lua脚本中某个全局变量的名字,可以用void lua_getglobal (lua_State *L, const char *name)
。这个函数会将name所指Lua变量的值放在栈顶.
如果是在C 函数中要获取Lua调用函数使用的参数:
首先用lua_gettop检查参数数量
用lua_is...类函数检测参数的类型,做好错误处理
用lua_to...类函数将参数转换为number或者string.(对Lua来说,只有这两种简单类型)
lua_tonumber返回的是double
lua_tostring返回的是char*
用lua_remove从栈中删除掉元素
继续获取下一个元素. 因为每次都调用lua_remove,所以每次调用lua_tonumber,使用的index都将固定是-1,即栈顶。
如果lua_istable成立,那么说明栈顶是一个table.注意table是不能取出来的,只能把table里的元素一个个取出来。
首先把元素的名字压入栈顶: lua_pushstring(L,&i&);
然后就可以用lua_gettable调用,值会放在栈顶。同时刚才压入的元素名字被弹出。 用上面的办法,可以把这个值取出来。记得也应该lua_remove。
如果table的某一个元素也是table,重复即可。
当table的所有元素都取完了,记住这个table本身还在堆栈里,要用lua_remove把它删除。
如果要获取的是一个数组(所谓数组,其实就是key是从1开始的数字序列的table,并且值类型相同),用lua_next可以遍历这个数组:
首先lua_pushnil,压入一个空值,然后
while&(lua_next(L,&-2)&!=&0)&&{&&if(lua_isnumber(L,-1))&&&{&&arrf.add((float)lua_tonumber(L,&-1));&&lua_remove(L,-1);&&}&&}&&lua_remove(L,-1);&
如何从C返回数据给Lua脚本
用lua_push...类函数压入数据到堆栈中,并用来告诉Lua返回了几个返回值。 Lua是天生支持多个返回值的,如 x,y =
Test()。 Lua会根据n从栈里取相应的数据。
如果要返回一个table:
lua_newtable(L);&&lua_pushstring(L,&&mydata&);&&lua_pushnumber(L,66);&&lua_settable(L,-3);&&lua_pushstring(L,&&subdata&);&&lua_newtable(L);&&lua_pushstring(L,&&mydata&);&&lua_pushnumber(L,53);&&lua_settable(L,-3);&&lua_settable(L,-3);&&lua_pushstring(L,&&mydata2&);&&lua_pushnumber(L,77);&&lua_settable(L,-3);&&return&1;&
如果要返回一个数组,用如下代码:(注意那个关于trick的注释,我在等官方的解释。经过验证,这个问题只在windows版本调用dll中方法的时候出现。WinCE正常
lua_pushstring(L,&arri&);&&lua_newtable(L);&&{&&&&lua_pushnumber(L,-1);&&lua_rawseti(L,-2,0);&&for(int&i&=&0;&i&&&arri.size();i++)&&{&&lua_pushnumber(L,arri[i]);&&lua_rawseti(L,-2,i+1);&&}&&}&&lua_settable(L,-3);&
这样产生的数组可以在Lua中如下遍历:
for&i,v&in&ipairs(data.arri)&do&&print(v)&&end&
for&i=1,table.getn(data.arri)&do&&print(data.arri[i])&&end&
只有数组才能这样,name,value构成的Record不行,table.getn也只对数组有效。
由于上述代码的高度相似性,所以很容易实现自动生成这些代码。比如,根据C的一个struct定义:
typedef&enum&&{&&BR_9600,&&BR_4800,&&}&BaudR&&typedef&struct&flag&&{&&int&&&int&j;&&long&l;&&double&d;&&char*&&&BaudRate&&&}&
可以自动产生如下代码:
bool&DataToLua(flag&data,lua_State&*L)&&{&&lua_newtable(L);&&lua_pushstring(L,&onoff&);&&lua_pushnumber(L,(double)data.onoff);&&lua_settable(L,-3);&&lua_pushstring(L,&j&);&&lua_pushnumber(L,(double)data.j);&&lua_settable(L,-3);&&lua_pushstring(L,&l&);&&lua_pushnumber(L,(double)data.l);&&lua_settable(L,-3);&&lua_pushstring(L,&d&);&&lua_pushnumber(L,(double)data.d);&&lua_settable(L,-3);&&lua_pushstring(L,&name&);&&lua_pushstring(L,data.name.c_str());&&lua_settable(L,-3);&&lua_pushstring(L,&rate&);&&lua_pushnumber(L,(double)(int)data.rate);&&lua_settable(L,-3);&&return&true;&&}&
LuaToData也是类似的。
如果使用面向对象的方式封装起flag来,把DataToLua变成flag类的一个方法,就更加方便了。
3. C和Lua脚本互相调用举例
首先是C的主程序初始化Lua脚本引擎,并注册一些函数供脚本中调用:
&&&&static&int&l_getarr&(lua_State&*L)&&{&&lua_newtable(L);&&lua_pushnumber(L,1);&&lua_rawseti(L,-2,1);&&lua_pushnumber(L,2);&&lua_rawseti(L,-2,2);&&lua_pushnumber(L,3);&&lua_rawseti(L,-2,3);&&lua_pushnumber(L,4);&&lua_rawseti(L,-2,4);&&return&1;&&}&&int&main()&&{&&lua_State&*L&=&lua_open();&&&luaopen_base(L);&&&luaopen_table(L);&&&luaopen_string(L);&&&luaopen_math(L);&&&lua_pushcfunction(L,&l_getarr);&&&lua_setglobal(L,&&getarr&);&&if&(lua_dofile(L,&&testlua.lua&))&&{&&printf(&run&script&failed\n&);&&}&&else&&{&&lua_getglobal(L,&&result&);&&&if(lua_isnumber(L,-1))&&{&&printf(&The&result&of&the&Lua&script&is&%d\n&,lua_tonumber(L,-1));&&}&&}&&lua_close(L);&&return&0;&&}&
脚本的代码如下:
array&=&getarr()&&if&array&~=&nil&then&&result&=&1&&for&i=1,table.getn(array),1&do&&print(array[i])&&end&&else&&result&=&0&&end&
4. 参考资料
http://www.lua.org
自从Lua语言被苹果指定为iOS应用开发语言后Lua语言发展迅速,《愤怒的小鸟》的成功让开发者开始关注这门轻型的脚本语言。在最新一期的编程语言排行榜中Lua语言的排名已经上升到第十名。希望51CTO的介绍能让你开始Lua语言的开发。【编辑推荐】【责任编辑: TEL:(010)】
关于的更多文章
Lua是一个被设计成用于扩展C/C++编程的轻量级脚本语言,它的目标
随着云计算、物联网、大数据、移动互联网的大发展,你应该知道这些。
现在天气渐凉,秋意越来越浓厚了,上周,公司全体组织
当下移动互联网的发展势头迅猛,各式各样的App也在横
微软和诺基亚终于达成协议,微软将收购诺基亚设备与服
本书详细介绍了AJAX在Web开发上的应用。主要内容包括:ASP.NET AJAX技术概述、实现异步局部更新页面、UpdatePanel编程功能、Page
Windows Phone专家
Android开发专家
51CTO旗下网站