Hatena::Groupiphone-dev

BLUEPALACE.COM iPhone専科

2008-11-15CGContextDrawImage このエントリーを含むブックマーク

私はゲームを作ろうとしているのですが、コーディングでは色々な問題…

つか、スキル不足で悩む事があります。

やりたい事は、png ファイルをてきとーに置き、CGContextAddRect やら CGContextAddLineToPoint で

2D描画しつつ音を鳴らす。

でもって touch系でイベントを取るつー感じ。

今回は png の描画を行ったのですが、他の方同様に落とし穴にハマりました(笑

		UIImage *img = [UIImage imageNamed:@"man_body.png"];
		charaImage = CGImageRetain(img.CGImage);
		CGRect imageRect;
		imageRect.origin = CGPointMake(100.0, 24.0);
		imageRect.size = CGSizeMake(24.0, 48.0);		
		CGContextDrawImage(layerContext, imageRect, charaImage);

はい…

上下が逆向きになった絵が置かれましたね!

iPhone-Dev の方の日記を読むに、UIImage の draw系イベントを使えば良いとの事…

やってみましたが、あれ? 描画されない…

Layer を用いていると別のやり方じゃねーとダメなのか?

どーもグラフィック系は面倒だな〜と思いつつ、他に良い手はないもんかと google

で、下記の方が有益な情報を記載しておられた!

http://d.hatena.ne.jp/It_lives_vainly/20081111

「イメージ描画時の注意点」で補正のサンプルを記載してくれているので参考にさせてもらい

下記のようにコードを変更〜

		UIImage *img = [UIImage imageNamed:@"man_body.png"];
		charaImage = CGImageRetain(img.CGImage);
		CGRect imageRect;
		imageRect.origin = CGPointMake(100.0, 24.0);
		imageRect.size = CGSizeMake(24.0, 48.0);
		// 偉い人の記述
		CGAffineTransform a_tr = CGAffineTransformIdentity;
		a_tr.d = -1.0f;
		a_tr.ty = imageRect.origin.y + imageRect.size.height;
		CGContextConcatCTM( layerContext, a_tr );
		// 偉い人終わり
		
		CGContextDrawImage(layerContext, imageRect, charaImage);

なんということでしょう〜(ビフォーアフター風)

今まで逆さまだったイメージが正位置で表示されます。タロットカードの逆位置みたいなんではありません!

が、しかし

以降の線やら四角やらの描画ができなくなってました(汗

あーあーあー もうね。どうよ、このグダグダ感じ。

CGAffineTransform を元に戻してやれば良いのかな?


などと考えていましたが、テキスト描画の時の記述を思い出しました。

CGContextSaveGState( layerContext );

これよ! 現在のコンテキストの状態を保存しとくやつ。

これで挟もう!

なので、最終的には…

		CGContextSaveGState( layerContext ); //ちょっと保存しとく!
		UIImage *img = [UIImage imageNamed:@"man_body.png"];
		charaImage = CGImageRetain(img.CGImage);
		CGRect imageRect;
		imageRect.origin = CGPointMake(100.0, 24.0);
		imageRect.size = CGSizeMake(24.0, 48.0);
		
		CGAffineTransform a_tr = CGAffineTransformIdentity;
		a_tr.d = -1.0f;
		a_tr.ty = imageRect.origin.y + imageRect.size.height;
		CGContextConcatCTM( layerContext, a_tr );
		
		
		CGContextDrawImage(layerContext, imageRect, charaImage);
		CGContextRestoreGState(layerContext);  // 戻す!
		[self setNeedsDisplay]; //描く!!

これで以降の描画も問題無く行える。

png 置く際は毎回コレやりゃいいんじゃね?

これでいってみようか…

こんなあほうな blog 書いてたらアプリリリース時にマイナスイメージしかねんじゃね?

ま、いいか…

---追記---

よくよく見たら、偉い人が既にコンテキストのセーブしてた…

うへwww 参考にさせてもらうならちゃんと読めよ>自分

---追記2---

あれ… y座標が変化しねぇ。。。

がちがち2011/03/03 17:49CGAffineTransformRotateをつかって時計の針の画像をぐるぐるまわしたいんですが
基点などどのように記述すればよいですか?

こんな感じで書いています。

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:10.0];

CGAffineTransform tranceform = CGAffineTransformRotate(CGAffineTransformIdentity, M_PI_4);
loadingHari.transform = tranceform;
[UIView commitAnimations];

[self.view addSubview:loadingHari];

ご教授頂ければ幸いです。
宜しくお願い致します。

RosangelaRosangela2012/02/07 07:50You Sir/Madam are the enemy of confusion everwhyere!

cwhyuwlarpcwhyuwlarp2012/02/07 18:38lEzP1l <a href="http://avcqjljwpllg.com/">avcqjljwpllg</a>

jerylpjmryjerylpjmry2012/02/11 01:10Yj2ofO <a href="http://wprtagqxawjy.com/">wprtagqxawjy</a>

sifpjakzmsifpjakzm2012/02/12 04:11gQj6uh , [url=http://maowqgkxpphj.com/]maowqgkxpphj[/url], [link=http://vsqnuihkxbfk.com/]vsqnuihkxbfk[/link], http://eyofucmyybym.com/