Last Update: 2010/12/28 10:24+08
WebGL other (雜項、未整理)
=======================================
Restriction of image size:
Texture 的 width / height, 限制必須為 2 的次方
參閱WebGL and OpenGL Differences
=======================================
2010年12月27日 星期一
2010年10月18日 星期一
Fluid Fire
Painting on Mesh
Last Update: 2010/12/18 12:45+08
上面的影片是用 DirectX 完成的
配合一些基本的向量概念
步驟大致分為
◆ Step1
以滑鼠投影到3D空間的射線與Mesh構成之平面(Plane)
求得滑鼠點擊到的位置(N)
這就不贅述了
◆ Step2
求得 N 在 Mesh 上之 UV 貼圖座標
如下圖所示
PAB為構成Mesh之三頂點
我們在 Step1 中會求得滑鼠射線在平面上的交點
沒有交點自然就沒有 Step2
因此,若 PA 與 PB 不為平行線
就存在著
在三維空間表示成
我們只要求解 變數 a、b
在得知了 a、b ,我們可以求得 UV貼圖座標,例如
還有個問題,請看下圖,是由 0 <= a、b <= 1,所構成之平面
很明顯的,我們的Mesh僅只佔了一半的面積
從上圖也可以看出
解出 c、d
只要滿足 0 <= a、b、c <= 1 就表示在Mesh所構成的三角形裡
d 怎樣的無所謂,看上圖,當 a、b、c 都被限制住的話,d 也跑不掉。
自己(雖然可能不是什麼好物。_。)
Intro
上面的影片是用 DirectX 完成的
配合一些基本的向量概念
步驟大致分為
◆ Step1
以滑鼠投影到3D空間的射線與Mesh構成之平面(Plane)
求得滑鼠點擊到的位置(N)
這就不贅述了
◆ Step2
求得 N 在 Mesh 上之 UV 貼圖座標
如下圖所示
PAB為構成Mesh之三頂點
我們在 Step1 中會求得滑鼠射線在平面上的交點
沒有交點自然就沒有 Step2
因此,若 PA 與 PB 不為平行線
就存在著
在三維空間表示成
我們只要求解 變數 a、b
在得知了 a、b ,我們可以求得 UV貼圖座標,例如
還有個問題,請看下圖,是由 0 <= a、b <= 1,所構成之平面
很明顯的,我們的Mesh僅只佔了一半的面積
從上圖也可以看出
解出 c、d
只要滿足 0 <= a、b、c <= 1 就表示在Mesh所構成的三角形裡
d 怎樣的無所謂,看上圖,當 a、b、c 都被限制住的話,d 也跑不掉。
參考
自己(雖然可能不是什麼好物。_。)
About Me
Last Update: 2010/11/24 10:35+08
SCJP
SCWCD
MCTS
.Net Framework3.5, Asp.net Application
Graphics
彈性形變:以頂點(Vertex)操作達成之形變效果
Painting on Mesh:在Mesh上繪圖
Fluid Fire: 結合 流體力學、熱力學、Volume Render & Cuda
Xna Test:一些試作(物件選取/操作、粒子系統、選單等等...)
認證===
SCJP
SCWCD
MCTS
.Net Framework3.5, Asp.net Application
作品集===
Graphics
彈性形變:以頂點(Vertex)操作達成之形變效果
Painting on Mesh:在Mesh上繪圖
Fluid Fire: 結合 流體力學、熱力學、Volume Render & Cuda
Xna Test:一些試作(物件選取/操作、粒子系統、選單等等...)
2010年10月16日 星期六
彈性形變(計算機圖學)
這是基於彈性及對頂點的操作而進行的變形
為了避免大量的運算,省略了點與點之間的連接作用
而改為令所有點都參考質量中心點而作用
進而達成娛樂或遊戲所需的效果。
參考:
Matthias Müller-Fischer の Meshless Deformations Based on Shape Matching
為了避免大量的運算,省略了點與點之間的連接作用
而改為令所有點都參考質量中心點而作用
進而達成娛樂或遊戲所需的效果。
參考:
Matthias Müller-Fischer の Meshless Deformations Based on Shape Matching
動態掛載 DLL & 調用 Method
Dynamically mount DLL (Assembly) & invoke method
Last Update: 2010/10/17 00:23
這算是最簡單的方式唄
不過有個很嚴重的缺點
它無法卸載DLL(Assembly)(參閱 這裡)
你可以開啟工作管理員來檢視
每次執行都會增加一些記憶體
所以我就使用 AppDomain 來加載DLL
就能用 AppDomain.Unload 來卸載
試作範例下載
現在有 3 個專案
◆ DynMountDll : 主執行
◆ DynMountDll.TestLib : 被掛載之DLL
◆ DynMountDllLib : interface或稱它為協定吧(WCF好像稱為Contract),被上述兩個專案所參照。
OK, 主要是這個函式
它就是負責掛載Assembly、調用Method、再卸載Assembly(AppDomain)
這幾行,應該滿好理解的
我在試作過程遇到的其它問題大致如下
● AppDoman 間的傳遞物件 必須 Serializable 或是 繼承 MarshalByRefObject
● 主要的 AppDomain 並不認識 新的AppDomain 加載的 Assembly
因此,協定(interface)是必要的
AppDomain 和 Assembly 的關係可以參考下圖
順道一提
我這邊的協定只有一個函式 InvokeMethod
它是用來呼叫其它函式的
等於是提供一個進入點(Entry Point)
主要是因為 同組件、不同版本
可能會出現協定中不存在的函式
Last Update: 2010/10/17 00:23
Intro
using System.Reflection;//Assembly, MethodInfo using System.IO;//File ... String dllPath = @"N:\Common.dll"; String typeName = "Common.Class1"; String methodName = "GetVersion"; Assembly assembly = Assembly.Load( File.ReadAllBytes(dllPath)); //載入DLL, ReadAllBytes 是避免 Lock 實體檔案 Object obj = assembly.CreateInstance(typeName); //創建物件實體 MethodInfo method = obj.GetType() .GetMethod(methodName); //取得Method資訊 Console.WriteLine(method.Invoke(obj, new Object[] { }));
這算是最簡單的方式唄
不過有個很嚴重的缺點
它無法卸載DLL(Assembly)(參閱 這裡)
你可以開啟工作管理員來檢視
每次執行都會增加一些記憶體
所以我就使用 AppDomain 來加載DLL
就能用 AppDomain.Unload 來卸載
Implementation
試作範例下載
現在有 3 個專案
◆ DynMountDll : 主執行
◆ DynMountDll.TestLib : 被掛載之DLL
◆ DynMountDllLib : interface或稱它為協定吧(WCF好像稱為Contract),被上述兩個專案所參照。
OK, 主要是這個函式
它就是負責掛載Assembly、調用Method、再卸載Assembly(AppDomain)
這幾行,應該滿好理解的
void MountDllInvokeMethod(String dllPath , String typeName, String methodName) { AppDomain myAppDomain = null; try { FileInfo fi = new FileInfo(dllPath); AppDomainSetup setup = new AppDomainSetup(); setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; setup.ApplicationName = "DynMountDll"; myAppDomain = AppDomain.CreateDomain( "AppDomain01", null, setup); DynMountDllLib.IBaseLoader obj = (DynMountDllLib.IBaseLoader) myAppDomain.CreateInstanceFromAndUnwrap( fi.FullName, typeName); MessageShow(obj.InvokeMethod(methodName, new Object[] { })); } finally { if (myAppDomain != null) { AppDomain.Unload(myAppDomain); } } }
我在試作過程遇到的其它問題大致如下
● AppDoman 間的傳遞物件 必須 Serializable 或是 繼承 MarshalByRefObject
● 主要的 AppDomain 並不認識 新的AppDomain 加載的 Assembly
因此,協定(interface)是必要的
AppDomain 和 Assembly 的關係可以參考下圖
順道一提
我這邊的協定只有一個函式 InvokeMethod
它是用來呼叫其它函式的
等於是提供一個進入點(Entry Point)
主要是因為 同組件、不同版本
可能會出現協定中不存在的函式
2010年7月26日 星期一
iPhone-Cocos2d CCSprite Custom Touch Event
CCSprite 自定義觸控事件
Last Update: 2010/07/26 22:31
我們常用的那個 HelloWorldScene, 是繼承 CCLayer
它是可以註冊觸控事件 (ccTouchBegan...)
如果 CCSprite 本身有自動執行的行為, 並非與場景的互動
或是為了從場景獨立出來, or anything...
同樣的可以為 CCSprite 註冊
環境:
XCode 3.2
Simulator 3.1.3
Cocos2d 0.99.4
準備工作:None
這裡有<主要的程式檔>可以載, 也可依下步驟完成
繼承CCSprite
新增一個類別來繼承CCSprite
咱們要覆寫 onEnter 及 onExit 來註冊和取消觸控事件
因此咱們的 h 檔像這樣
這裡的 label 是在觸控事件發生時顯示文字給我們看
CCTargetedTouchDelegate 是實作觸控事件的協定
註冊/取消觸控事件
我們來到 mm檔
注意下 swallowsTouches:no 以及 priority:1
如果你把優先權設的比場景所屬的觸控事件還高
又把 swallowsTouches 設成 Yes
那你的 CCSprite 就會把觸控事件偷偷吃掉, 不告訴你的場景
觸控事件
還是在同一個 mm檔
上列程式, 這是為了判定是否點擊到的函式
這就是我們實作觸控事件的地方
加入場景
在我們最常用的 HelloWorldScene 裡 init 函式 的 if 區段
用下述代碼覆寫
只是在原本的Hello World
加入 已繼承 CCSprite 的 MySprite
記得把你的圖檔放進專案裡, 順便調整一下位置
還有引入 MySprite.h 標頭檔
The End...
Last Update: 2010/07/26 22:31
簡介
我們常用的那個 HelloWorldScene, 是繼承 CCLayer
它是可以註冊觸控事件 (ccTouchBegan...)
如果 CCSprite 本身有自動執行的行為, 並非與場景的互動
或是為了從場景獨立出來, or anything...
同樣的可以為 CCSprite 註冊
前置
環境:
XCode 3.2
Simulator 3.1.3
Cocos2d 0.99.4
準備工作:None
這裡有<主要的程式檔>可以載, 也可依下步驟完成
實作
新增一個類別來繼承CCSprite
咱們要覆寫 onEnter 及 onExit 來註冊和取消觸控事件
因此咱們的 h 檔像這樣
@interface MySprite : CCSprite < CCTargetedTouchDelegate > {
CCLabel *label;
}
@property (nonatomic, retain) CCLabel *label;
@end
這裡的 label 是在觸控事件發生時顯示文字給我們看
CCTargetedTouchDelegate 是實作觸控事件的協定
我們來到 mm檔
- (void)onEnter{
[[CCTouchDispatcher sharedDispatcher] addTargetedDelegate:self priority:1 swallowsTouches:NO];
[super onEnter];
}
- (void)onExit{
[[CCTouchDispatcher sharedDispatcher] removeDelegate:self];
[super onExit];
}
注意下 swallowsTouches:no 以及 priority:1
如果你把優先權設的比場景所屬的觸控事件還高
又把 swallowsTouches 設成 Yes
那你的 CCSprite 就會把觸控事件偷偷吃掉, 不告訴你的場景
還是在同一個 mm檔
- (CGRect)rect{
CGSize s = [self boundingBox].size;
return CGRectMake(-s.width / 2, -s.height / 2, s.width, s.height);
}
- (BOOL)containsTouchLocation:(UITouch *)touch{
return CGRectContainsPoint(self.rect, [self convertTouchToNodeSpaceAR:touch]);
}
上列程式, 這是為了判定是否點擊到的函式
- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event{
if([self containsTouchLocation : touch]){
[self->label setString:@"Dont touch me"];
}
return YES;
}
- (void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event{
if([self containsTouchLocation : touch]){
[self->label setString:@" "];
}
}
這就是我們實作觸控事件的地方
在我們最常用的 HelloWorldScene 裡 init 函式 的 if 區段
用下述代碼覆寫
CCLabel* label = [CCLabel labelWithString:@"Hello World" fontName:@"Marker Felt" fontSize:64];
CGSize size = [[CCDirector sharedDirector] winSize];
label.position = ccp( size.width /2 , size.height/2 + 100);
[self addChild: label];
MySprite *sprite = [MySprite spriteWithFile:@"img.png"];
sprite.label = label;
sprite.position = ccp(size.width/2, 100);
[self addChild:sprite];
只是在原本的Hello World
加入 已繼承 CCSprite 的 MySprite
記得把你的圖檔放進專案裡, 順便調整一下位置
還有引入 MySprite.h 標頭檔
The End...
2010年7月25日 星期日
Cocoa-libxml2 print xmlDocPtr
印出 xmlDocPtr 指向的文件內容
Last Update: 2010/07/26 11:16
Last Update: 2010/07/26 11:16
xmlChar *buffer = NULL; int size = 0; xmlDocDumpMemoryEnc(yourXmlDocPtr, &buffer, &size, "utf-8"); NSLog(@"Xml Data: %@", [NSString stringWithCString:(char*)buffer encoding:NSUTF8StringEncoding]); free(buffer); buffer = NULL;
2010年7月21日 星期三
Cocoa-Other
NSString
NSString 2 char
const char* cString = [nsStringObj cStringUsingEncoding:ASCIIEncoding];
[nsStringObj UTF8String];
char 2 NSString by encoding
[NSString stringWithCString:temp encoding:NSUTF8StringEncoding];
Join string array to single string
NSArray * stuff = /* ... */;
NSString * combinedStuff = [stuff componentsJoinedByString:@"separator"];
and inverse by [NSString componentsSeparatedByString:]
=========================================
exist file
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:somePath];
=========================================
是否有相交
CGRectIntersection
=========================================
亂數
srand(time(NULL));random();
arc4random
=========================================
typeof
if(typeof([ErrorIDQuestion alloc])==typeof(question))
f( [[myObject className] isEqual: @"NSString"])
NSString 2 char
const char* cString = [nsStringObj cStringUsingEncoding:ASCIIEncoding];
[nsStringObj UTF8String];
char 2 NSString by encoding
[NSString stringWithCString:temp encoding:NSUTF8StringEncoding];
Join string array to single string
NSArray * stuff = /* ... */;
NSString * combinedStuff = [stuff componentsJoinedByString:@"separator"];
and inverse by [NSString componentsSeparatedByString:]
=========================================
exist file
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:somePath];
=========================================
是否有相交
CGRectIntersection
=========================================
亂數
srand(time(NULL));random();
arc4random
=========================================
typeof
if(typeof([ErrorIDQuestion alloc])==typeof(question))
f( [[myObject className] isEqual: @"NSString"])
Cocoa-libxml2 install
Cocoa-libxml2安裝
Last Update: 2010/07/22 14:56
Step1. 加入Framework
在專案的Framework目錄按右鍵 -> Add -> Existing Frameworks...
找到 libxml2. -> Add
Step2. 引入標頭檔
專案右鍵 ﹣>GetInfo -> Build頁籤
在 Header Search Paths 或 User Header Search Paths 添加 /usr/include/libxml2
Cocos2d 的 Box2d 似乎只能加在 User Header Search Paths, 不知為何 !?
http://welcome.totheinter.net/2008/03/11/adding-the-libxml-framework-to-your-iphone-app/
Last Update: 2010/07/22 14:56
實作
在專案的Framework目錄按右鍵 -> Add -> Existing Frameworks...
找到 libxml2. -> Add
專案右鍵 ﹣>GetInfo -> Build頁籤
在 Header Search Paths 或 User Header Search Paths 添加 /usr/include/libxml2
Cocos2d 的 Box2d 似乎只能加在 User Header Search Paths, 不知為何 !?
參考
http://welcome.totheinter.net/2008/03/11/adding-the-libxml-framework-to-your-iphone-app/
2010年7月19日 星期一
Cocoa-Invoking function
Cocoa-調用函式
Last Update: 2010/07/19 16:35
使用NSObject 的 performSelector 來調用函式
SEL 是一個指標結構,用來儲存函式指標
Last Update: 2010/07/19 16:35
使用NSObject 的 performSelector 來調用函式
SEL 是一個指標結構,用來儲存函式指標
typedef struct { int code; NSString *message; }PassingData; - (void)invokedMethod : (id)sender : (PassingData*)msg{ NSLog(@"%d : %@", msg->code, msg->message); } - (void)execInvoke : (id)sender : (SEL)method{ PassingData *pd = malloc(sizeof(PassingData)); pd->code = 3; pd->message = @"QWERT"; [sender performSelector:method withObject:sender withObject:(id)pd]; free(pd); } - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { // Insert code here to initialize your application [self execInvoke:self :@selector(invokedMethod::)]; }
2010年7月14日 星期三
iPhone-Cocos2d Progress/Health Bar
iPhone - Cocos2d 進度 / 血量 條
Last Update: 2010/07/14 21:18
環境:
XCode 3.2.2
Compile: Simulator 3.1.3-Debug
iPhone SDK 4.0
Cocos2d 0.99.4
準備工作:
外框及內部圖片
新增Cocos2d專案以後
將圖片加入Resource
我們將用 CCProgressTimer 來做進度 / 血量 條
把下列程式覆寫在 init 函式裡的 if 區段
先放個外框
.type 選擇水平從左到右
將 Bar 加入外框的子節點
並將它 "Anchor" 在(0, 0)的位置
這樣省了計算外框和 Bar 的關係位置
2 種方式變更計量
直接設定 以及 CCProgressTo (action)
Last Update: 2010/07/14 21:18
前置
環境:
XCode 3.2.2
Compile: Simulator 3.1.3-Debug
iPhone SDK 4.0
Cocos2d 0.99.4
準備工作:
外框及內部圖片
實作
新增Cocos2d專案以後
將圖片加入Resource
我們將用 CCProgressTimer 來做進度 / 血量 條
把下列程式覆寫在 init 函式裡的 if 區段
CCSprite *spriteBorder = [CCSprite spriteWithFile:@"hp_border.png"];
spriteBorder.position = ccp(150,150);
[self addChild:spriteBorder];
先放個外框
CCProgressTimer *spriteBar = [CCProgressTimer progressWithFile:@"hp_bar.png"];
spriteBar.type = kCCProgressTimerTypeHorizontalBarLR;
[spriteBorder addChild:spriteBar];
[spriteBar setAnchorPoint:ccp(0,0)];
.type 選擇水平從左到右
將 Bar 加入外框的子節點
並將它 "Anchor" 在(0, 0)的位置
這樣省了計算外框和 Bar 的關係位置
spriteBar.percentage = 80;
CCAction *action = [CCProgressTo actionWithDuration:1 percent:1];
[spriteBar runAction:action];
2 種方式變更計量
直接設定 以及 CCProgressTo (action)
iPhone-Cocos2d Animation Frame 2
iPhone-Cocos2d 動畫 (連續圖片播放) part.2
Last Update: 2010/07/14 20:43
環境:
XCode 3.2.2
Cocos2d 0.99.4
準備工作:
連續圖片
新增Cocos2d專案
將圖片直接加入Resource
將 init 函式裡的 Code 用下列程式碼代換
滿淺顯易懂的, 就不說明了
Last Update: 2010/07/14 20:43
前置
環境:
XCode 3.2.2
Cocos2d 0.99.4
準備工作:
連續圖片
步驟
新增Cocos2d專案
將圖片直接加入Resource
將 init 函式裡的 Code 用下列程式碼代換
滿淺顯易懂的, 就不說明了
if( (self=[super init] )) {
CCSprite *mySprite = [[CCSprite alloc] initWithFile:@"fox_0001.png"];
CCSprite *mySprite2 = [[CCSprite alloc] initWithFile:@"fox_0001.png"];
CCAnimation *walk = [[CCAnimation alloc] initWithName:@"walk" delay:0.1];
for(int i=1;i<=10;i++){
[walk addFrameWithFilename:[NSString stringWithFormat:@"fox_%04d.png", i]];
}
[mySprite addAnimation:walk];
[mySprite2 addAnimation:walk];
//[mySprite setDisplayFrame:@"walk" index:0];
//[mySprite setDisplayFrame:@"walk" index:1];
CCAction *action = [CCRepeatForever actionWithAction:[CCAnimate actionWithAnimation:walk restoreOriginalFrame:NO]];
CCAction *action2 = [CCAnimate actionWithAnimation:walk restoreOriginalFrame:NO];
[mySprite runAction:action];
[mySprite2 runAction:action2];
mySprite.position = ccp(150,150);
mySprite2.position = ccp(300,150);
[self addChild:mySprite];
[self addChild:mySprite2];
}
return self;
2010年7月6日 星期二
iPhone-Cocos2d Other
雜項 其它 未整理
向量:
ccpLength
ccpLengSQ
ccpDistance
ccSub
Call function
CCCallFuncND eventFunc = [CCCallFuncND
actionWithTarget:self
selector:@selector(gotoGameScene:data:)
data:role];
[eventFunc execute];
CCSequence, dynamically add action
自定義資料
CCNode.tag
CCNode.userData
向量:
ccpLength
ccpLengSQ
ccpDistance
ccSub
Call function
CCCallFuncND eventFunc = [CCCallFuncND
actionWithTarget:self
selector:@selector(gotoGameScene:data:)
data:role];
[eventFunc execute];
CCSequence, dynamically add action
+(CCFiniteTimeAction *) getActionSequence: (NSArray *) actions
{
CCFiniteTimeAction *seq = nil;
for (CCFiniteTimeAction *anAction in actions)
{
if (!seq){
seq = anAction;
}else{
seq = [CCSequence actionOne:seq two:anAction];
}
}
return seq;
}
自定義資料
CCNode.tag
CCNode.userData
2010年7月2日 星期五
iPhone Dev Navigation
Last Update: 2011/01/26 17:50+08
調用函式
libxml2安裝
libxml2印出文件內容
加入參考library
XCode - Others
動畫 (連續圖片播放)
動畫 (連續圖片播放) 2
進度 / 血量條
CCSprite自定觸控事件
其它(雜項)
iPhone Human Interface Guidelines
可用的Xml工具比較
Xml - SAX vs DOM
Objective-C / Cocoa
調用函式
libxml2安裝
libxml2印出文件內容
XCode
加入參考library
XCode - Others
Cocos2d
動畫 (連續圖片播放)
動畫 (連續圖片播放) 2
進度 / 血量條
CCSprite自定觸控事件
其它(雜項)
參考
iPhone Human Interface Guidelines
可用的Xml工具比較
Xml - SAX vs DOM
2010年6月29日 星期二
iPhone-Cocos2d Animation Frame
iPhone-Cocos2d 動畫 (連續圖片播放)
Last Update: 2010/07/14 20:42
環境:
XCode 3.2.2
Cocos2d 0.99.4
準備工作 :
Zwoptex (官網)
連續圖片
以 Zwoptex 製作 .plist 及 .png
執行 Zwoptex => File => New
再將所有圖片全選, 拖曳到 Zwoptex 的視窗裡
點擊Untrim(不自動剪裁)
選擇適當大小
Layout -> Apply (自動排版)
儲存圖片(Texture, 建議png)
儲存描述檔 ( .plist, 格式為xml, 主要描述各圖檔座標)
把它們加到專案的 Resource 裡吧
加入後, 開啟 .plist -> Root -> Frame 可以看到原始圖檔名稱
接下來的一切動作都只在 init 函式裡
接著要建立 CCSpriteSheet 及 CCAnimation
我是以Cocos2d的範本建立專案
如果什麼都沒做就 Debug 的話應該會看到 Hello World
我們不需要這個
請將 init 函式的 if 區塊內容清空
加入 CCSpriteSheet 的 初始化, 看起來會像下面的程式碼
緊接著 CCSpriteSheet
一樣在 if 區塊裡加入下面的程式碼, 將 CCAnimation 建立起來
OK, 一行行說吧
先把 描述檔(.plist)載入
再將每個 Frame 取出並儲存(for)
其中的字串 @"fox_$04d.png"
是圖檔的名稱格式, 它會填入4個數字, 不足補零
最後我們有了圖檔的座標、大小和順序就可以建立動畫
CCSprite 要執行什麼動作都必需要依靠 CCAction 來操作
所以我們將 CCAnimation 與 CCAction 做個連結吧
這裡值得提的, 大概是 spriteWithSpriteFrameName
不再是用一般 Resource 的圖檔, 而是來自 Frame name
sprite 要執行剛建好的動作(CCAction)
再將 sprite 加入 ss(CCSpriteSheet), 以連結圖檔
最後把 ss 加入當前場景即可
恭喜,執行吧!!
完整專案下載
Last Update: 2010/07/14 20:42
前置
環境:
XCode 3.2.2
Cocos2d 0.99.4
準備工作 :
Zwoptex (官網)
連續圖片
建立動畫資源檔案
以 Zwoptex 製作 .plist 及 .png
執行 Zwoptex => File => New
再將所有圖片全選, 拖曳到 Zwoptex 的視窗裡
點擊Untrim(不自動剪裁)
選擇適當大小
Layout -> Apply (自動排版)
儲存圖片(Texture, 建議png)
儲存描述檔 ( .plist, 格式為xml, 主要描述各圖檔座標)
把它們加到專案的 Resource 裡吧
加入後, 開啟 .plist -> Root -> Frame 可以看到原始圖檔名稱
接下來的一切動作都只在 init 函式裡
建立動畫來源
接著要建立 CCSpriteSheet 及 CCAnimation
我是以Cocos2d的範本建立專案
如果什麼都沒做就 Debug 的話應該會看到 Hello World
我們不需要這個
請將 init 函式的 if 區塊內容清空
加入 CCSpriteSheet 的 初始化, 看起來會像下面的程式碼
-(id) init
{
if( (self=[super init] )) {
CCSpriteSheet *ss = [CCSpriteSheet
spriteSheetWithFile:@"fox.png"];
}
return self;
}
緊接著 CCSpriteSheet
一樣在 if 區塊裡加入下面的程式碼, 將 CCAnimation 建立起來
[[CCSpriteFrameCache sharedSpriteFrameCache]
addSpriteFramesWithFile:@"fox.plist"];//Load plist.
NSMutableArray *animFrames = [NSMutableArray array];
for(int i = 1; i <= 10; ++i) {//for each frame.
[animFrames addObject:
[[CCSpriteFrameCache sharedSpriteFrameCache]
spriteFrameByName:
[NSString stringWithFormat:@"fox_%04d.png", i]]];
}
CCAnimation *anim = [CCAnimation
animationWithName:@"walk"
delay:0.1 frames:animFrames];
OK, 一行行說吧
先把 描述檔(.plist)載入
再將每個 Frame 取出並儲存(for)
其中的字串 @"fox_$04d.png"
是圖檔的名稱格式, 它會填入4個數字, 不足補零
最後我們有了圖檔的座標、大小和順序就可以建立動畫
連結你的動畫
CCAction *action = [CCRepeatForever actionWithAction:
[CCAnimate actionWithAnimation:anim restoreOriginalFrame:NO]];
CCSprite 要執行什麼動作都必需要依靠 CCAction 來操作
所以我們將 CCAnimation 與 CCAction 做個連結吧
CCSprite *sprite =[CCSprite
spriteWithSpriteFrameName:@"fox_0001.png"];
CGSize winSize = [CCDirector sharedDirector].winSize;
sprite.position = ccp(winSize.width/2, winSize.height/2);
這裡值得提的, 大概是 spriteWithSpriteFrameName
不再是用一般 Resource 的圖檔, 而是來自 Frame name
[sprite runAction:action];
[ss addChild:sprite];
[self addChild:ss];
sprite 要執行剛建好的動作(CCAction)
再將 sprite 加入 ss(CCSpriteSheet), 以連結圖檔
最後把 ss 加入當前場景即可
恭喜,執行吧!!
完整專案下載
2010年6月22日 星期二
Add reference library for iPhone
在 iPhone 專案裡, 加入參考library.
環境: XCode 3.2.2
到此算是完成加入參考 lib 的動作, 但它不會自動重新編譯, 因此接下來把它加入相依性吧
http://www.amateurinmotion.com/articles/2009/02/08/creating-a-static-library-for-iphone.html
環境: XCode 3.2.2
流程
- 創建靜態library
- 創建iPhone專案
- 加入靜態library
- 同步編譯library
- 標頭檔(.h)引入
創建靜態library
- 1.1 開啟XCode => File => new Project
- 1.2 選擇專案類型: library => Cocoa touch static library
- 1.3 輸入 lib 名稱 (ex: MyLib)
創建iPhone專案
- 2.1 開啟XCode => File => new Project
- 2.2 選擇專案類型: Application => View-based Application (請依需求選擇)
- 2.3 輸入專案名稱 (ex: MyApp)
加入靜態library
- 3.1 拖曳 MyLib 到 MyApp (跨視窗)
- 3.2 會彈出設定視窗, 取消勾選 "Copy Items ...", 並勾選下面的 "Add to targets" 裡的 MyApp, 點擊 "Add"
- 3.3 在 MyApp 專案裡, 展開剛加入的library, 裡面有個 libMyLib.a, 拖曳到 Targets => MyApp => Link Binary With Libraries
同步編譯library
到此算是完成加入參考 lib 的動作, 但它不會自動重新編譯, 因此接下來把它加入相依性吧
- 4.1 在 MyApp 專案裡, Targets => MyApp 上點擊右鍵 => Get Info => General => Direct Dependencies, 加入 MyLib
標頭檔(.h)引入
- 5.1 在4.1的地方, 有個頁籤 "Build" => 搜尋 "Header Search Paths", 加入標頭檔所在路徑
如果 2 個專案是放在同一個資料夾的話, 可以輸入 "${PROJECT_DIR}/../MyLib"
參考
http://www.amateurinmotion.com/articles/2009/02/08/creating-a-static-library-for-iphone.html
2010年6月13日 星期日
Install MacOS using Vmware on Windows
本文純屬興趣測試
在Windows平台, 使用Vmware安裝Mac OS
1. Vmware
2. Mac Os X - Snow Leopard 10.6.2
3. 導引映像 - darwin.iso (本文用) 或 Rebel EFI.iso
1. 安裝Vmware
2. 新增虛擬機器(執行Vmware -> File -> New -> Virtual Machine)
會出現Wizard, 選擇 Typical
預設載入的光碟映像檔, 選擇導引映像(darwin.iso), 可安裝時再設定
OS 選擇 Other->FreeBSD 64-bit, 等下會修改, 猜測是較接近Mac的配置
選擇虛擬機器要放哪
硬碟配置 基本16G, 視個人需求
3. 修改設定檔
在你選擇的虛擬機器位置, 以記事本開啟 .vmx
加入 paevm = "true"
修改 guestOS = "darwin10"
存檔, 重啟Vmware
4. 虛擬機 設定
你的Vmware虛擬機 -> 右鍵 -> Setting
移除軟碟 (Click floppy -> Remove)
光碟改成SCSI (Click CD/DVD -> Advanced.. -> SCSI 選個沒在用的吧)
Note. 頁籤Options -> General, 可在右邊看到version: Mac OS X Server 10.6 (步驟3的結果, 必要)(汗。_。||)
5. 導引Mac安裝
啟動虛擬機(記得掛載導引映像)
看到 "Please wait for the DVD to load...", 換掛載Snow Leopard, (注意: 需勾選 "Connected")
按 F8 要求輸入其它安裝選項, 輸入 "-v", Enter (非必要, 只是會跑出啟動的Console)
6. Mac安裝
若看到選擇語系的畫面, 就恭喜你囉
下一步 -> 繼續 -> 同意 -> 選擇安裝磁碟清單是空的? 因為還沒分割和掛載
上面有個 工具程式 -> 磁碟工具程式...
點左邊的磁碟 -> 右邊的分割, 會出現分割設定, 選架構(1個分割區), 填名稱 然後套用
如果沒有自動掛載, 左邊的磁碟按右鍵, 掛載
關閉磁碟工具視窗
OK 已經有磁碟了, 點安裝唄, 裝完就可以用了
我這邊目前重啟要掛載導引光碟才能進到 Mac OS 裡.
測試平台1
CPU : Intel Core2 Quad Q8400 2.66 GHz
Board : Gigabyte - EP43T-USB3
Ram : 4 GB
Display : Nvidia GeForce GTX250
OS : Windows 7 x86
測試平台2
CPU : Intel Core i5 750
Board : 待查
Ram : 8 GB
Display : Nvidia GeForce GTX 275 (SLI)
OS : Window 7 x64
備註: 無法用dmg安裝, 轉iso後仍可
測試平台3 - Notebook: Asus N80Vc
CPU : Intel Core 2 Duo P8400
Chipest : Intel PM45 Express
Ram : 4 GB
Display : Nvidia GeForce 9300m
OS : Win Vista x86
驅動程式下載
Sound
VGA
http://wiki.osx86project.org/wiki/index.php/Vmware
http://lingbug.spaces.live.com/blog/cns!F1DDC825780F3571!215.entry
在Windows平台, 使用Vmware安裝Mac OS
準備工作
1. Vmware
2. Mac Os X - Snow Leopard 10.6.2
3. 導引映像 - darwin.iso (本文用) 或 Rebel EFI.iso
步驟
1. 安裝Vmware
2. 新增虛擬機器(執行Vmware -> File -> New -> Virtual Machine)
會出現Wizard, 選擇 Typical
OS 選擇 Other->FreeBSD 64-bit, 等下會修改, 猜測是較接近Mac的配置
選擇虛擬機器要放哪
硬碟配置 基本16G, 視個人需求
3. 修改設定檔
在你選擇的虛擬機器位置, 以記事本開啟 .vmx
加入 paevm = "true"
修改 guestOS = "darwin10"
存檔, 重啟Vmware
4. 虛擬機 設定
你的Vmware虛擬機 -> 右鍵 -> Setting
移除軟碟 (Click floppy -> Remove)
光碟改成SCSI (Click CD/DVD -> Advanced.. -> SCSI 選個沒在用的吧)
Note. 頁籤Options -> General, 可在右邊看到version: Mac OS X Server 10.6 (步驟3的結果, 必要)(汗。_。||)
5. 導引Mac安裝
啟動虛擬機(記得掛載導引映像)
看到 "Please wait for the DVD to load...", 換掛載Snow Leopard, (注意: 需勾選 "Connected")
按 F8 要求輸入其它安裝選項, 輸入 "-v", Enter (非必要, 只是會跑出啟動的Console)
6. Mac安裝
若看到選擇語系的畫面, 就恭喜你囉
下一步 -> 繼續 -> 同意 -> 選擇安裝磁碟清單是空的? 因為還沒分割和掛載
上面有個 工具程式 -> 磁碟工具程式...
點左邊的磁碟 -> 右邊的分割, 會出現分割設定, 選架構(1個分割區), 填名稱 然後套用
如果沒有自動掛載, 左邊的磁碟按右鍵, 掛載
關閉磁碟工具視窗
OK 已經有磁碟了, 點安裝唄, 裝完就可以用了
後記
我這邊目前重啟要掛載導引光碟才能進到 Mac OS 裡.
測試平台1
CPU : Intel Core2 Quad Q8400 2.66 GHz
Board : Gigabyte - EP43T-USB3
Ram : 4 GB
Display : Nvidia GeForce GTX250
OS : Windows 7 x86
測試平台2
CPU : Intel Core i5 750
Board : 待查
Ram : 8 GB
Display : Nvidia GeForce GTX 275 (SLI)
OS : Window 7 x64
備註: 無法用dmg安裝, 轉iso後仍可
測試平台3 - Notebook: Asus N80Vc
CPU : Intel Core 2 Duo P8400
Chipest : Intel PM45 Express
Ram : 4 GB
Display : Nvidia GeForce 9300m
OS : Win Vista x86
驅動程式下載
Sound
VGA
參考
http://wiki.osx86project.org/wiki/index.php/Vmware
http://lingbug.spaces.live.com/blog/cns!F1DDC825780F3571!215.entry
訂閱:
文章 (Atom)