ページ 1 / 1
objective-cでRPG開発
Posted: 2011年4月18日(月) 16:59
by kira
こんにちは
私はiphoneのRPGアプリを作りたい一心でMacを購入し、Objective-cを勉強している者です。
こちらの質問掲示板はもちろん、webで検索、多数のiphoneプログラミング関係の書籍などで3ヶ月ほど調べましたが
どうしてもできないことがあり、勇気を振り絞って質問させて頂きます。
非常に初歩的な質問なんですが2DのRPGのマップを作成しようとしているのですが、他のwebやObjective-c以外の開発環境で
マップデータを
1,0,0,0,0,1
1,0,0,0,0,1
1,0,0,0,0,1
1,0,0,0,0,1
のようにテキスト形式でマップデータを作成し、それをマップチップに変換そして表示ということがObjective-cでできません。
アプリ開発等の書籍を読みあさってもinterface builderの使っての画像の表示などしかなく、途方にくれている状態です。
何卒、ご教授のほどよろしくお願いします。
開発環境
Mac book
X code
Objective-c
Re: objective-cでRPG開発
Posted: 2011年4月18日(月) 18:06
by 2³
こんにちは。
僕も最近iPhone開発始めて頑張ってます!
kira さんが書きました:書籍を読みあさってもinterface builderの使っての画像の表示などしかなく
画像表示は、ついこの間ここでめるぽん様に教えていただきました。
http://dixq.net/forum/viewtopic.php?f=3 ... %BA#p66735
drawRect: を使えば出来そうですよ。
あと、マップデータの件は、僕は配列を使って直接コードに入れているので分かりません;;
すみません;
Re: objective-cでRPG開発
Posted: 2011年4月18日(月) 19:25
by kira
black_catさん
早速のご回答ありがとうございます。こんなの早く回答頂けるとは思っていませんでした。
black_cat さんが書きました:あと、マップデータの件は、僕は配列を使って直接コードに入れているので分かりません;;
すみません;
もし差し支えなければで結構ですので、black_catさんの”配列を使って直接コードに入れる”方法もお教えいただけませんでしょうか?
配列とは
int map[5][5]= {
(こんなでしたっけ)
のような2次元配列のことでしょうか?
よろしくお願いします
Re: objective-cでRPG開発
Posted: 2011年4月18日(月) 21:59
by 2³
はい。そうですよ^^
コード:
int map[5][5] = {
{1,0,0,0,0,1},
{1,0,0,0,0,1},
{1,0,0,0,0,1},
{1,0,0,0,0,1}
};
となります。
値の取得は、map[y][x]で出来ます。
あとは、値が0であれば草原、1であれば岩を配置する等にしていくといいと思います。
それと、1であれば通行禁止、2であればイベント(今回はありませんが)にするなどで、マップはOKですね。
と、雑談ですが、Macっていいですよね!
僕もiPhone開発のために買いましたw
Re: objective-cでRPG開発
Posted: 2011年4月18日(月) 22:20
by lbfuvab
ソース内に直接データを書くのは、ゲームが大きくなると限界が出てくると思います。
「iphone ファイルアクセス」とかググるとそれっぽいのがヒットします。参考程度にどうでしょう。
>あとは、値が0であれば草原、1であれば岩を配置する等にしていくといいと思います。
>それと、1であれば通行禁止、2であればイベント(今回はありませんが)にするなどで、マップはOKですね。
ビット単位の演算を使うと良いかもしれません。
下位1bitは通行可能or不可能
下位2~5bitはどのマップチップを使うか
下位6bitからはイベント判定用
みたいな感じで。
Re: objective-cでRPG開発
Posted: 2011年4月19日(火) 12:43
by kira
black_catさん、lbfuvabさん
懇切丁寧なご返答ありがとうございます。
black_catさんに教わった2次元配列を早速試してみたのですが
こんな感じで
#import "UntitledViewController.h"
@implementation UntitledViewController
int map[5][5] = {
{1,0,0,0,1},
{1,0,0,0,1},
{1,0,0,0,1},
{1,0,0,0,1},
{1,0,0,0,1}
};
const int maplength_i = sizeof map / sizeof map[0];
const int maplength_j = sizeof map[0] / sizeof map[0][0];
for (int i = 0;i < mapLength_i ; i++) { //この部分です
for (int j = 0;j < mapLength_j ; j++) {
NSLog(@"%d",map
[j]);
}
}
とりあえず2次元配列の値を表示させる事を第1目標でやりましたが上記 1つ目のfor文で
1 Expected identifier or '(' before 'for'
2 Expected '=' , ',' , ';' , 'asm' or '_attrilbute_' before '<'token
3 Cannot find protocol declaration for 'mapLength_i'
4 Expected '=' , ',' , ';' , 'asm' or '_attrilbute_' before'++'token
以上4つのエラーが出てしまいました。
webで検索したところ”for”の前にあるはずの”(”がないから、又は変数の宣言がされていない等の事が書かれていましたが
いまいち原因がつきとめられません。そしてblack_catさんは具体的に、ここからどのような方法でマップチップを各配列に割り当てていますか?
度重なる質問申し訳ありません。
よろしくお願いします。
lbfuvabさん
lbfuvab さんが書きました:iphone ファイルアクセス」
とは例えば、テキストファイル等をリソースフォルダに格納して、それをプログラム上で読み込んで表示させるということですか?
lbfuvab さんが書きました:ビット単位の演算を使うと良いかもしれません。
下位1bitは通行可能or不可能
下位2~5bitはどのマップチップを使うか
下位6bitからはイベント判定用
みたいな感じで。
ありがとうございます。上記の2次元配列の値の取り出しと合わせて、lbfuvabさんの方法もwebや手元にある書籍等を
見ながら勉強させて頂きます。
Re: objective-cでRPG開発
Posted: 2011年4月19日(火) 21:22
by 2³
なんかfor文とかの処理を、メンバとかと一緒のところに書いちゃいけないみたいです。
(自分はまだまだ勉強不足で詳しい解説はできませんが...)
なので、こんな感じでどうでしょう?
コード:
#import "UntitledViewController.h"
@implementation UntitledViewController
int map[5][5] = {
{1,0,0,0,1},
{1,0,0,0,1},
{1,0,0,0,1},
{1,0,0,0,1},
{1,0,0,0,1}
};
- (void)viewDidLoad {
[super viewDidLoad];
const int maplength_i = sizeof map / sizeof map[0];
const int maplength_j = sizeof map[0] / sizeof map[0][0];
for (int i = 0;i < maplength_i ; i++) {//この部分です
for (int j = 0;j < maplength_j ; j++) {
NSLog(@"%d",map[i][j]);
}
}
}
ViewがLoadされたときにforの処理が行われます。
Re: objective-cでRPG開発
Posted: 2011年4月19日(火) 21:25
by 2³
>lbfuvabさん
lbfuvab さんが書きました:ソース内に直接データを書くのは、ゲームが大きくなると限界が出てくると思います。
おお、そういう理由でマップデータを別にするのですね!
Windowsでも大きいものを作ったことがないので気づきませんでした!
僕も勉強になりました。
Re: objective-cでRPG開発
Posted: 2011年4月19日(火) 21:31
by 2³
kira さんが書きました:ここからどのような方法でマップチップを各配列に割り当てていますか?
ええと、僕はRPGを作っている訳ではないので(ただ、データ上でのマップ移動はしました。)、マップチップは使ってないのですが、
ちょっと考えてみますね。
Re: objective-cでRPG開発
Posted: 2011年4月19日(火) 22:09
by 2³
コード:
for (int i = 0;i < maplength_i ; i++) {
for (int j = 0;j < maplength_j ; j++) {
switch (map[i][j]) {
case 0:
(j * マップチップのxサイズ, i * マップチップのyサイズ) に草原描画
break;
case 1;
(j * マップチップのxサイズ, i * マップチップのyサイズ) に岩描画
break;
default:
break;
}
}
}
でどうでしょうか?
試してないので分かりませんが...
Re: objective-cでRPG開発
Posted: 2011年4月20日(水) 22:15
by kira
こんばんわ
毎日の質問責め、申し訳ありません。
black_catさんのお教えどうりにやったところ2次元配列のソース、コンパイル通りましたが
画面に何も表示されませんでした。しかしエラーが出なかっただけでもすごくうれしいです。
今、原因をつきとめようとgoogleで検索しながら勉強しているところです。うーん、道は険しいですね
Re: objective-cでRPG開発
Posted: 2011年4月21日(木) 20:07
by 2³
http://dixq.net/forum/viewtopic.php?f=3 ... %BA#p66735
のNO.7でめるぽんさんが仰っている作業はされましたか?
あと、上で
(j * マップチップのxサイズ, i * マップチップのyサイズ) に草原描画
と言いましたが、正式にはここで再描画の命令を出してください。
リンクのNO.10でめるぽんさんに教えていただきました。
めるぽん さんが書きました:drawRect: は、再描画が必要になったときに「システムが」 呼び出すもので、自分で直接呼び出すものではないです。
自分で指定した場所に描画したい場合は、メンバに持たせるなりして下さい。
あと再描画が必要な場合も drawRect: を直接呼び出してはいけないです。そういう場合には setNeedsDisplay を使って下さい。
setNeedsDisplay はシステムへ再描画を要求する命令で、そうすると、どこかのタイミングでシステムが drawRect: を呼び出してくれます。
Re: objective-cでRPG開発
Posted: 2011年4月21日(木) 22:04
by kira
こんばんわ
black_catさん お世話になります
めるぽんさんの仰っていた内容なのですが私が無知ゆえに、正直に申しますと良く理解できずにいます。
見よう見まねでソースを書いてみたのですが・・・・。
非常にお恥ずかしい限りです。当然のごとく多数のエラーが発生しました。
明日から一週間、仕事の関係でパソコンができない状況になってしまいますので
iphoneでwebの閲覧そして書籍をもう一度読み直します。
テンパってこんなになってしまいました
コード:
//UntitleViewController.h
#import <UIKit/UIKit.h>
@interface UntitledViewController : UIViewController {
}
@end
@interface HogeView : UIView {
}
@end
//UntitleViewController.m
#import "UntitledViewController.h"
@implementation UntitledViewController
int map[5][5] = {
{1,0,0,0,1},
{1,0,0,0,1},
{1,0,0,0,1},
{1,0,0,0,1},
{1,0,0,0,1}
};
-(void)viewDidload {
[super viewDidLoad];
HogeView *mori,*sougen=[[[HogeView alloc]
[mori,sougen drawRect];
const int mapLength_i = sizeof map / sizeof map[0];
const int mapLength_j = sizeof map[0] / sizeof map[0][0];
for (int i = 0;i < mapLength_i ; i++) {
for (int j = 0;j < mapLength_j ; j++) {
switch (map[i][j]) {
case 0:
HogeView mori=[[[HogeViewalloc]initWithFrame:self.view.bounds]autorelease];
[self setNeedsDisplay:YES];
break;
case 1:
HogeView sougen=[[[HogeViewalloc]initWithFrame:self.view.bounds]autorelease];
[self setNeedsDisplay:YES];
break;
default:
break;
}
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
- (void)viewDidUnload {
}
- (void)dealloc {
[super dealloc];
}
@end
@implementation HogeView
-(void)drawRect:(CGRect)rect {
UIImage *mori=[UIImage imageNamed:@"森1.png"];
UIImage *sougen=[UIImage imageNamed:@"草原.png"];
[mori,sougen drawAtPoint:CGPointMake];
}
@end
Re: objective-cでRPG開発
Posted: 2011年4月22日(金) 19:29
by 2³
UntitleViewController.hのほうはそれでいいと思います。
kira さんが書きました:テンパって
まぁ急いでいるのでなければ落ち着いていきましょう;
とりあえずコードを書いてみました。
自分でもこんな感じでいいのかよく分からないのですが...
UntitleViewController.m
コード:
#import "UntitledViewController.h"
int x, y, kind; // x,y・・・マップチップの座標 kind・・・マップチップの種類
UIImage *sougen, *mori;
@implementation UntitledViewController
int map[5][5] = {
{1,0,0,0,1},
{1,0,0,0,1},
{1,0,0,0,1},
{1,0,0,0,1},
{1,0,0,0,1}
};
- (void)viewDidLoad {
[super viewDidLoad];
HogeView *view = [[[HogeView alloc] initWithFrame:self.view.bounds] autorelease];
[self.view addSubview:view];
sougen = [UIImage imageNamed:@"草原.png"];
mori = [UIImage imageNamed:@"森1.png"];
[view setNeedsDisplay];
}
@end
@implementation HogeView
- (void)drawRect:(CGRect)rect {
const int maplength_i = sizeof map / sizeof map[0];
const int maplength_j = sizeof map[0] / sizeof map[0][0];
for (int i = 0;i < maplength_i ; i++) {
for (int j = 0;j < maplength_j ; j++) {
kind = map[i][j];
switch (kind) {
case 0:
x = j * sougen.size.width;
y = i * sougen.size.height;
[sougen drawAtPoint:CGPointMake(x, y)];
break;
case 1:
x = j * mori.size.width;
y = i * mori.size.height;
[mori drawAtPoint:CGPointMake(x, y)];
break;
default:
break;
}
}
}
}
@end
えっとー、、、
まず、kiraさんの書かれたコードでは、drawRectの中のdrawAtPointで、
座標が指定されていませんよね?
これではMacが困ってしまうんで、ちゃんと指定してあげましょう。
それと、forの意味がなくなってしまっています。
ただ同じように何度も再描画するようになっています。
そのほか色々直してみたので、よかったら試してみてください^^
kira さんが書きました:明日から一週間、仕事の関係でパソコンができない状況になってしまいますので
そうですか。では、お帰りになられてから試してみてくださいね!
[編集]ミスを訂正
Re: objective-cでRPG開発
Posted: 2011年4月22日(金) 21:44
by kira
black_catさん
こんばんは、御世話になります
配列要素の取り出しや描画の仕方、ソースの構成等々
大変勉強になります。black_catさんのソースの中身を本を
片手に繰り返し勉強させて頂きます。
一週間後の帰宅が楽しみです。
Re: objective-cでRPG開発
Posted: 2011年4月30日(土) 12:52
by kira
black_catさん
こんにちは
お久しぶりです。一週間ぶりに仕事から戻り、早速教わったコード試してみました。
コンパイルは通ったのですが画面になにも表示されませんでした。
コード:
switch (kind) {
case 0:
x = j * sougen.size.width;
y = i * sougen.size.height;
[sougen drawAtPoint:CGPointMake(x, y)];
break;
case 1:
x = j * mori.size.width;
y = i * mori.size.height;
[mori drawAtPoint:CGPointMake(x, y)];
break;
default:
break;
sougen,mori の size の部分はマップチップの実際の大きさ(数字)を入れるのですか?
ちなみに 32 * 32 でとりあえず作ってます。
お忙しいところ申し訳ありません。
Re: objective-cでRPG開発
Posted: 2011年4月30日(土) 16:59
by 2³
kira さんが書きました:コンパイルは通ったのですが画面になにも表示されませんでした。
あれ?おかしいですね...
僕の環境では描画されてます。
XcodeでちゃんとResourcesに画像を追加していますか?
あと、プロジェクトのテンプレートは何ですか?
kira さんが書きました:sougen,mori の size の部分はマップチップの実際の大きさ(数字)を入れるのですか?
いえ、そのままで動きますよ。
32と書いても同じですけどね^^
Re: objective-cでRPG開発
Posted: 2011年4月30日(土) 19:22
by kira
こんばんわ
black_catさん お世話になります。
今、再び試しているのですが
black_cat さんが書きました:XcodeでちゃんとResourcesに画像を追加していますか?
はい追加しております。画像の追加はResourcesに”ドラッグドロップ”又は”右クリック→
追加→既存のファイル”でOKですよね?
black_cat さんが書きました:あと、プロジェクトのテンプレートは何ですか?
x code ver 3.2.5
View-based Applicationです。
Re: objective-cでRPG開発
Posted: 2011年4月30日(土) 19:46
by 2³
kira さんが書きました:x code ver 3.2.5
View-based Applicationです。
んー...
僕も同じなのですけどねー。
困りました。なぜ描画されないのでしょうかねーf(^_^;;)
Re: objective-cでRPG開発
Posted: 2011年4月30日(土) 20:26
by kira
black_catさん
度々すいません
こちらinterface bilderでxibファイルの方は何もいじらなくて大丈夫ですよね?
Re: objective-cでRPG開発
Posted: 2011年4月30日(土) 21:01
by 2³
はい。大丈夫なはずなんですが...
僕がXcodeからこのサイトにコピペする時にどこかが抜けたのかと思い、
今度は新規プロジェクトを作って、自動生成のコード削除&このサイトからXcodeにコピペしてみたのですが、ちゃんと描画されました。
xibはいじってません。
そこで、差し支えなければkiraさんのプロジェクトを添付してもらえないでしょうか?
Re: objective-cでRPG開発
Posted: 2011年4月30日(土) 21:34
by kira
black_catさん
black_cat さんが書きました:そこで、差し支えなければkiraさんのプロジェクトを添付してもらえないでしょうか?
願ってもございません。ぜひお願いしたいのですが情けない事に添付の仕方がわかりません。
使用したことがないのですがファイルアップローダーですか?
Re: objective-cでRPG開発
Posted: 2011年4月30日(土) 22:11
by kira
すいません
できました。よく確認もせずに申し訳ありません
よろしくお願いします
Re: objective-cでRPG開発
Posted: 2011年4月30日(土) 22:30
by 2³
間違っている箇所が分かりました!
viewDidLoadがviewDidloadになってました!
Objective-Cは大文字と小文字を区別しますよ^^
Re: objective-cでRPG開発
Posted: 2011年4月30日(土) 23:05
by kira
black_catさん
うおおおおおーーー!!
表示できましたあ!!
このお礼は何て申し上げていいのやら・・・・
簡単な入力ミスで多大なご迷惑をおかけしてしまい申し訳ありませんでした。
black_catさんには貴重なお時間を割いて頂いて心の底から感謝しております。
IOSシミュレーターの画面にマップが表示された瞬間、雄叫びをあげてしまいました。
(といっても全てblack_catさんのコードを真似しただけですが・・・あと近所迷惑)
私もたくさん勉強してblack_catさんの様に人に教えられるぐらいのレベルに早くなりたいです。
本当に本当にありがとうございました、重ねてお礼申し上げます。
Re: objective-cでRPG開発
Posted: 2011年4月30日(土) 23:17
by 2³
kira さんが書きました:black_catさんの様に人に教えられるぐらいのレベル
僕はまだまだレベル低いですよw
ほぼ初心者ですからf(^_^;;)
まぁでも解決できたようで何よりです^^
kira さんが書きました:IOSシミュレーターの画面にマップが表示された瞬間、雄叫びをあげてしまいました。
その気持ち、とっても分かります!!
やりたかったことが出来たときって本当にうれしいですもんね。
あと、余裕があればlbfuvabさんが仰ってたやり方もやってみてくださいね。
そのほうがよいみたいですので。
ではお互いiPhone開発、頑張っていきましょう!