沉寂一年多之后又想起写博客,希望不是今年最后一次。

 

今年的GDC China无疑又是一次团结的胜利的大会,但刨去IGF China颁奖的热闹,各种社交的晚宴聚会之外,感到留给自己的是冰冷的现实。

 

走在初冬的上海街道,注视着昏黄的路灯灯光,我感到异常的孤独。

 

首先是关于Project OneTap的。这是个有一点机制创新的游戏,在去GDC之前我对它还是有点信心的,但试玩后的结果被很多indie批评为太过商业,过分取悦媚俗文化,从而丧失了独立游戏的本质(例如Pixel May Cry,例如FTL都是很多人津津乐道的体现独立风格的游戏)。虽然我们花了近乎一年的时间来原型、打磨这个游戏,付出了很多辛勤的劳动,但对这点我无法否认。而且就OneTap的现状来说,可能也只能这样了,把它按现在的路线做完。

 

接着,既然独立游戏应该有独立游戏的风格,那么做这样产品的团队怎么存活下来? 面对这个问题,FTL团队坦言说他们在吃老本吃存款,完全不为销路担心。Canabalt的作者Adam Saltsman也认为独立游戏之所以独立,是因为把design放在business之前。以他的经验,他喜欢先设计游戏,甚至免费让大家都能玩到,再考虑如何赚钱。包括后来跟他聊到的Aquaria/Spelunky的作者Derek Yu也是走的这种,先private development一段时间,再上tigsource public development一段时间,收集反馈和征集有潜质的开发者,定期免费放出windows build,再进行xbla版的开发。至于经济问题,小团队中的个人总是可以靠着少量contract工作或者外包工作持续下去。我想,拥有这样游侠式牛仔式的开发的心境的人,才是能开发出独立精神游戏的。

 

最后就是陈星汉的演讲了。 由于演讲的内容大部分我都事先通过thatgamecompany的其他演讲了解过,没有太多让人惊讶的部分,但我还是想在这里强调一下。陈星汉关于游戏情感表达的多样性,或者说情感光谱的多样性表达,是我深深赞同的一点。游戏还是一个很年轻的行业,游戏还缺乏很多它能表达的情感,也缺乏能让大多数人接受的游玩方式、体验。通常游戏是以empower给你力量来进行power fantasy的模式吸引玩家进行游戏。而这正是很多游戏通过再多的机制创新也无法挣脱的桎梏。而陈的理念是,游戏将经历类似电影早期发展的模式,经历以新技术为卖点,感官刺激为卖点的时代,发展为一个为绝大多数人接受的媒体。我无法反驳这一点,这种潮流在我看来,就像90年代卡马克的3D引擎对游戏业产生的冲击一样,将会主导21世纪第二个十年内的游戏。而且对于social network,陈也觉得目前的互动过于粗陋,没有将人与人之间的社交活动发展出应有的模样,这点也与我们一直在考虑的问题相近,只是我们无法形成他那样理论。不过就如何用游戏表达情感,并让更多的大众能接受这种游戏,陈没有给出答案,而我觉得这才是他们公司真正的核心所在。所以知道方向,但迷惑于如何达成目标,也是感到孤独苦闷的原因之一。

posted @ 2011-11-18 00:59 eygneph 阅读(65) 评论(1) 编辑

我从来都是个很凹凸的人。这不今天才看完WWDC 2010上乔布斯的keynote演讲。不得不佩服乔布斯那传说中的“现实扭曲场”,他把2小时的节奏把握得恰到好处,先是惯用的大量数字冲击、笼络开发者,随后iPhone 4的八个feature中处处埋藏着惊喜和启发式的demo,这种感觉自06年E3上Reggie的那场精彩Wii demo之后似乎就不曾有过了。

 

Game Center虽然不在昨天发布的iOS 4.0之中,但苹果的这一步无疑将iOS平台硬件真正变成了专业的游戏平台。我稍微看了一下2个关于Game Center的讲座,基本上它把match making,friends+invitation,in-game voice chat,p2p networking(API功能基本等同于DirectPlay/XNA)全都做了,所以Game Center = XNA + XDK Extension。


抛开Game Center,就以乔布斯演示的iOS 4 + iPhone 4的特性来说,我猜测今后的AppStore上会出现以下几种新应用:

1、大量更新颖的,基于Augmented Reality(AR)技术的应用。

由于引入了陀螺仪,iPhone 4称为一个真正的6轴系统,对于动作感知方面不可同日而语(非常简单并准确地orient the device, orient the virtual object)。加上高清的摄像API以及前后2个摄像头,麦克风,基于AR的应用可大大超越目前GPS+Compass+Google Map的套路。

2、全景照片。

由于有陀螺仪侦测旋转速度,完全可以做到目前DC(如SONY TX-7)的全景照片功能,无需像AutoStitch那样后处理拼接、变形。

3、基于全景照片或有地理信息的照片,开发用户创建内容游戏。

可以算作全景照片的分支。一张全景照片可以作为一个世界,在此基础上可以组合多种用户生成的内容。通过GPS设备,照片可以带有地理信息,加上6轴的朝向和镜头FOV,能辅助多张照片创建同一场景的point cloud(类似Photosynth,但有了地理和朝向信息应该更方便),也不失为一种用户创建内容。

4、基于摄像头游戏。

前置摄像头使侦测玩家动作成为可能,将会涌现一大堆类似EyeToy的游戏。还有些游戏不一定通过玩家“显式”的动作来进行,而可以侦测一些如头部摇晃,配合动作感应功能,相信会有很多可能性。再有,利用API转换前置或后置摄像头获取的图像/视频,说不定也可以增加或加强一些游戏的玩法。

5、眼睛控制的游戏。

这其实也是前面一个大类的细化,不过如果真的能做好,也不失为一种新奇的玩法。通过前置摄像头获取的影像信息,跟踪玩家的眼球,通过眼球的朝向移动信息,起到游戏内的控制功能。 

6、照明应用。

LED闪光灯如果可以API控制,将会出现更多的照明应用。 

 

暂时就想到这些。

 

posted @ 2010-06-24 02:17 eygneph 阅读(89) 评论(0) 编辑

拷贝或山寨在国内游戏界已经成为一种事实行业标准,投资人会告诉他的团队,我们要抄A游戏,因为他在X公司的财报中占据产品利润榜首。因为有了拷贝,投资人才有信心说他的产品也能红起来——因为他和行业老大拥有同样的feature。看上去这种做法没有问题,产品做到了和最大竞争对手一样(甚至超越)的功能,自然底气就足了。

 

问题在于,拷贝这种行为忽略了一种理解的过程——理解你和你的产品如何成长的过程。创造一个好产品,你必须理解这东西为什么是这样,而为什么不是那样。如果你只是把那层皮拷贝下来,你只是做到了把表面最光鲜的那一层东西剥离下来贴在自己脸上,但底下这个产品是如何成长起来的,你完全没有概念。原创的作者在“台下十年功”,换到你看到的“台上十分钟”,而很多人却只知道把那十分钟拷贝下来,须知那十年功夫不是白给的。另外一个问题是被动。如果你拷贝别人,你的大量注意力会放在你的那个被你拷贝的企业,你永远是个跟随者而很难一跃成为领导者——因为你现在搞出来的那玩意儿,已经是别人玩剩下的,在别人制定的游戏规则下,你还能有多少生命力呢? 

 

再看许多国内的游戏外包公司,一直喊着要转型转型转型,做原创原创原创,但真正出来产品的有几个呢(更不用说好的产品了)?他们不明白游戏的迭代迭代再迭代的雕琢过程,而一心只是快点做完一个单子再接另一个单子。所以这种只从事单一的生产外包企业,很难出现具创造性的自主产品。好比是富士康的工厂,再如何优化资源或善待员工,也无法成为像Apple或者Google那样伟大的企业。

 

以上部分思想来自于37signals的Rework一书。详见:http://37signals.com/rework/ 

posted @ 2010-06-14 20:12 eygneph 阅读(48) 评论(1) 编辑

“伟大的创业者的共同特点就是他们为他们的产品痴迷,不是有兴趣,不是了解,而是痴迷。” http://www.businessinsider.com/brad-feld-my-obsession-with-the-product-2010-5

 

摘自李开复的微博,共勉之。 

posted @ 2010-05-15 03:26 eygneph 阅读(43) 评论(0) 编辑

原文地址:http://tomfulp.newgrounds.com/news/post/78053 


我在Castle Crasher上花的时间越长,我睡觉的时间越短。它开始将我的作息时间从早8点-晚8点调整到早8点-晚12点⋯⋯整个周日工作之后,我回到家收到一堆的PM,但我还不能睡,因为留下这么多工作没做完就睡觉让我觉得有罪恶感,于是我又回到了办公室并且一直工作到周一晚上。今天的作息时间是早7点-早1:30。总是这样,我最终回到了家,趴在床上⋯⋯努力地放松自己的头脑⋯⋯感觉马上要睡着了,但很快又睡不着。于是爬起来,要么回办公室,要么坐在家里拿着笔记本,把一些想法记录下来留给明天做。

 

而制作Castle Crasher这件事本身就像让自己睡觉。某一刻你觉得差不多做完了,但那时你的大脑开始飞速思考,各种想法开始喷涌而出,你压根无法控制,突然你发现其实目前的进度离理想状态还有十万八千里。不过我必须这样做,因为这是让游戏变得好玩的唯一途径。有人称这种现象为scope creep(译注:即在开发过程中对于目标的经常性更改,这是种糟糕的情况),但我们现在确实有一个清晰的项目定义,我们只需跟着这个定义走,但同时不丢弃任何我们日后可能为之后悔的要素。

 

制作游戏机平台的Alien Hominid的经历让我觉得,这辈子只会做一次这种项目,不仅机会只有一次,而且对于我的心智承受能力来说,也只能做一次。但看看现在,15个月后,我们告诉自己,下一个游戏将会是一个更简单的游戏——但那只是讲讲而已。下一个游戏总是更大更强,要不然你就退步了。Castle Crasher自然是个更强大的游戏。


译后记:凌晨3:20感觉睡下去也不会很快睡着,于是有了这篇翻译。很多人看到Castle Crasher在XBLA上的风光,但很少人去想了解behemoth作为一个独立开发者背后的艰辛。这篇日记让我想起在以前公司里和千里马肝一起工作的日子。而我在不久的将来也会走上类似的道路。如果你也是这样对开发游戏而痴迷的人,请与我联系。


posted @ 2010-05-15 03:20 eygneph 阅读(182) 评论(2) 编辑

李开复在VentureBeat采访中提到中国创业者的5个问题,其中至少3个和中国文化有关。Education gap,中国的教育不鼓励创业;Parents trap,父母保守观念的阻碍;Failure is not an option,中国文化对失败的零容忍态度。基于上述3个观点,it starts with people,找对人就是第4个要点。

有链接有真相:http://venturebeat.com/2010/04/27/5-insights-about-chinese-startups-from-former-google-china-president-kai-fu-lee/

posted @ 2010-05-04 00:35 eygneph 阅读(51) 评论(0) 编辑

我用cocos2d iphone作为我的iPhone/iPad游戏已经有一阵子了。cocos2d iphone是个经过考验的、方便使用的引擎,而且让你几乎可以很快地进行gameplay方面的开发。最近它加入了iPad的支持。然而,Apple对于iPad游戏的审批似乎比iPhone更严格了一些。因为iPad Human Interface Guideline中对于朝向敏感方面,对开发者做出了更高的要求。

鉴于以上原因,我准备让我的游戏变得对朝向改变更友好一点。在cocos2d iphone中,朝向的改变可以用注册UIDeviceOrientationDidChangeNotification事件后,再调用一些CCDirector的方法予以解决: 

 

代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
        
// Enable orientation detection
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    
// Register orientation detection
    [[NSNotificationCenter defaultCenter]
     addObserver:self selector:@selector(orientationDidChanged:) name:
@"UIDeviceOrientationDidChangeNotification" object:nil];
         ......
}
-(void) orientationDidChanged:(NSNotification*)notification
{
    UIDeviceOrientation orientation 
= [[UIDevice currentDevice] orientation];
    [[CCDirector sharedDirector] setDeviceOrientation:(ccDeviceOrientation)orientation];
}

 然而,这个朝向的改变是很生硬的,没有任何切换动画。在做了一些功课之后,我决定自己写点代码搞定它。其实cocos2d中的朝向处理代码也没做什么事,无非就是调了一些必要的OS函数和坐标系转换。

所以我是这么做的:把CCDirector.applyLandscape里的所有gl调用都替换为CGAffineTransform的调用,而CGAffineTransform是可以根据时间插值的。最后把CGAffineTransform的矩阵转换为gl的矩阵:

代码
CGAffineTransform CGAffineTransformInterpolate(const CGAffineTransform *t0, const CGAffineTransform *t1, float factor)
{
    
// clamp factor to [0, 1]
    if ( factor > 1 )
        factor 
= 1;
    
if ( factor < 0 )
        factor 
= 0;

    
return CGAffineTransformMake(t0->a*(1-factor) + t1->a*factor,
                                 t0
->b*(1-factor) + t1->b*factor,
                                 t0
->c*(1-factor) + t1->c*factor,
                                 t0
->d*(1-factor) + t1->d*factor,
                                 t0
->tx*(1-factor) + t1->tx*factor,
                                 t0
->ty*(1-factor) + t1->ty*factor);
}

// in your CCDirector.m:

- (void) setDeviceOrientation:(ccDeviceOrientation) orientation
{
    
if( deviceOrientation_ != orientation ) {
        deviceOrientation_ 
= orientation;
        targetTransform_ 
= CGAffineTransformIdentity;
        elapsedSinceLastOrientationChange_ 
= 0;

        CGSize s 
= [openGLView_ frame].size;
        
float w = s.width / 2;
        
float h = s.height / 2;

        
switch( deviceOrientation_) {
            
case CCDeviceOrientationPortrait:
                [[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationPortrait animated:NO];
                
break;
            
case CCDeviceOrientationPortraitUpsideDown:
                [[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationPortraitUpsideDown animated:NO];

                targetTransform_ 
= CGAffineTransformTranslate(targetTransform_, w, h);
                targetTransform_ 
= CGAffineTransformRotate(targetTransform_, CC_DEGREES_TO_RADIANS(180));
                targetTransform_ 
= CGAffineTransformTranslate(targetTransform_, -w, -h);
                
break;
            
case CCDeviceOrientationLandscapeLeft:
                [[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationLandscapeRight animated:NO];

                targetTransform_ 
= CGAffineTransformTranslate(targetTransform_, w, h);
                targetTransform_ 
= CGAffineTransformRotate(targetTransform_, -CC_DEGREES_TO_RADIANS(90));
                targetTransform_ 
= CGAffineTransformTranslate(targetTransform_, -h, -w);
                
break;
            
case CCDeviceOrientationLandscapeRight:
                [[UIApplication sharedApplication] setStatusBarOrientation: UIInterfaceOrientationLandscapeLeft animated:NO];

                targetTransform_ 
= CGAffineTransformTranslate(targetTransform_, w, h);
                targetTransform_ 
= CGAffineTransformRotate(targetTransform_, CC_DEGREES_TO_RADIANS(90));
                targetTransform_ 
= CGAffineTransformTranslate(targetTransform_, -h, -w);
                
break;
            
default:
                NSLog(
@"Director: Unknown device orientation");
                
break;
        }
    }
}

-(void) applyLandscape
{
    
static float m[16];

    
if ( elapsedSinceLastOrientationChange_ < 0.25f )
    {
        currentTransform_ 
= CGAffineTransformInterpolate(&currentTransform_, &targetTransform_,
                                                         elapsedSinceLastOrientationChange_ 
/ 0.25f);
        elapsedSinceLastOrientationChange_ 
+= dt;
    }
    
else
    {
        currentTransform_ 
= targetTransform_;
    }

    CGAffineToGL(
&currentTransform_, m);
    glMultMatrixf(m);
}

 

 现在,cocos2d的朝向处理就可以有漂亮的切换动画了。我把patch文件上传了,如果有兴趣的话可以下载看看。我是基于cocos2d iphone 0.99.0的代码做的。

 

posted @ 2010-05-04 00:27 eygneph 阅读(315) 评论(0) 编辑
摘要: 活到现在,总结2条:1、形成自我(包括原则、性格、是非标准、个人好恶等等)。2、根据形成的自我,要活在自己的生命里(而不是活在别人的生命里)。时间紧迫,生命有限,自强不息。阅读全文
posted @ 2010-04-04 00:14 eygneph 阅读(107) 评论(3) 编辑
摘要: 换人了换人了~其一:http://games.solidot.org/article.pl?sid=09/10/10/0958242&from=rss在文化部发布公文称“网络游戏不是出版物,文化部是网络游戏的主管部门”之后,新闻出版总署发出通知《关于贯彻落实国务院〈“三定”规定〉和中央编办有关解释,进一步加强网络游戏前置审批和进口网络游戏审批...阅读全文
posted @ 2009-10-20 12:50 eygneph 阅读(171) 评论(0) 编辑
摘要: Your time is limited, so don't waste it living someone else's life. Don't be trapped by dogma — which is living with the results of other people's thinking. Don't let the noise of others' opinio...阅读全文
posted @ 2009-10-19 16:32 eygneph 阅读(50) 评论(1) 编辑