2010年12月16日 星期四

Compile OpenSSL for iPhone

Step 1:
下載OpenSSL代碼
Link : http://www.openssl.org/source/
我使用的是 openssl-1.0.0c 版本
openssl-1.0.0c.tar.gz
以下Step在MacOS下完成

Step 2:
使用OpenSSL代碼內的config進行設定
命令如下:
./config --openssldir="Compile後的lib路徑" no-asm
./config --openssldir=/Users/Kito/Desktop/openssl_ios/ no-asm


Step 3:
修改Makefile
找 CC= cc
改為CC= /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/gcc-4.2
(Mac OS的iPhone SDK平台GCC Compiler)

在CFLAG參數中找 -arch i386
改為 -arch armv6

在CFLAG參數開始位置加上嫁下參數:
-isysroot /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk
(Mac OS的iPhone SDK路徑)

找 SHARED_LDFLAGS=-arch i386 -dynamiclib
改為 SHARED_LDFLAGS=-arch armv6 -dynamiclib

找 PEX_LIBS= -Wl, -search_paths_firstxc
改為 PEX_LIBS= -Wl


Step 4:
修改代碼
本來完成以上Step已經可以進行Compile
不過這樣會有error發生,所以要修改代碼
開啟 "代碼文件夾/crypto/ui/ui_openssl.c" 這個檔案

static volatile sig_atomic_t intr_signal;
改成
static volatile int intr_signal;


Step 5:
Build Lib
完成Step 4之後,
就可以行makefile Build Libraries
make
make install

2010年11月2日 星期二

第二隻iPhone Game作品《國士無雙~亂世英雄篇~》 廣東13張麻雀 x 三國亂世

新作推介:
100%香港制作, 由 Adventure Hong Kong 開發 及由 PICK Technology Limited 提供廣東麻雀遊戲Engine. 三國 x 廣東麻雀遊戲 >> 國士無雙~亂世英雄篇~

下載連結:
http://itunes.apple.com/hk/app/id399449096



遊戲特色
● 正宗廣東麻將,三國入局
十三張的麻將,八隻花,正宗廣東牌規則特色,以三國背景入局,誓要為您締造不一樣的麻將感官遊戲── 國士無雙!此麻將結合多達35款不同變化胡型,好讓您隨著自己拿到的手牌來發揮智慧, 盡情運用各種技巧,以最快、最強、最靈活的手段,搶供對手的領域,在麻雀台上一較高下!且看三國英雄,誰領風騷!

● 分數決勝負,層層升級
遊戲會一直記錄著玩家的成就和排行,隨時可以秀給朋友看自己吃了多少次的「大四喜」、「九子連環」、「十八羅漢」等等。並以累積經驗升級,一齊來打天下、以分數定江山吧!

● 中國風畫面,別具風格
整個遊戲的畫面構圖以別具中國風的古雅風格呈現,使人眼前一亮。輕按麻將便會放大顯示,而其他碰上槓等常用指令,也製成大大的按鈕放到中間,讓您絕不會因點錯而叫冤。

黃巾之亂篇
東漢末年,皇帝年幼即位,親信宦官,疏遠忠臣,導致朝廷腐敗,百姓苦不堪言,張角創立太平道,聚眾起義,引發了亂世割據的局面......

討伐董卓篇
黃巾賊剿滅後,東漢元氣大損,靈帝駕崩,宦官專權。大將軍何進被殺,董卓掌握朝廷,殘害忠良。引起百姓和朝中大臣的憤怒......

下載連結:

2010年9月23日 星期四

2010年8月15日 星期日

在UIView中用Custom Font畫中文/日文

由於轉了新公司,前2個月太多野做,沒有再更新BLOGER了
之前完成了一個電子書的項目,
發現原來要在iPhone SDK中的UIView也可以支持Custom Font去繪制文字
以下是代碼:

//載入字體
NSString *fontPath = [[NSBundle mainBundle] pathForResource:fontName ofType:@"ttf"];
CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]);
font = CGFontCreateWithDataProvider(fontDataProvider);
CGDataProviderRelease(fontDataProvider);

CGContextSetFont(ctx, font);
CGContextSetFontSize(ctx, fontSize);

在DrawRect Function下的繪制代碼
//把繪畫的Matrix上下倒轉
CGAffineTransform transform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
CGContextSetTextMatrix(ctx, transform);

//垂直繪畫文字
CGContextSetFillColorWithColor(ctx, fontColor.CGColor);
NSString *str = @"要繪畫的文字";
CGGlyph _glyphs[[str length]];
unichar _chars[[str length]];
for(int i = 0; i < [str length]; i++) _chars[i] = [str characterAtIndex:i]; //CGFontGetGlyphsForUnichars是私有API,在SDK 4.0中無法使用 //CGFontGetGlyphsForUnichars(_cgFont, _chars, _glyphs, [str length]); //CMFontGetGlyphsForUnichars是有一個開源的彷CGFontGetGlyphsForUnichars庫,不過也比私有API慢3倍時間 //CMFontGetGlyphsForUnichars download link: http://github.com/jamesjhu/CMGlyphDrawing5 CMFontGetGlyphsForUnichars(font, _chars, _glyphs, [str length]); //正式繪畫 CGContextShowGlyphsAtPoint(ctx, x, y, _glyphs, [str length]);



PS:其實SDK3.2開始UIFont已支持Custom Font,不過用SDK3.2支持Custom Font方法在IOS3.2以下是無法有效果的

2010年2月20日 星期六

Unix Shell Script Tictactoe


#!/bin/csh
set player = -1
set round = 1
set map = (0 0 0 0 0 0 0 0 0)
set result = 0
set loop = 1
set tmp = 0;
while ($loop == 1)
if($player == -1) then
echo "Round $round, team cross turn"
else
echo "Round $round, team circle turn"
endif
echo -n "x = "
set x = $<
echo -n "y = "
set y = $<
@ tmp = ($y - 1) * 3 + $x

if($map[$tmp] != 0) then
echo "Sorry, ($x,$y) has been occupied, team cross please retry."
else
echo -n "game result = "
set result = $<

if($result == W) then
@ map[$tmp] = $player
endif

if($map[1] != 0 && $map[2] != 0 && $map[3] != 0 && $map[4] != 0 && $map[5] != 0 && $map[6] != 0 && $map[7] != 0 && $map[8] != 0 && $map[9] != 0) then
echo "Draw Game"
@ loop = 0
else if(($map[1] == 1 && $map[2] == 1 && $map[3] == 1) || ($map[4] == 1 && $map[5] == 1 && $map[6] == 1) || ($map[7] == 1 && $map[8] == 1 && $map[9] == 1) || ($map[1] == 1 && $map[4] == 1 && $map[7] == 1) || ($map[2] == 1 && $map[8] == 1 && $map[3] == 1) || ($map[3] == 1 && $map[6] == 1 && $map[9] == 1) || ($map[1] == 1 && $map[4] == 1 && $map[9] == 1) || ($map[3] == 1 && $map[4] == 1 && $map[7] == 1)) then
echo "Congratulation!!!"
echo "Team circle wins in round $round"
@ loop = 0
else if(($map[1] == -1 && $map[2] == -1 && $map[3] == -1) || ($map[4] == -1 && $map[5] == -1 && $map[6] == -1) || ($map[7] == -1 && $map[8] == -1 && $map[9] == -1) || ($map[1] == -1 && $map[4] == -1 && $map[7] == -1) || ($map[2] == -1 && $map[8] == -1 && $map[3] == -1) || ($map[3] == -1 && $map[6] == -1 && $map[9] == -1) || ($map[1] == -1 && $map[4] == -1 && $map[9] == -1) || ($map[3] == -1 && $map[4] == -1 && $map[7] == -1)) then
echo "Congratulation!!!"
echo "Team cross wins in round $round"
@ loop = 0
else
@ player *= -1
if($player == -1) then
@ round += 1
endif
endif
endif
end

2010年1月25日 星期一

本機編譯好的程序無法在沒有裝VC的機子上運行

由於VC++2005默認採用動態鏈接運行時庫,導致編譯好的程序在運行時依賴於本機的運行時庫,當然移植到別的機子上就不能運行了。
對於一般的win32控制台程序,可以這樣設置:
  • 點擊"項目"--- "屬性",打開項目屬性頁,點擊"配置屬性"--- "C/C++"--- "代碼生成",將此頁面右邊的"運行時庫"由默認的"多線程DLL(/MD)"改為"多線程(/MT)"或"多線程調試(/MTD)"即可。 不過一般情況下生成release版本的應用程序時選"多線程(/MT) "即可,因為這樣生成的exe程序較小。 而如果選了"多線程調試(/MTD) ",則由於加入了大量的調試信息而使生成的exe程序會增大好幾倍。 (project ->XXX property page ->configuration properties ->C/C++ ->Code Generation ->Runtime Lib.)

  • 對於MFC程序,則點擊"項目"--- "屬性",打開項目屬性頁,點擊"配置屬性"--- "常規",將右邊"項目默認值"欄目中的"MFC的使用"改為"在靜態庫中使用MFC"。確定後,在"配置屬性"--- "C/C++"--- "代碼生成"頁面的"運行時庫"會自動改為靜態鏈接----即"多線程(/MT)"。這樣編譯出來的程序就可以在沒有裝VC的機子上運行了。


原文出處:http://www.acejoy.com/space/html/56/t-956.html

2010年1月14日 星期四

Dynamic Sprite Font - XNA 顯示及動態生成多國文字

下載點:http://sites.google.com/a/goldmoz.co.cc/icecatsfiles/dang-an-file/TestDynamicSpriteFont.rar?attredirects=0&d=1

Dynamic Sprite Font是一個XNA的Plug-in,
它應該是目前為止用法最方便的XNA多國文字顯示方法,
基本上用法跟SpriteFont相同,
只是Processor使用Dynamic Sprite Font Description,
之後如常使用Content.Load("Font Name");,
哪麼設定就會完成.

以下是例子:

spriteBatch.Begin();
spriteBatch.DrawString(font, "我是中國人", Vector2.Zero, Color.Red);
spriteBatch.DrawString(font, "I am a Chinese", new Vector2(0, 100), Color.White);
spriteBatch.DrawString(font, "我是中国人", new Vector2(0, 200), Color.Yellow);
spriteBatch.DrawString(font, "私は中国人です", new Vector2(0, 300), Color.Black);
spriteBatch.DrawString(font, "저는 중국인이에요", new Vector2(0, 400), Color.Purple);
spriteBatch.DrawString(font, "मैं एक चीनी रहा हूँ", new Vector2(0, 500), Color.LimeGreen);
spriteBatch.End();


2010年1月13日 星期三

iTube TV 1.00 - 把YouTube 當你的 mp3 播放器

小弟的C#作品,令大家又可以一邊聽歌一邊欣賞MV

iTube TV
- 內置播放器
- 支持 YouTube 搜查功能
- 所有 YouTube 影片都可以播放
- 檔案體積小巧
- 必須在 .NET 2.0 Framework 以上運行
- 速度快

以下是Screenshots:

















下載點:http://sites.google.com/a/goldmoz.co.cc/icecatsfiles/dang-an-file/iTubeTV1.00.rar?attredirects=0&d=1

好用工具:ILMerge (將多的 .NET 組件合併成單一組件)

當 .NET 專案開發越來越多的情況下,通常會有一大堆組件的情況,微軟提供一套 ILMerge 免費工具可以協助你將多個組件合併成單一個 .NET 組件,有效減少部署檔案的數量以及增加部署的彈性。

由於 ILMerge 是指令列工具,在安裝完成之後,所有檔案都放在 C:\Program Files\Microsoft\ILMerge 目錄下,目錄下的 ILMerge.doc 檔案有完整的說明,以下是我閱讀完後的一些摘要筆記:

並非所有組件都能 Merge,例如有些組件包含 unmanaged code 就不一定能 Merge 成功,建議在 Merge 完後利用 PEVerify 工具 (the .NET Framework SDK tool) 驗證輸出的組件是否有效。
執行 ILMerge 時的組件清單(input assemblies)的第一個組件為主要組件(primary assembly),如果第一個組件為執行檔(*.exe),則 ILMerge 過的組件就會以此組件中定義的執行入口點(Main method)為主。
如果主要組件(primary assembly)有強式名稱簽章過,而且參數也有指定 snk 檔時,ILMerge 過後會自動重簽(re-signed)。
以下是一些使用範例:

1. 將多個組件合併成一個,其中第一個組件為「主要組件」,通常是執行的主要程式
ILMerge.exe /out:Merged.Output.exe Assembly1.exe Assembly2.dll Assembly3.dll

2. 將多個類別庫組件合併成一個,而且除了主要組件外,任何其他組件都不會公開給其他組件使用
ILMerge.exe /internalize /out:Merged.Output.dll Assembly1.dll Assembly2.dll

3. 在合併完組件後重新利用強式名稱簽名過
ILMerge.exe /keyfile:my.snk /out:Merged.Output.dll Assembly1.dll Assembly2.dll

4. 在組合的時候留下 ILMerge 的紀錄 ( 當 /log 參數不加上 :Output.log 則會將 Log 輸出到 Console )
ILMerge.exe /log:Output.log /out:Merged.Output.dll Assembly1.dll Assembly2.dll

如果不習慣用指令用工具的人也可以考慮使用 ILMerge-GUI 幫你組合組件

下載點: http://www.microsoft.com/downloads/details.aspx?FamilyID=22914587-b4ad-4eae-87cf-b14ae6a939b0&displaylang=en

2010年1月4日 星期一

XNA 無限制的 FPS

this.IsFixedTimeStep = false;

// intialize the graphics
graphics.SynchronizeWithVerticalRetrace = false;
graphics.ApplyChanges();

加上以上Code在Game.cs的Initialize()中,
就可以由60fps升到4000fps以上 (我使用NVIDIA® GeForce® 9800 GT和4GB Ram)