[Objective-C] 連番スプライト定義

このQ&Aのポイント
  • Objective-CのCocos2dフレームワークで簡単なテスト用アプリを製作中なのですが、以下の様なスプライト定義を連番画像で行いたいと考えています。
  • スプライト定義からレイヤー追加までの処理を大量の画像について一括で行いたい場合、for文などを使用して条件式のiの値をファイル名やインスタンス変数の「S●」の部分に利用できます。
  • PHPについては多少の編集経験がありますが、Objective-Cが初めてで具体的な記述方法がわかりません。詳しい方に教えていただけると助かります。
回答を見る
  • ベストアンサー

[Objective-C] 連番スプライト定義

こんにちは。 Objective-CのCocos2dフレームワークで簡単なテスト用アプリを製作中なのですが、 以下の様なスプライト定義をs1.png、s2.png、s3.png、s4.png、・・・といった連番画像でそれぞれで行いたいと考えています。 //■■■ レイヤーAを作成 ■■■ CCLayer *layerA = [CCLayer node]; [self addChild: layerA]; CGSize winSizeSprite = [[CCDirector sharedDirector] winSize]; //スプライトS1を生成 CCSprite *sampleSpriteS1 = [CCSprite spriteWithFile:@"s1.png"]; sampleSpriteS1.position = CGPointMake(winSizeSprite.width/2, winSizeSprite.height/2);   ・   ・   ・ [layerA addChild:sampleSpriteS1];//レイヤーAに追加 この「スプライト定義」から「レイヤー追加」までの処理を大量の画像について一括で行いたい場合、for文などを使用して条件式のiの値をファイル名やインスタンス変数の「S●」の部分に利用出来そうな気がするのですが、ダイレクトな説明の載っている参考書やWEBサイトが見つからず、具体的な記述法がわかりません。 当方、PHPについては多少の編集経験があるのですが、プログラミングについてはObjective-Cが初めてです。 上記記述法ご存知の方、ご教示頂けませんでしょうか。 宜しくお願い致します。

noname#209843
noname#209843

質問者が選んだベストアンサー

  • ベストアンサー
noname#177743
noname#177743
回答No.1

インスタンス変数については、NSArrayやNSDictionaryなどのコレクションで管理すればよいと思います。NSArrayなら番号で管理できますから。読み込むファイル名は、[NSString stringWithFormat:@"s%d.png",i]; みたいな感じで生成すればいいでしょう。

noname#209843
質問者

お礼

お早いご回答有難うございました。 なるほど、ファイル名についてはNSStringをそのまま埋め込む形で導入出来るんですね。お蔭様で想定通りの組み込みが出来ました。 大きな疑問が解決して、今夜はよく眠れそうです。(笑)

関連するQ&A

  • objective-cにはCのような関数はない?

    c言語とobjective-cを並行して勉強しています。 c言語では機能をまとめるために関数を定義できますよね。 ----- void display(int a){ printf("%d" , a); } int main(void){ display(10); } --- これでdisplayという関数に10という引数を渡して表示させることができますよね? objective-cの場合は例えば以下のように書くことがわかり、コンパイルも通りました。 - (void)display{ NSlog(@" TEST "); } しかし・・・・呼び出すことができませんね。。。 objective-cの場合は[ インスタンス メソッド名 ]; のような呼び方なのですよね。 メソッドだけを呼び出すことはできない、ってことなのでしょうか・・・? 色々検索してみたのですが、 @implement~@endで囲んでクラスにして インスタンスを作って、メソッドを呼ぶ方法ばかりで、 上記のC言語の例のような、単純な関数定義→呼び出しの方法を見つけることができませんでした。 上記のようなC言語の例はよくあると思うのですが、 これと同じことがobjective-cで、できるともできないとも、書いてないように思います。 例えば上のc言語と同じ動作をobjective-c に移植するとどうなるのでしょうか・・・?というか、不可能、ということでしょうか・・・?

  • PHPのsubstr関数をC++とObjective-C++に置き換え

    PHPのsubstr関数をC++とObjective-C++に置き換える方法 ・PHP $s = "abcdefg"; $t = substr($s, 3, 2); というPHPのソースから C++と Objective-C++に変更したいのですが どう記述すればよいのでしょうか? ・C++ char s[] = "abcdefg"; ??? ・Objective-C++ iOSは3.2です。 NSString *s = @"abcdefg"; ???

    • ベストアンサー
    • Mac
  • Objective-C ボタンを動かすには

    Objective-Cはまったくの初心者で、iPhone用のアプリを作るのに書籍を見ながらサンプルをいじっています。 画像をタップしたらその画像自体が動くようなものを作りたいのですが、 RoundRectButtonを1個だけ配置して 【imageTestViewContollorer.h】 @interface imageTest1ViewController : UIViewController { IBOutlet UIButton *myButton; } -(IBAction)tapBtn; @end 【imageTestViewContollorer.m】 @implementation imageTestViewController -(IBAction)tapBtn{ myButton.center=CGPointMake(50,50); [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:2]; myButton.center=CGPointMake(160, 240); [UIView commitAnimations]; } としてみましたが、コンパイルエラーなどはありませんでしたが、ボタンを押しても何も起こりませんでした。 IBOutlet UIButtonが臭いような気もしているのですが、UIImageViewにするとRoundRectButtonと線を繋げなくなりますし、どう直してよいか見当もつかず困っています。 画像がタップされたら動く、みたいなものをそもそもRoundRectButtonに画像を割り当てた方がいいのかImageViewにタップされた場合の処理を割り当てた方がいいのかどうかもよくわかりません。 よろしくお願いいたします。

  • 【Objective-C】文法 メソッドの定義について

    Objective-Cの勉強を始めたばかりの者です。 メソッドの定義について、混乱してきたので教えてください。 例えば、二つの数値を引数に与えるメソッドsetDataを作るとします。 このメソッドを以下のような方法で呼び出します。 id data; data = [[Data alloc] init]; [data setData:3:4]; この場合のメソッドの定義は以下の様になりますよね。 - (void)setData:(int)argx:(int)argy; 次にラベルを使った引数についてですが、 - (void)setData:(int)argx y(int)argy; と定義したら、呼び出しは、 [data setData:3 y:4]; となりますよね。 この記述に違和感を感じるんです。 ここまでは前ふりでして、以下が質問になるのですが、 メソッド名とは別に二つの引数用のラベルを設ける事ってできないのですか? つまりは、例えば、 [data setData x:3 y:4]; のような感じの記述です。 それとも、「ラベルを付けられるのは二つ目の引数から」ってのが仕様なんですか? 以上、ご指導のほど、宜しくお願いいたします。

  • objective-cとC++の連携

    cocos2dを使ってobjective-cの関数を呼び出したい場合、返り値がstringなどvoidでないときどう記述すればいいのでしょうか? //DBClassBridge.h string DBClassBridge::getStringColumn(string table, string field, string where, id target) { [DBClass_objc getStringColumn:[[[NSString alloc] initWithCString:table.c_str() encoding:NSUTF8StringEncoding] autorelease] field:[[[NSString alloc] initWithCString:field.c_str() encoding:NSUTF8StringEncoding] autorelease] where:[[[NSString alloc] initWithCString:where.c_str() encoding:NSUTF8StringEncoding] autorelease] target:(id)target];   //return ?? } returnのあとに何か入れる感じですかね? わかる人いたら是非お願いします。

  • Objective-cのextendedって,,?

    現在iPhone用アプリケーション開発の為、Objective-cの学習をしています。 その中で、UIAlertViewクラスのオブジェクトにテキストボックスを追加する方法を探していまして、見つけたソースコードの中のヘッダーファイルに @interface UIAlertView (extended) という記述がありました。 この(extended)とはどういう意味なのでしょうか? 分かる方居ましたら教えていただけるとうれしいです。

  • C(char *s1)の文字列をObjective-Cの文字列(NSS

    C(char *s1)の文字列をObjective-Cの文字列(NSString *s2)にするにはどうしたらよいのでしょうか? char s1[] = "abc"; NSString *s2 = [[NSString alloc] initWithUTF8String:s1];  // (A) NSLog(@"s2=[%s]", s2); 結果がabcかなと思っていましたが、読めない変な文字が表示されました。 (A)を NSString *s2 = [NSString stringWithFormat:@"%s", s1]; に変えても同じでした。 s1のC文字列は日本語を含まないアルファベットの文字列なのになぜ?と 困っています。 Objective-Cの初心者で申し訳ありません。

  • Objective-Cで、スレッドを作成したいのですが引数をどのように

    Objective-Cで、スレッドを作成したいのですが引数をどのように定義するのか構文がわかりません。 [NSThread detachNewThreadSelector:@selector(test) toTarget:self withObject:self]; // A - (void)test { NSLog(@"スレッド実行"); } ですが、 - (void)test(NSString *msg) { NSLog(@"スレッド実行 msg=[%@]", msg); } の場合のAの書き方です。

  • レイヤーの元位置をくずさずに別レイヤーへコピー

    Photoshop Elements 2.0で次のようなことをしたいのですが、うまく行う方法がわかりません。 フォトショップの使い方を解説しているサイトをいくつか見たのですが、解決できませんでした。 どなたか心得のおありの方がいらっしゃいましたら、ご教示いただければ幸いです。 【やりたいこと】 画像の大きさがいずれも600×800ピクセルの、背景画像とA.pngとB.pngがある。 A.pngとB.pngにはレイヤーがのっており、このレイヤーがある位置を動かすことなく、背景画像と統合したい。 【試したこと・詰まった点】  (1)背景画像の上にA.pngとB.pngを持ってくる  →持ってくるだけなら移動ツール(V)でできるが、それぞれのレイヤーがあった位置に持ってくることが難しい(目分量頼みになってしまう)。 (2)A.pngとB.pngの上に背景画像を持ってきて順序を入れ替える  →A.pngの上に背景画像を持ってくればAのレイヤーは動かさずにすむが、Bのレイヤーと同時にできない。 【こういうことができれば解決できる、と考えたこと】 ・AやBのレイヤーがある位置を記憶させる(そういう機能があれば) ・AやBのレイヤーがある位置を調べて、それを背景画像の上で再現する(左上隅から何ピクセルの位置にあるか、など) ・AやBのレイヤーの大きさを、画像の大きさ600×800ピクセルにあわせる(それぞれの透明な背景と統合する、など) ここにあげた以外の方法でもかまいませんので、何か手立てがありましたらぜひ教えてください。 よろしくお願いします。

  • objective-cで困っています教えてください

    objective-cをトライ&エラーで試しながら学習をしている初心者です。タッチした所を中心にまず100×100の正方形を表示し、その後スライダーで正方形の大きさを決めてから画像のトリミングをしたいのですが、正方形が表示されないのと、タッチした位置と切り取られる位置がずれています。上記の内容で行き詰っており、知恵をお借りしたいと思い投稿しました。宜しくお願いします。 ViewController.mの内容 #import "ViewController.h" @interface ViewController (){ // UILabel *label; // UIImageView *uv; //中心の位置 float v; // X座標 float x; // Y座標 float y; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //写真の表示 CGRect rect_uv = CGRectMake(0,20, 360, 360); UIImageView *imageView = [[UIImageView alloc] initWithFrame:rect_uv]; //画像のアスペクト比を維持しUIImageViewサイズに収まるように表示 imageView.contentMode = UIViewContentModeScaleAspectFit; UIImage *image = [UIImage imageNamed:@"hoge.png"]; [imageView setImage:image]; [self.view addSubview:imageView]; // UISliderのインスタンス化 CGRect rect_sd = CGRectMake(50, 400, 200, 10); UISlider *slider = [[UISlider alloc]initWithFrame:rect_sd]; // スライダーの最小値,最大値,値を設定 slider.minimumValue = 0; slider.maximumValue = 500; slider.value = 100; // スライドしている最中に値を調べられるようにする.デフォルトでYESだがサンプルのため slider.continuous = YES; // スライダーの値が変更されたときに呼ばれるメソッドを設定 [slider addTarget:self action:@selector(slider_ValueChanged:) forControlEvents:UIControlEventValueChanged]; // スライダーをビューに追加 [self.view addSubview:slider]; // ラベルの設置 CGRect rect_lb = CGRectMake(300, 400, 100, 30); label = [[UILabel alloc]initWithFrame:rect_lb]; [self.view addSubview:label]; // 標準ボタン例文 UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btn.frame = CGRectMake(50, 450, 100, 30); [btn setTitle:@"切り取り" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(trim:) forControlEvents:UIControlEventTouchDown]; [self.view addSubview:btn]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } /** * スライダーの値が変更されたとき */ - (void)slider_ValueChanged:(id)sender { UISlider *slider = sender; // スライダーの値をログに記述 NSLog(@"スライダーの値:%f", slider.value); // ラベルのテキストを設定 //float v = slider.value; v = slider.value; label.text = [NSString stringWithFormat:@"%2.f",v]; //四角形を描画 CGContextRef context = UIGraphicsGetCurrentContext(); // コンテキストを取得 CGContextStrokeRect(context, CGRectMake(x,y,v,v)); // 四角形の描画 } /** * タッチされたとき */ - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // 1.anyObjectメソッドでいずれか1つのタッチを取得 // 2.locationViewメソッドで対象となるビューのタッチした座標を取得 CGPoint p = [[touches anyObject] locationInView:self.view]; x = p.x; // X座標 y = p.y; // Y座標 NSLog(@"タップ開始 %f, %f", x, y); //四角形を描画 CGContextRef context = UIGraphicsGetCurrentContext(); // コンテキストを取得 CGContextStrokeRect(context, CGRectMake(x,y,100,100)); // 四角形の描画 } /** * 切り取りボタンが押されたとき呼ばれるtrimメソッド */ -(void)trim:(UIButton*)button{ // ここに何かの処理を記述する // (引数の button には呼び出し元のUIButtonオブジェクトが引き渡されてきます) // 切り抜き元となる画像を用意する。 //UIImage *srcImage = /* UIImagePickerなどから取得したUIImage */ UIImage *srcImage = [UIImage imageNamed:@"hoge.png"]; // 切り抜く位置を指定するCGRectを作成する。 CGRect trimArea = CGRectMake(x, y, v, v); // CoreGraphicsの機能を用いて、 // 切り抜いた画像を作成する。 CGImageRef srcImageRef = [srcImage CGImage]; CGImageRef trimmedImageRef = CGImageCreateWithImageInRect(srcImageRef, trimArea); UIImage *trimmedImage = [UIImage imageWithCGImage:trimmedImageRef]; // 画像表示例文 //UIImage *img = [UIImage imageNamed:@"hoge.png"]; UIImageView *iv = [[UIImageView alloc] initWithImage:trimmedImage]; [self.view addSubview:iv]; } @end

専門家に質問してみよう