Category Archives: Coding - Page 2

游戏开发牛书推荐

在看一本叫 Programming Game AI By Examples 的书
(本来打算买实体书的,后来想想不能破例,还是down了本电子书 “)
看完第二章后彻底折服了 ,写的这么好的书真是不多见的
这才是真正的设计模式 ,寥寥几行代码就把整个世界给建模了
结构异常清晰,细节异常周到 堪称完美的作品
自己曾设计了不少不成型的东西,这次能见大师级别的代码确实收获颇多。
觉得一下子成长了不少。
而且最兴奋的是发现许多设计上的结构在许多地方都是雷同的
包括 Objective-c ,Box2d ,之前还一直觉得 box2d 使用起来还真是繁琐
创建一个对象还得先 ref 后才能创建

简单的说设计模式就是通过规范的设计和规范的代码(当然带来的结果是繁琐的代码会多了不少)带给清晰的结构和逻辑。在代码和功能越来越多时便显的尤其重要了。

在虚拟机里面把书上的例子全跑了一遍,决心花半年时间把所有东西消化,这些demo太吸引人了。

我的终极目标是做一个架构师,不只是用户,程序员也会使用我的产品。努力奋斗,会来的。:)

需要电子书的朋友网上自行搜索把,很多资源的,官网并提供源码和例程下载。

小试Unity游戏引擎

大四第一学期曾在学校的数字媒体实验室工作了很短时间,第一次看到现场手绘,maya做动画,zbrush绘制高模,倍感荣幸。

其中还有部分人在把弄一个游戏引擎(忘记叫什么名字了),可以让机器人在里面蹦蹦跳跳的走路。

那一刻让我想起第一次玩准3D游戏「生化危机II」的场景,震撼,鸡东的整个人在颤抖。

随着年龄的增长,对游戏的感觉也从狂热渐渐变成消磨时间,甚至忘记了小时候的梦想。

第一次游戏行业距离我这么近,却因为心有余而力不足放弃了。

回到标题上,自从 Unity 推出了免费版后,蠢蠢欲动,今天终于下载把玩了下。

一打开默认有个island的项目,场景做的很细腻,令我惊讶的是点击运行无需等待即可在场景中测试,很棒。

一遍看教程一遍开始了第一个测试项目。专业词汇挺多,没法像看程式书那样一下子就消化一堆。

最后还是不费力的做好了第一个场景,放了个对象在自己的小岛上跑了一圈,incredible! 简直想象不到眼前的居然是我做的。hohoho

暂时对Unity的感觉是,很简单,很高效,而且做出来的效果比我想象中好很多,顺便说说它使用的脚本语言 Unity JavaScript ,但是我怎么看也和我的老朋友 ActionScript3 更相似些 ,好处是可以少浪费时间看新语法书了。

附xhan’s 终极防御要塞。

bird-view

这里是更多图片

Read more »

让iPhoneApp发送带图片附件的邮件

更新(Nov 9,2009):

在3.0系统中,sdk 提供了 MFMailComposeViewController 来显示发件界面,并提供附件功能。

if ([MFMailComposeViewController canSendMail])
{
MFMailComposeViewController *mcvc = [[[MFMailComposeViewController alloc] init] autorelease];
mcvc.mailComposeDelegate = self;
[mcvc setSubject:@"Here's a great photo!"];
NSString *body = @”<h1>Check this out</h1><p>I selected this image from the <code><b>UIImagePickerController</b></code>.</p>”;
[mcvc setMessageBody:body isHTML:YES];
[mcvc addAttachmentData:UIImageJPEGRepresentation(image, 1.0f) mimeType:@"image/jpeg" fileName:@"pickerimage.jpg"];
[self presentModalViewController:mcvc animated:YES];
}

在程序中如何启动系统的Email程序并在内容中添加图片附件?
以下是代码:

- (NSString *) base64EncodingWithLineLength:(unsigned int) lineLength data:(NSData *)imgData {
static const char *encodingTable = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
const unsigned char *bytes = [imgData bytes];
NSMutableString *result = [NSMutableString stringWithCapacity:[imgData length]];
unsigned long ixtext = 0;
unsigned long lentext = [imgData length];
long ctremaining = 0;
unsigned char inbuf[3], outbuf[4];
short i = 0;
short charsonline = 0, ctcopy = 0;
unsigned long ix = 0;
while( YES ) {
ctremaining = lentext - ixtext;
if( ctremaining &lt;= 0 ) break;
for( i = 0; i &lt; 3; i++ ) {
ix = ixtext + i;
if( ix &lt; lentext ) inbuf[i] = bytes[ix]; 			else inbuf [i] = 0; 		} 		 		outbuf [0] = (inbuf [0] &amp; 0xFC) &gt;&gt; 2;
outbuf [1] = ((inbuf [0] &amp; 0x03) &lt;&lt; 4) | ((inbuf [1] &amp; 0xF0) &gt;&gt; 4);
outbuf [2] = ((inbuf [1] &amp; 0x0F) &lt;&lt; 2) | ((inbuf [2] &amp; 0xC0) &gt;&gt; 6);
outbuf [3] = inbuf [2] &amp; 0x3F;
ctcopy = 4;
switch( ctremaining ) {
case 1:
ctcopy = 2;
break;
case 2:
ctcopy = 3;
break;
}
for( i = 0; i &lt; ctcopy; i++ )
[result appendFormat:@"%c", encodingTable[outbuf[i]]];
for( i = ctcopy; i &lt; 4; i++ ) 			[result appendFormat:@"%c",'=']; 		 		ixtext += 3; 		charsonline += 4; 		 		if( lineLength &gt; 0 ) {
if (charsonline &gt;= lineLength) {
charsonline = 0;
[result appendString:@"\n"];
}
}
}
return result;
}
- (void) emailButtonPressed:(id)sender {
NSString *body = @"";
NSData *imageData = nil ;
NSString* dataStr = nil ;
for (PhotoItem* item in _photoBoardView.itemsSelected) {
imageData = UIImageJPEGRepresentation(item.photo.image.image,0.9);
dataStr = [self base64EncodingWithLineLength:0 data:imageData];
body = [body stringByAppendingFormat:@"<strong><img src="data:image/jpg;base64,%@" alt=" image" /></strong>",dataStr];
}
body = [body stringByAppendingString:@""];
NSString *encoded = [body stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *atitle = [[@"" stringByAppendingFormat:@"title: %@", @"Image "] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString * urlString = [@"" stringByAppendingFormat:@"mailto:%@?subject=%@&amp;body=%@", @"",atitle, encoded];
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlString]];
}

关于“字节序”

昨天纠正了长达几年的关于字节序的错误理解。

受到移位操作符的影响,一直认为在内存中数字的保存方式和显示的一样,比如一个2直接的short 9 ,保存在内存中应该是:

00 09 这种形式,因为这样移位才说的通。 否则如果按照低字节优先的方法 09 00 右移位就会出乱子了~

结果昨天研究和服务器socket通讯的例子中 发现了个陌生函数 :htonl  。

man (越来越喜欢命令行了)后发现是 host to network long(short) 的缩写 ,这下彻底困惑了。难道 c 在内存中的数据不是想象中的那样?

最后K大侠亲自上阵,示范了使用GDB debug ,也帮我验证了我多年的错误观点:

#include <stdio.h>
int main()
{
 int a = 8;
 char *p;
 p= (char*)&a;
 a = a>>1;
 char *k = &a;
 return 0;
}
  • gcc -g test.c   # -g 添加调试
  • gdb test.out   # init
  • b main          # add breakpoint at main function
  • run                 # just run until breakPoint occured
  • n                    # next

逐次打印出 p 指针的值 p *(p++)   , 发现果然是地位在最前面的。
不过对于移位操作就困惑了,难道这个操作不是直接在内存操作的?难道是先转成高位优先然后移位再转回来? Read more »

[iPhone]播放midi文件

iPhone 默认不带播放MIDI的框架,所以播放MIDI还得寻求第3方的库帮忙。

这里使用的库就是大名鼎鼎的 FMOD ,许多火爆游戏使用的都是这个库。开发者可以免费下载使用。

首先下载安装 FMOD API FOR IPHONE:
http://www.fmod.org/index.php/release/version/fmodapi42607iphone-installer.dmg

安装后可以在目录中看到不少示范代码,可惜没有MIDI。

自己写一个:)
感谢强大的api,写起来异常轻松。

  • 新建一个基于view项目
  • 修改项目属性,添加 Other Linker Flags 为 -lfmodexL_$PLATFORM_NAME
  • 添加 Header Search Paths :/Developer/FMOD\ Programmers\ API\ iPhone/api/inc  (默认是这个位置,修改成自己FMOD安装的目录)
  • 添加 Library Search Paths :/Developer/FMOD\ Programmers\ API\ iPhone/api/lib (同上)
  • 把 appDelegate 修改成 .mm 的后缀
  • MIDI 播放需要一个 DLS 文件, 在osx 下没找到,这里使用了xp 自带的 gm.dls 文件(3M 有点大~),拷贝到项目中。
  • 修改ViewController 代码如下 ,随便在xib文件中链接两个按钮action上即可
  • 运行(真机有效)

主要源码: Read more »

命令行的伟大

曾经用Ruby 写了个脚本用来统计项目中文件行数,没事打发下时间顺便满足下小小的虚荣感。

发于cocoaChina论坛中(http://cocoachina.com/bbs/read.php?tid-8266.html)。

结果惨遭鄙视。

原来用 bash 一句话就可以搞定 !(用Ruby还写了那么多代码~悲剧了~)

find . -name '*.m' -exec cat {} \; | wc -l
find . -name '*.h' -exec cat {} \; | wc -l
find . -name "*.m"  |xargs wc -l

掌握一些常用命令还是很能提高工作效率的。学习中。