Just My Life & My Work

Posts tagged ‘teach’

[Objective C] NSMutableArray

對應NSArray,接著來練習NSMutableArray!屬於可變 (mutable) 的物件種類,裡頭可以放任何的型態的物件。

常用方法如下:

  • -(void) addObject: (id) anObject
    將 anObject 加入陣列
  • -(void) removeObject: (id)anObject
    將陣列內所有符合 anObject 的物件刪除
  • -(void) sortUsingSelector: (SEL) comparator
    以 comparator 的方法,將陣列的元素加以排序
  • -(void) replaceObjectAtIndex: (NSUInteger) index withObject: (id) anObject
    將陣列索引值為 index 的元素取代為 anObject
  • -(void) exchangeObjectAtIndex: (NSUInteger) idx1 withObjectAtIndex: (NSUInteger) idx2
    將陣列索引值為 idx1 與 idx2 的元素調換

範例程式碼:


//
//  main.m
//  HappyMan's Program - NSMutableArray
//  Xcode 4.5
//  Created by ShengWen on 12/9/26.
//  Copyright (c) 2012年 ShengWen. All rights reserved.
//  https://cg2010studio.wordpress.com/

#import <Foundation/Foundation.h>
@interface monster : NSObject
{
    int life;
}
@property int life;
-(void) show;
@end

@interface posion : NSObject
{
    int cure;
}
@property int cure;
-(void) show;
@end

@implementation monster
@synthesize life;
-(void) show{
    NSLog(@"life = %i",life);
}
@end

@implementation posion
@synthesize cure;
-(void) show{
    NSLog(@"cure = %i",cure);
}

@end

int main (int argc, const char * argv[]) {

    monster* lion1 = [[monster alloc] init];
    monster* lion2 = [[monster alloc] init];
    monster* lion3 = [[monster alloc] init];
    posion* red1 = [[posion alloc] init];
    posion* red2 = [[posion alloc] init];
    posion* red3 = [[posion alloc] init];
    NSMutableArray* mArray = [[NSMutableArray alloc] init];

    lion1.life = 99;
    lion2.life = 199;
    lion3.life = 299;
    red1.cure = 49;
    red2.cure = 149;
    red3.cure = 249;

    // 將物件加入陣列中
    [mArray addObject:lion1];
    [mArray addObject:lion2];
    [mArray addObject:lion3];
    [mArray addObject:red1];
    [mArray addObject:red2];
    [mArray addObject:red3];

    // 使用陣列內物件的方法
    NSLog(@"使用物件方法:");
    [mArray makeObjectsPerformSelector:@selector(show)];

    // 刪除物件
    NSLog(@"刪除物件:");
    [mArray removeObject:red2];
    [mArray makeObjectsPerformSelector:@selector(show)];

    // 取代物件
    NSLog(@"取代物件:");
    [mArray replaceObjectAtIndex:2 withObject:red3];
    [mArray makeObjectsPerformSelector:@selector(show)];

    // 對調物件
    NSLog(@"對調物件:");
    [mArray exchangeObjectAtIndex:0 withObjectAtIndex:2];
    [mArray makeObjectsPerformSelector:@selector(show)];

    return 0;
}

執行結果:

2012-10-04 23:51:42.926 HappyMan’s First Program[8898:403] 使用物件方法:

2012-10-04 23:51:42.928 HappyMan’s First Program[8898:403] life = 99

2012-10-04 23:51:42.929 HappyMan’s First Program[8898:403] life = 199

2012-10-04 23:51:42.929 HappyMan’s First Program[8898:403] life = 299

2012-10-04 23:51:42.930 HappyMan’s First Program[8898:403] cure = 49

2012-10-04 23:51:42.930 HappyMan’s First Program[8898:403] cure = 149

2012-10-04 23:51:42.931 HappyMan’s First Program[8898:403] cure = 249

2012-10-04 23:51:42.931 HappyMan’s First Program[8898:403] 刪除物件:

2012-10-04 23:51:42.932 HappyMan’s First Program[8898:403] life = 99

2012-10-04 23:51:42.932 HappyMan’s First Program[8898:403] life = 199

2012-10-04 23:51:42.933 HappyMan’s First Program[8898:403] life = 299

2012-10-04 23:51:42.933 HappyMan’s First Program[8898:403] cure = 49

2012-10-04 23:51:42.934 HappyMan’s First Program[8898:403] cure = 249

2012-10-04 23:51:42.934 HappyMan’s First Program[8898:403] 取代物件:

2012-10-04 23:51:42.935 HappyMan’s First Program[8898:403] life = 99

2012-10-04 23:51:42.935 HappyMan’s First Program[8898:403] life = 199

2012-10-04 23:51:42.936 HappyMan’s First Program[8898:403] cure = 249

2012-10-04 23:51:42.936 HappyMan’s First Program[8898:403] cure = 49

2012-10-04 23:51:42.937 HappyMan’s First Program[8898:403] cure = 249

2012-10-04 23:51:42.937 HappyMan’s First Program[8898:403] 對調物件:

2012-10-04 23:51:42.938 HappyMan’s First Program[8898:403] cure = 249

2012-10-04 23:51:42.940 HappyMan’s First Program[8898:403] life = 199

2012-10-04 23:51:42.940 HappyMan’s First Program[8898:403] life = 99

2012-10-04 23:51:42.941 HappyMan’s First Program[8898:403] cure = 49

2012-10-04 23:51:42.942 HappyMan’s First Program[8898:403] cure = 249

話說,輸出明明就很少,結果大部分的內容都是時間加上專案名稱,下次該把這部分給刪除掉~

參考:Objective-C 陣列物件NSMutableArray Class ReferenceObjective-C 入門指南 – NSMutableArray

[Objective C] NSArray

來練習一下NSArray怎麼寫吧!屬於不可變 (immutable) 的物件種類,裡頭可以放任何的型態的物件。

常用方法如下:

  • +(id) arrayWithObjects: (id) firstObj, …
    將多個物件當做陣列的初始值,最後以 nil 結束
  • -(NSUInteger) count
    回傳陣列儲存的物件數量
  • -(NSUInteger) indexOfObject: (id) anObject
    若陣列中有物件 anObject,則回傳此物件於陣列中的索引值,否則回傳 NSNotFound
  • -(id) objectAtIndex: (NSUInteger) index
    回傳陣列索引值為 index 的物件
  • -(void) makeObjectsPerformSelector: (SEL) aSelector
    對陣列內所有物件執行 aSelector 方法

範例程式碼:


//
//  main.m
//  HappyMan's Program - NSArray
//  Xcode 4.5
//  Created by ShengWen on 12/9/26.
//  Copyright (c) 2012年 ShengWen. All rights reserved.
//  https://cg2010studio.wordpress.com/

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{
    NSString* str1 = @"HappyMan";
    NSString* str2 = @"WaterMan";
    NSString* str3 = @"BrightMan";
    NSArray* mArray;

    // 將物件加入 array
    mArray = [NSArray arrayWithObjects: str1, str2, str3, nil];
    NSInteger count = [mArray count];
    for(int i=0;i<count;i++){
        NSLog(@"index: %i, value: %@", i, [mArray objectAtIndex: i]);
    }

    // 取得物件的所在位置
    NSInteger index;
    if ((index = [mArray indexOfObject:@"WaterMan"]) != NSNotFound) {
        NSLog(@"陣列的第%li個位置,值為%@", index, [mArray objectAtIndex:index]);
    }
    return 0;
}

執行結果:

2012-10-03 22:57:40.546 HappyMan’s First Program[2451:403] index: 0, value: HappyMan

2012-10-03 22:57:40.548 HappyMan’s First Program[2451:403] index: 1, value: WaterMan

2012-10-03 22:57:40.549 HappyMan’s First Program[2451:403] index: 2, value: BrightMan

2012-10-03 22:57:40.549 HappyMan’s First Program[2451:403] 陣列的第1個位置,值為WaterMan

繼續做NSMutableArray的練習吧~

參考:Objective-C 陣列物件NSArray Class ReferenceObjective-C 入門指南 – NSArray

[Objective C] Hello World

早在六月份的時候就開始學Objective C,然而在此刻來做點記錄,也就是讓Objective C來跟大家說「Hello World」。

(繼續閱讀…)

[Blender] 物理系統 (Physics System)

為了讓做出來的動畫盡可能符合真實情境,在物體中植入物理系統成了關鍵,Blender可以做到力場、軟體、碰撞、液體、布料、煙霧、動態繪畫等物理效果。Blender教學:物理系統 (Physics System)

(繼續閱讀…)

[Blender] 粒子系統 (Particle System)

常看到電視節目一些真實的煙霧特效,熱的時候往上飄,冷的時候往下墜,營造出地獄天堂般的氣氛。然而在電腦科技發達的年代,使用特效製作軟體即可產生似真似假的效果,不僅可以產生煙霧,還可產生雨滴,甚至一個物體可以有無限多個分身,在這Blender軟體中的粒子系統就可以做的出來。Blender教學:粒子系統 (Particle System)

(繼續閱讀…)

[Blender] 影片貼圖

時常會在電視上會看到,主播的旁邊有個電視模型,它會像我們家的電視機一樣,播放著一系列的新聞報導,讓觀眾看起來覺得很新奇!其實這樣子的效果Blender做的出來,而且還相當簡單,只要我們把電視模型給做出來,再貼上影片貼圖就完工了。Blender教學:影片貼圖

(繼續閱讀…)

[Blender] 製作動畫

Blender除了可以從無到有建造模型之外,還可以進一步製作動畫呢!這篇我想要以下面六張圖來製作100影格的動畫,順序從左到右、上到下,以一個Cube模型來移動、縮放、旋轉、變色,Blender教學:製作動畫


(繼續閱讀…)

[Blender] 法向量貼圖與太空隕石

法向量貼圖 (Normal Texture)其實就是Bump Map (凹凸貼圖),原理與效果可以參考我這篇:Bump Map (2),簡單來說凹凸貼圖是以貼圖 (Texture)來改變物質原有的法向量,接著經過光源照射後,讓物質產生凹凸不平的錯覺。

接著想製作真正凹凸不平的太空隕石,原理與效果可以參考我這篇:位移映射 (Displacement Mapping),Blender教學:法向量貼圖與太空隕石

(繼續閱讀…)

[Blender] 鏡射光著色器 (Specular Shader)

鏡射光著色器 (Specular Shader)能夠產生亮點,讓我們看到光滑的表面模仿光源的反射,不像漫射光著色,鏡射光反射視角有關係,也就是說從不同方向看同一表面,會有不太一樣的效果。根據Snell’s Law,光打到鏡射表面將會以入射角等於反射角來反射,這使得視角變得相當重要。如下圖所示。可參考:漫射光著色器 (Diffuse Shader)以瞭解兩者差異。

(繼續閱讀…)

[Blender] 漫射光著色器 (Diffuse Shader)

簡單來說,漫射光著色器 (Diffuse Shader)決定物質被光照到的顏色,大多數的著色器用來模仿現實物質,從亮處到暗處平滑衰減,Blender的漫射光著色器有幾種特殊效果,如Lambert、Oren-Nayar、Toon、Minnaert、Fresnel,這些名字聽起來有點奇怪,事實上多是以第一個引進該model的人名來命名。

(繼續閱讀…)

標籤雲