android模拟器运行cocos2d-x 2.0.4

从cocos2d-x 2.0之后,就改用OpenGL ES 2.0,但是android模拟器直到4.0.3版本开始才支持ES 2.0,所以需要新建一个高于4.0.3的模拟器

记得勾选那个Use host GPU

如果你确信你程序没有错,android配置也没有错,模拟器设置也没有错,但是一运行模拟题就提示unexpected error,那么请换新版本的NDK

我搞了一天死去活来查了无数资料,虽然我用的NDK-r7可以在真机运行,但是一到模拟器就妥妥的出错,完全不知道为什么,最后随手下了个新版NDK-r8一编译,立刻就运行了……

此刻真是千万只草泥马在心中奔腾啊

Tagged

mac下编译运行Cocos2d-x 2.0.4 android

由于从2.0.3开始,cocos2d-x把libcocos2dx从每个android项目中单独挪了出来,放在了{你的cocos2d-x源代码位置}/cocos2dx/platform/android/java,所以在eclipse中导入android项目后,都需要import这个位置的lib项目进来,不然都会提示找不到libcocos2dx

导入libcocos2dx如果报错,如下图

libcocos2dx需要JRE 1.6版本,mac默认就有,我是lion系统,终端输入java -version,提示1.6版本

右击libcocos2dx,选择属性,从java compiler选项卡里选择compilance level为1.6,然后就无错可以继续编译运行了

Tagged ,

App Store介绍页面默认语言对app销售的影响

在2个月之前,app store还不能改app的默认语言,如果账号一开始设定错了,就像我选了简体中文,是没办法改成English的。

我之前也在想,用简体中文的介绍会对销售影响差多少,但是一直没有机会对比。一是当时没有办法修改语言,二是可以我也不舍得那好项目这么折腾。

这次跟人人游戏合作,把我之前的一个游戏给他们代理,由于中间一些波折,最后这个游戏以简体中文介绍的方式上线了,我一查排名,除了中文地区的有进入前200的大小各榜单,其他英文地区完全无记录,搞得我差点以为是限定了销售区域。今天特地上app store的美国区搜《艾米莉的衣橱》,确认美国区也有,相比我自己原来那个版本在第一次上线的时候,在泰国区还进入过Free Top 10,其他区大概也有不错的名字,这次的排名就相差太多了,而且我自己的那版一点推广都没有做。

虽然第一次的排名可能略有运气,但是粗略参考,这差距实在是有点明显啊

自学绘画书籍推荐

由于决心开启绘画新天赋树,所以最近收集了一些自学的入手书籍。由于还没看完,所以我就先说一点

其中最好的就是The New Drawing on the Right Side of the Brain,虽然内容以绘画入手,实质上你可以当半本心理学的消遣书看。书上详细地阐述了左右脑在认识以及功能上的区别,读完再对比长期以来我们社会教育对逻辑的左脑的偏重、对负责抽象右脑的忽视,你会对很多问题更有感触。所以,即使不想深入学绘画,此书依旧是本不错的拓展认知的好书

ShareKit设置Localize无效的解决方法

由于新App需要分享到各大网站,所以用了ShareKit这个开源库。为了广大中文用户,所以要对菜单名称等进行本地化语言处理一下。新版本的ShareKit自带了Localize的string文件,本以为可以直接使用,结果无论是模拟器还是真机测试,中文信息都无效…

查了好久完全不知道怎么回事

解决方法很简单

删掉自带的Localizable.strings文件,然后重新自己一一建立,立刻就解决

具体原因不解,但是删掉自己重来很管用

Tagged

Cocos2D中实现截图功能

在Cocos2D中截图有2种方法

  • 从OpenGL的显示数据中直接获取,这样可以截取整个屏幕显示的结果,类似Home+Power的效果
  • 使用CCRenderTexture可以单独设定特定的Sprite或者CCNode进行截取保存

OpenGL截取整个屏幕

需要对CCDirector进行Category扩展,加入以下两个文件

CCDirector+ImageSave.h

#import <Foundation/Foundation.h>
#import "cocos2d.h"

@interface CCDirector (ImageSave)

- (UIImage *)screenShotUIImage;
- (CCTexture2D *)screenShotTexture2D;

@end

CCDirector+ImageSave.m

#import "CCDirector+ImageSave.h"

@implementation CCDirector (ImageSave)

- (UIImage*) screenShotUIImage {
CGSize size = [self displaySizeInPixels];
//Create un buffer for pixels
GLuint bufferLenght=size.width*size.height*4;
GLubyte *buffer = (GLubyte *) malloc(bufferLenght);

//Read Pixels from OpenGL
glReadPixels(0,0,size.width,size.height,GL_RGBA,GL_UNSIGNED_BYTE,buffer);
//Make data provider with data.
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, buffer, bufferLenght, NULL);

//Configure image
int bitsPerComponent = 8;
int bitsPerPixel = 32;
int bytesPerRow = 4 * size.width;
CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
CGImageRef iref = CGImageCreate(size.width,size.height,bitsPerComponent,bitsPerPixel,bytesPerRow,colorSpaceRef,bitmapInfo,provider,NULL,NO,renderingIntent);

uint32_t *pixels = (uint32_t *)malloc(bufferLenght);
CGContextRef context = CGBitmapContextCreate(pixels, [self winSize].width, [self winSize].height, 8, [self winSize].width*4, CGImageGetColorSpace(iref), kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);

CGContextTranslateCTM(context,0, size.height);
CGContextScaleCTM(context, 1.0, -1.0);

switch ([self deviceOrientation]) {
case CCDeviceOrientationPortrait:
break;
case CCDeviceOrientationPortraitUpsideDown:
CGContextRotateCTM(context, CC_DEGREES_TO_RADIANS(180));
CGContextTranslateCTM(context,-size.width, -size.height);
break;
case CCDeviceOrientationLandscapeLeft:
CGContextRotateCTM(context, CC_DEGREES_TO_RADIANS(-90));
CGContextTranslateCTM(context,-size.height, 0);
break;
case CCDeviceOrientationLandscapeRight:
CGContextRotateCTM(context, CC_DEGREES_TO_RADIANS(90));
CGContextTranslateCTM(context,size.width*0.5, -size.height);
break;
}
CGContextDrawImage(context, CGRectMake(0.0, 0.0, size.width, size.height), iref);
UIImage *outputImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)];

//Dealloc
CGDataProviderRelease(provider);
CGImageRelease(iref);
CGContextRelease(context);
free(buffer);
free(pixels);

return outputImage;
}

- (CCTexture2D*) screenShotTexture2D {
return [[CCTexture2D alloc] initWithImage:[self screenShotUIImage]];
}

@end

使用的时候,如下就可以保存图片

#import "CCDirector+ImageSave.h"

/*
...
...
*/

UIImage *screenshot = [[CCDirector sharedDirector] screenShotUIImage];
NSString *savePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Screenshot.png"];
[UIImagePNGRepresentation(screenshot) writeToFile:savePath atomically:YES];

CCRenderTexture截图部分CCNode图象

CCRenderTexture是Cocos2D定义的类,所以直接使用吧

// 设定截图大小
CCRenderTexture  *target = [CCRenderTexture renderTextureWithWidth:320 height:480];
[target begin];

// 添加需要截取的CCNode
[someNode visit];

[target end];
NSString *savePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Screenshot.png"];
[target saveBuffer:savePath format:kCCImageFormatPNG];
Tagged ,

自己iMac 27寸用过的几个鼠标

其实iMac自带了Apple Magic Mouse,如果你电脑使用频率低,要大概凑合也不是不可以,但是由于iMac 27寸的分辨率高达2560*1440,magic mouse在没有外加软件调节仅靠系统设置的情况下,移动之慢简直令人发指。此外,MM的外形过于扁平,握着鼠标的时候手掌心会悬空,长期使用会使得手指酸痛。吹嘘的触控操作,其实尝鲜完之后会觉得也不过尔耳。总之,这个鼠标除了好看,基本没太多亮点。技术宅者为了健康,还是自重。

网上也有不少人推荐 罗技V470,一是蓝牙,可以不用多加一个接收器,二有白色款,配色跟iMac蛮搭的,本人不幸买了一个,iMac 21寸或者Macbook Air之流可能分辨率小,用起来还算顺畅,我自己的iMac 27,设置快速移动之后隐隐感觉移动掉帧,怎么甩都不舒畅,外加造型略微鼓起且非完全对称(适合右手鼠标),对于我这个左撇子的人来说,其实也不是很满意(右手凑合吧,但是没其他的手感好),重量适中,最大的问题其实就是掉帧了。

所以我最后被迫用回 罗技M215,要插入一个小小的USB接口的Nano接收器,手感还不错,价格异常便宜,我当初花80大洋左右入手,只是颜色不搭,外貌协会的童鞋考虑买个黑色的吧,至少不会像我蓝色的这么突兀。

如果你有更多的米买外设,果断买高端键鼠套装去吧。我当初纠结于一定要蓝牙的鼠标,这样可以省下一个USB接口,其实真没必要,iMac虽然只有4个USB,但是基本不会一次用满吧。要找一套蓝牙键鼠,选择非常少,现在大多都是2.5Ghz无线技术。果然不要蓝牙,其实就不会像我这么被坑了。

Core Data下如何分页查询数据

其实分页查询我第一反映是用SQLite的查询语句来操作,后来想想Core Data底层也是调用SQLite,应该也是可以分页查询的
不过iPhone开发毕竟中文资料不多,翻了下官方英文文档,找到下面的方法,主要使用下面两个函数

// 限定查询结果的数量
setFetchLimit
// 查询的偏移量
setFetchOffset

最近正在熟悉各种API,没太多时间,直接上代码,其实蛮简单的

	NSFetchRequest *request = [[NSFetchRequest alloc] init];
	NSEntityDescription *entity = [NSEntityDescription entityForName:@"RSSEntryModel" inManagedObjectContext:_managedObjectContext];
	[request setEntity:entity];
	NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"articleDate" ascending:NO];
	NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
	[request setSortDescriptors:sortDescriptors];
	[request setFetchLimit:21];
	[request setFetchOffset:_currentPage * 21];
	NSArray *rssTemp = [_managedObjectContext executeFetchRequest:request error:&error];

这里贴上一个教程http://www.raywenderlich.com/934/core-data-tutorial-getting-started,3个篇幅说得更加仔细
他blog里的教程都很棒,我基本都看了遍

Tagged ,

霹雳布袋戏在线播放收集

最近很不务正业的迷上了霹雳布袋戏,对于这种闽南语对白的剧集,的确有着先天的好感。想来多半是因为闽南语才是自己真正的母语,虽然不中用的自己其实有很多字词都不会说,而且感觉闽南语的延续也有些断层。一些书面语的字词,我这一辈的人多半是只能用普通话代劳,难以像外公那样,可以对着文章一字一音的朗读。

小时候对布袋戏并不热衷,即使在什么都好奇的年纪,木偶对我的杀伤力也远不如多啦A梦的口袋。以前就知道霹雳布袋戏剧情长的惊人,前几天搜了一下,立刻惊讶无言,从1984年至今,几十年未曾完结,这都已经可以比肩那些超长肥皂剧了。然而这么几十年来所有剧集所有角色的配音,居然都出自同一人——黄文择(霹雳孔雀令不是),实在是不得不服。就算你也和我一样一开始听着觉得鼻音很别扭,但是这样恐怖的实力,就算偶尔我听出熟悉的声音,我还是心服口服。

说起来大家说的霹雳布袋戏,指的是以素还真为主线,也就是《霹雳金光》开始的剧集,但是里面一些人物与黄俊雄时代的史艳文为主的《云州大儒侠》有一定的牵连,且在《霹雳金光》之前还有几部也是以“霹雳”作为前缀命名的布袋戏,对于一些人物的首次出场及典故,会有更多的交代。
所以,有这么复杂的关系,想知道霹雳布袋戏的全部剧集顺序,可以看wikipedia
至于黄氏三代的布袋戏风云史,可以看百度百科

由于实在是受不了有些人上传视频加了那么明显的水印,虽然没有他们的共享,也下不到剧集,但是那么频繁骚扰的水印是在是妨碍看戏的心情,所以我就开始收集一些网上的在线播放列表,一来省心,二来方便大家共享。若你真是喜欢霹雳布袋戏,有机会请支持正版DVD。

编号 名称 ( 集 ) 数 时间 播放地址
01 云州大儒侠 583 1970年 由电视直接播出
02 史艳文 不详 1975年 由电视直接播出
03 苦海女神龙 不详 1976年 由电视直接播出
04 忠勇小金刚 不详 1977年 由电视直接播出
05 七彩霹雳门 不详 1978年 由电视直接播出
06 霹雳震灵霄 不详 1979年 由电视直接播出
07 霹雳真象 不详 1980年 由电视直接播出
08 霹雳万象 不详 1981年 由电视直接播出
09 霹雳天网 不详 1982年 由电视直接播出
10 霹雳侠踪 不详 1983年 由电视直接播出
11 霹雳城 8 1984年 优酷
12 霹雳神兵 8 1985年 优酷(缺第1集)
13 霹雳金榜 8 1986年 优酷
14 霹雳震九宵 8 1987年 优酷
15 霹雳战将 8 1988年 优酷
16 霹雳金光 16 1988年06月 优酷
17 霹雳眼 20 1989年06月 优酷
18 霹雳至尊 15 1989年11月 优酷
19 霹雳孔雀令 10 1989年11月 优酷
20 霹雳剑魂 20 1990年01月 优酷
21 霹雳异数 40 1990年02月 皆是发行录像带
22 霹雳劫 30 1990年03月 皆是发行录像带
23 霹雳天阙 30 1990年06月 皆是发行录像带
24 霹雳紫脉线 20 1992年05月 皆是发行录像带
25 霹雳烽云 20 1993年04月 皆是发行录像带
26 霹雳天命 14 1993年11月 皆是发行录像带
27 霹雳狂刀 60 1993年12月 皆是发行录像带
28 霹雳王朝 30 1995年03月 皆是发行录像带
29 霹雳幽灵箭Ⅰ 25 1995年09月 皆是发行录像带
30 霹雳外传之叶小钗传奇 6 1996年02月 皆是发行录像带
31 霹雳幽灵箭Ⅱ 20 1996年03月 皆是发行录像带
32 霹雳英雄榜 50 1996年07月 皆是发行录像带
33 霹雳烽火录 30 1997年03月 皆是发行录像带
34 霹雳风暴 40 1997年07月 皆是发行录像带
35 霹雳狂刀之创世狂人 50 1998年04月 皆是发行录像带
36 霹雳雷霆 30 1999年02月 发行一集一片VCD
37 霹雳英雄榜之江湖血路 40 1999年07月 发行一集一片VCD
38 霹雳英雄榜之风起云涌Ⅰ 20 2000年03月 发行一集一片VCD
39 霹雳英雄榜之风起云涌Ⅱ 30 2000年07月 发行一集一片VCD
40 霹雳英雄榜之争王记 30 2001年01月 发行一集一片VCD
41 霹雳图腾 20 2001年05月 发行一集一片DVD
42 霹雳异数之龙图霸业 40 2001年08月 发行一集一片DVD
43 霹雳封灵岛 20 2002年04月 发行一集一片DVD
44 霹雳兵燹 48 2002年07月 发行一集一片DVD
45 霹雳刀锋 30 2003年01月 发行一集一片DVD
46 霹雳异数之万里征途 32 2003年06月27日 发行一集一片DVD
47 霹雳九皇座 50 2003年10月17日 发行一集一片DVD
48 霹雳劫之阇城血印 26 2004年04月09日 发行一集一片DVD
49 霹雳劫之末世录 24 2004年07月09日 发行一集一片DVD
50 霹雳皇朝之龙城圣影 40 2004年10月01日 发行一集一片DVD
51 霹雳剑踪 30 2005年02月18日 发行一集一片DVD
52 霹雳兵燹之刀戟戡魔录Ⅰ 30 2005年06月03日 发行一集一片DVD
53 霹雳兵燹之刀戟戡魔录Ⅱ 40 2005年09月16日 发行两集一片DVD
54 霹雳奇象 40 2006年02月03日 发行两集一片DVD
55 霹雳谜城 40 2006年06月23日 发行两集一片DVD
56 霹雳皇龙纪 50 2006年11月10日 发行两集一片DVD
57 霹雳皇朝之铡䶮史 30 2007年05月04日 发行两集一片DVD
58 霹雳开疆纪 40 2007年08月17日 发行两集一片DVD
59 霹雳神州 30 2008年01月04日 发行两集一片DVD
60 霹雳神州Ⅱ之苍玄泣 46 2008年04月18日 发行两集一片DVD
61 霹雳神州Ⅲ之天罪 48 2008年09月26日 发行两集一片DVD
62 霹雳天启 48 2009年03月13日 发行两集一片DVD
63 霹雳震寰宇之刀龙传说 40 2009年09月12日 全家便利商店发行
64 霹雳震寰宇之龙战八荒 40 2010年01月29日 全家便利商店发行
65 霹雳震寰宇之兵甲龙痕 40 2010年06月18日 全家便利商店发行
66 霹雳经武纪之枭皇论战 40 2010年11月12日 全家便利商店发行

自定义命令并在wow的界面设置列表中添加自己的插件

我们平时在WoW中按ESC键,从弹出的游戏菜单中选择“界面”,然后切换到“插件”标签,左边的列表可以看到一些插件名称,点击某一插件,可以在右边进行一些相应设置。

不过其实很多插件的功能设置会依靠聊天对话框输入命令来开启,或者在小地图上有个图标让你点,甚至干脆就没选项(比如我教程中写的那个),所以并不是所有插件都会添加到那个界面列表中。不过今天有人来问说,如何把自己编写的插件添加到这个菜单中去呢?

这里直接给出相关函数的说明链接
InterfaceOptions_AddCategory(panel)
http://wowprogramming.com/docs/api/InterfaceOptions_AddCategory

panel是frame类型,必须包含一个string类型name成员,也就是说,你至少要给这个frame定个名字,这样调用这个函数就可以添加自己插件的设置页面到列表中,并显示得出来。

老规矩,为了照顾新手,小写了一个只实现添加插件名字到列表中的代码,把代码下载解压扔到wow的插件目录下,进入游戏在界面中选择这个插件之后,右边只有一个按钮,随便按……没有任何功能。我还小加了段编写自定义命令的部分,输入/optiontest就可以直接开启设置页面。

[猛击我下载这个笨插件代码]

如果有人想问说,怎么自定义命令呢,有3个步骤

  1. 根据SLASH_{插件名字大写}{序号}格式,自定义命令的名称,可以不止一条,序号从1递增
  2. SlashCmdList[插件名字大写],指定插件的自定义命令对应的处理函数
  3. 编写处理函数

代码如下


SLASH_OPTIONTEST1 = "/optiontest";--添加自定义命令名称
SlashCmdList["OPTIONTEST"] = OptionTest_SlashCommand;--函数名其实随意

local function OptionTest_SlashCommand(msg, editbox)
--开启设置页面
InterfaceOptionsFrame_OpenToCategory(OptionTest.name);
end

需要特别注意的SLASH_OPTIONTEST1跟SlashCmdList[“OPTIONTEST”],你插件的名字在这里一定要大写(其他的插件也都这样写),我无从查起为何要这样,但是我试过改成小写均无效,谁来告诉我为嘛啊……
InterfaceOptionsFrame_OpenToCategory是开启我们前面提到的那个设置页面的函数,可以在WowProgramming查询详细资料。

Tagged ,