万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

Creating Games with Unity and Maya



AndroidのPhoneGap記事

http://www.atmarkit.co.jp/fsmart/articles/phonegap01/02.html

Objctive-C size_t用フォーマット文字

size_t型をprintfやsprintfで表示するときの「変換指定文字」は、"%zd"のように、"z"を使用する

CGImageRef image = [UIImage imageNamed:@"moji_tex.png"].CGImage;	
NSLog(@"%zd%zdの大きさ", CGImageGetWidth(image),CGImageGetHeight(image));

NSLogでもつかえる!「d」を忘れずに。

「Objctive-C OpenGL ES」 CGImageRefを行えば必ずCGImageReleaseを行え

http://d.hatena.ne.jp/masatoshisw20/20081220/1229727292

CGImageRef hogeImg = HogeShori;
// 略
CGImageRelease(hogeImg);

CGImageRefをやったら、CGImageReleaseをしないといけないみたい?

The resulting image retains a reference to the original image, so you may release the original image after calling this function.

ドキュメントに↑が記載されているらしい。

書籍「OpenGLで作る Android SDKゲームプログラミング」のloadImageでは抜けてるのでメモリリークしそう。

Objctive-C OpenGL ES上で日本語などの文字を書く(修正版)

まだ修正が必要と思いますが、コメントください。

// 文字を書く
GLuint createCharTexture(NSString* str);
GLuint createCharTexture(NSString* str, int size);
GLuint createCharTexture(NSString* str, int size, int r, int g, int b, int a);

↑書籍「OpenGLで作る Android SDKゲームプログラミング」の「graphicUtil.h」とかに追加する。

// 文字を描画するテクスチャ
GLuint createCharTexture(NSString* str){
	return createCharTexture(str, 2); // デフォは2(中)
}
GLuint createCharTexture(NSString* str, int size) {
	return createCharTexture(str, 2, 255, 255, 255, 255); // デフォルトの文字色白、大きさは2(中)
}
// sizeは1・2・3(小・中・大)※4以上もできるが大きすぎると変になるかも?
GLuint createCharTexture(NSString* str, int size, int r, int g, int b, int a) {
	
	GLuint texture;
		
	//画像の大きさをを決める(縦横は2の倍数で同じ数字に揃える)
	size_t width = 512, height = 512;
	
	GLubyte* imageData = (GLubyte *) malloc(width * height * 4);
	//	RGBの描画領域作成。
	CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
	CGContextRef imageContext = CGBitmapContextCreate(imageData, width, height, 8, width * 4, colorSpace, kCGImageAlphaPremultipliedLast);
	CGColorSpaceRelease(colorSpace);
	CGImageRef reflectRGBCGImageRef	= CGBitmapContextCreateImage(imageContext);
	CGContextDrawImage(imageContext, CGRectMake(0, 0, (CGFloat)width, (CGFloat)height), reflectRGBCGImageRef);

	// 文字列を描画
	UIFont *tFont = [UIFont systemFontOfSize:25 * size];
	UIGraphicsPushContext(imageContext);
	UIColor *color = [UIColor colorWithRed:r/255.0f green:g/255.0f blue:b/255.0f alpha:a/255.0f];
	[color set];
	// テクスチャへ文字を記載(UIKitとCoreGraphics間の問題?座標系のY軸の上下反転される対策)
	CGContextScaleCTM(imageContext, 1, -1);
	CGContextTranslateCTM(imageContext, 0.0f, -(double)480); // NSUInteger型なので、負の値が0にならないようにdouble
    
	CGPoint point = CGPointMake(0.0f, 0.0f);
	[str drawAtPoint:point  withFont:tFont];
	
	UIGraphicsPopContext();
	CGContextRelease(imageContext);
	
	// OpenGL用のテクスチャ生成
	glGenTextures(1, &texture);
	glBindTexture(GL_TEXTURE_2D, texture);	
	glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);
	// 開放
	CGImageRelease(reflectRGBCGImageRef);
	free(imageData);
	return texture;
}

「CGContextTranslateCTM(imageContext, 0.0f, -480.0f);」ではマジックナンバー(決め打ちの数字)を使用しているので縦横のサイズによって変更すべきです。
今回、縦×横を360×480にやってます。

使用方法

@interface Hoge : GameBase {
	GLuint mojiID;
}

Hoge.h

// initの準備
// 大きさ「1」で、RGBAを(255, 0, 0 ,255)の赤でアルファなし
mojiID = createCharTexture(@"書きたい文字", 1, 255, 0, 0 ,255);
or
// デフォルトの大きさ「2」になる
mojiID = createCharTexture(@"書きたい文字");
or
// 大きさ「3」になる
mojiID = createCharTexture(@"書きたい文字", 3);

// draw(描画)のところ 文字の位置はどうやるべきか・・・
float bg_width = 480.0f;
float bg_height = 320.0f;
drawTexture(bg_width/2, bg_height/2, bg_width, bg_height, serifu, 255, 255, 255, 255);

Hoge.m

今回、自動生成したのでmoji_tex.pngの画像を「Resources」に入れなくて良いです。

Hatena H3タグ用スタイルシート

デザイン変更してスタイルシートがリセットされたので今後のためのメモ

h3 {
border: 1px solid #666;
text-align: center;
background-color: #fff;
font-size: 18px;
color: #000;
margin: 0px;
padding: 5px;
}

Penelopeの覚書 Unityのチュートリアル用のため

iPhoneでの最初のタイトル画面での左から順で
◯TAP TO MOVE
左側に「ジャンプボタン」が1つあるつ
画面をタップした方向へ移動する
右側にボタンなし、カメラズームなし

◯CAMERA RELATIVE
左側に移動と方向転換を同時に行う「ジョイスティック」
右側にカメラの角度を切りかえ、垂直に押せばジャンプする「ジョイスティック」
「カメラ」は常にPenelopeを追尾し、ズームする

◯PLAYER RELATIVE
左側に移動のみ(↓キーは後ろ向いて背後で移動)して方向転換しない「ジョイスティック」
右側に方向転換だけするジョイスティック
左右の「ジョイスティック」を同時垂直押しでジャンプ
「カメラ」は常にPenelopeを追尾し、ズームする