c4droid教程
c4droid吧
全部回复
仅看楼主
level 2
叜駣 楼主
以下本人这段时间玩c4droid总结出来的经验,供大家参考
2013年10月13日 21点10分 1
level 2
叜駣 楼主
首先c4droid分3种模式
1. terminal 模式
2. sdl 模式
3. native activity模式
与2种编译方式
1. 将文件夹下所有源代码编译
2.makefile
2013年10月13日 21点10分 2
level 2
叜駣 楼主
从terminal 模式说起,一般来说,教科书上的习题,terminal application,或是编译library可以用这个模式,当然,在编译之前要打开设置,并调整default mode arguments。
教科书习题和terminal application很容易编译,甚至不需要改设置,所以略过。
而library的编译,虽然c4droid胜任自定义编译,但对于大多第三方library,比如xvid,curl等等,我更偏向于cross-comping,也就是在其它作业系统中使用ndk编译,要知道sdcard是个极其蛋疼的存储环境,安卓方面也把权限卡得死死的,以至于./configure时出现permission denied的错误
2013年10月13日 21点10分 3
level 2
叜駣 楼主
sdl模式是个好玩的东西,得花些时间说下这个
我通过sdl将我做的rpg游戏直接移植了过来,因为采用的是纯软件渲染模式,所以对sdl的关键依赖只有输出像素与io
我把几条关键指令与type列举出来供大家参考:
1.SDL_Surface:这个是视频输出核心,
SDL_Init(SDL_INIT_EVERYTHING) :这是初始化口令,当然,不只是初始化了视频
SDL_SetVideoMode(w, h, c, SDL_HWSURFACE|SDL_FULLSCREEN):这是开窗口令,arg1是宽,arg2是高,arg3是
bp
p, 当然开窗时默认就是全屏的,所以第arg 4 可以不计,值得一提的是,经过反复调试,我发现宽,高要在你输出图像的目标分辨率基础上再+1,比如你要输出640x480, 就要 SDL_SetVideoMode(641, 481, c, SDL_HWSURFACE|SDL_FULLSCREEN),原因不明。
SDL_MapRGBA()这是采色指令,将rgba值按surface的format进行转换,成为uint32
而像素上屏的话,直接改动SDL_Surface的pixels成员即可,注意,与opengl不同的是,sdl采取的是上小下大的y方向
2.SDL_Event:这个是io核心
SDL_PollEvent(event):拉取事件到SDL_Event evt
根据 evt.type判断io类型,一般来说,要用的其实只有一种,就是按键:
SDL_KEYDOWN
用evt.key.keysym.sym 可以查出ascii值,比如"a"表示的是a键按下
SDL_GetMouseState(&x, &y):光标x,y存储,安卓的光标其实和windows的一样,只有一个,不过x,y是通过手的滑动来改变,本来是看不见的,但数值的确是对的,查鼠标左/右/中键状态的话,要用
SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(1):左
SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(2):右
SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(3):中
设定光标x,y,要用到的是:
SDL_WarpMouse(x,y);
我在一个panorama viewer的工程中采取了这个口令达到类似于fps游戏的camera效果
当然还有 buffer swapping口令与清屏口令,它们是
SDL_Flip(surface):buffer swapping
SDL_FillRect(surface, NULL, 0x000000):清屏
2013年10月13日 21点10分 4
level 2
叜駣 楼主
sdl声音:声音方面我也尝试了一下,本想编译openal for android的,可惜与源码c4droid工作原理有冲突,所以失败了,我转而采用了sdlmixer+ogg输出声音
只有几个简单的口令,所以openal里的3d声源,回响,多普勒效应 都没有了,或者说,这些只能用自己去实现了:
Mix_OpenAudio(44100, AUDIO_S16, 2, 4096):打开设备 (44100赫兹,16bit,2声道,4096 缓冲区)
Mix_LoadWAV(file):读取声音文件
Mix_PlayChannel:播放声道
Mix_HaltChannel:停止声道
网络:c4droid支持socket编程,所以纲络方面就不要用sdl了,直接用socket写协议即可实现ip通讯,当然也可以cross-compile 一些库实现一些常用的协议,比如 libcurl
native activity模式:这个模式是最底层的,当然可以玩的东西也是最多的,速度更是相当的快
但是由于牵扯到太多安卓方面的乱七八糟的玩意,我自己也还在弄wrapper,就不多讲了。c4droid中也有一个cube的示范可以用来参考。当然opengl还是要熟练掌握的,这才是native activity的重头戏。
2013年10月13日 22点10分 5
level 2
叜駣 楼主
最后说下sdl与native activity的一些编译细节
打开c4droid时,下面会有编译按钮,长按会出现窗口
第一个选项是把所有文件编译成一个程序,因为比较简单所以是默认模式
但是也很不方便,改动library需求关系时,要进入设置中,改动sdl mode arguments 或 nativeactivity mode arguments, 而我们知道,不同的程序有不同的需求,不可能每个程序都“全部带上”,改动起来又太麻烦,常用的shell脚本编译又被万恶的安卓禁止了
所以我推荐选第二项:Use Makefile,然自已写一个makefile,放到工程目录下
编译即可,makefile的帮助有很多,我提供一个最简单例子:
all:
$(CC) main.c -lSDL -I.
这个是makefile文件的内容,记得要在$(CC)前加tab,这样名为main.c的源代码就能编译出来了,main.c依存的是sdl库,cc将在当前目录中搜header,因为$(CC)常量在c4droid中已经设定了,所以不用担心小的参数,比如 -WFatal-Errors。
要切记的一点,在makefile设定窗中,result binary filename 一定要填,不然编译时会出现,failed to copy file的错误,而在nativeactivity 下编译时,要填上a.out,不然也会出错
好了,就写到这了,希望对大家有帮助
2013年10月13日 22点10分 6
在nativeactivity 下编译时,要填上a.out 这里改动一下,如果gcc用了 -o xxx的话,需要填上xxx,而不是a.out
2013年10月13日 22点10分
level 9
好极了,帮顶[大拇指]
2013年10月13日 22点10分 7
level 7
不错。
2013年10月14日 00点10分 8
level 12
root也不行吗
2013年10月14日 00点10分 9
没root不能装c4droid的,因为include和lib在/data/data中 我是在root状态下执行./configure的,就算拷到/data/local/root还是不行,这和安卓蛋疼的sdcard权限有关,这一点iphone比安卓好多了。就算可以改权限,我也懒得查口令了,也不知道乱改会不会出个三长两短。反正ndk可以交叉编译来的
2013年10月14日 01点10分
话说回来,要是能直接chmod 777的话,那该有多好啊[滑稽]
2013年10月14日 01点10分
回复 叜駣 :在电脑上把sdcard格式化成NTFS,在手机上用Paragon Disk Manager(好像是这个名字)可以挂载,可以设置777
2014年04月20日 10点04分
回复 叜駣 :呃……我建议找一张以前的不用的卡。手机有OTG最好,格式化成NTFS也可以用
2014年04月20日 10点04分
level 9
[滑稽][滑稽]
2014年04月20日 12点04分 10
level 9
新手,谢楼主
2014年04月21日 02点04分 11
level 7
顶一个
2014年04月21日 04点04分 12
level 11
赞一个
2014年04月21日 10点04分 13
level 6
好牛,我问一下,学c4有什么书介绍一下
2014年04月21日 11点04分 14
level 10
新手顶
2014年04月21日 12点04分 15
level 9
楼主id怎么念???
2014年04月21日 13点04分 16
1