ページ 11

objective-cでRPG開発

Posted: 2012年1月02日(月) 12:54
by kira
こんにちは
いつも楽しく勉強させて頂いております
私は約1年前にmacを購入し、objective-cで2DRPGを作成中のものです
以前こちらで質問をさせて頂いて

タイトル画面→キャラ作成画面→2次元配列にてマップ表示 

までなんとか辿りつく事ができました。(成長が遅い)
そして次の目標の

画面下にキャラ移動用の上下左右のボタン及び画面中央に主人公の表示→カーソル入力による当たり判定付き画面スクロール

を達成すべく勉強中ですが
初めの”画面下のボタン表示”で早速詰まっております。最近導入したxcode4.2のstoryboardにてマップ画面下にボタンを配置したものの、いざiosシミュを走らせるとボタンがマップの下に隠れてしまいます。そこでstoryboardを使わず手持ちのUIKit詳解リファレンスを読みながらソース上でボタンを追加してみましたがエラーが出てうまくいきません。

mainfield.h マップ画面の.h

コード:

#import <UIKit/UIKit.h>

@interface mainfield : UIViewController {

}

@end

@interface HogeView : UIView {
    
}

@end

mainfield.m マップ画面の.m

コード:

#import "mainfield.h"


int x,y,kind;

UIImage *sougen,*mori,*umi,*player;

@implementation mainfield

int map[30][30] = {
   
    {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
    {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},    
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},       
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},    
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},        
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},       
    {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}

};

-(void)viewDidLoad {
	[super viewDidLoad];
	HogeView *view = [[HogeView alloc]initWithFrame:self.view.bounds];
    [self.view addSubview:view];
	sougen = [UIImage imageNamed:@"草原.png"];
	mori  = [UIImage imageNamed:@"森1.png"];
	umi   = [UIImage imageNamed:@"海.png"];
	player = [UIImage imageNamed:@"騎士.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;
				case 2:
                       x = j * umi.size.width;
                       y = i * umi.size.height;
                       [umi drawAtPoint:CGPointMake(x,y)];
                default:
					break;
			}		
		}
    }
}                            
                         
@end

とりあえず1個だけですがソース上のいろいろな所に

コード:

”UIButton *up = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button.center = CGPonitMake(120,320);
[self.view addSubview:up];

を試したのですがいずれもエラーがでてボタンを表示することができません
どこの部分にソースを追加すれば表示させることができますか?
どうかご教授よろしくお願いいたします。


開発環境
mac book air
xcode4.2

Re: objective-cでRPG開発

Posted: 2012年1月02日(月) 13:37
by kira
とりあえずエラーはなくなりました。

コード:

#import "mainfield.h"


int x,y,kind;

UIImage *sougen,*mori,*umi,*player;

@implementation mainfield

int map[30][30] = {
   
    {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
    {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},    
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},       
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},    
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},        
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},       
    {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}

};

-(void)viewDidLoad {
	[super viewDidLoad];
	HogeView *view = [[HogeView alloc]initWithFrame:self.view.bounds];
    [self.view addSubview:view];
	sougen = [UIImage imageNamed:@"草原.png"];
	mori  = [UIImage imageNamed:@"森1.png"];
	umi   = [UIImage imageNamed:@"海.png"];
	player = [UIImage imageNamed:@"騎士.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;
				case 2:
                    x = j * umi.size.width;
                    y = i * umi.size.height;
                    [umi drawAtPoint:CGPointMake(x,y)];
                default:
					break;
			}		
		}
    }
    UIButton *btn_up = [UIButton buttonWithType:UIButtonTypeRoundedRect];  //こちらにこんな感じで入れたらエラーはなくなりました
    btn_up.frame = CGRectMake(120,320, 50, 30);               //しかしボタンは非表示のままです
}                    

@end

"up"というオブジェクト名が駄目らしいのとボタンタイプがRoudedRectの場合は、
frameプロパティにてサイズを指定しないとエラーがでるみたいでした。しかし以前としてボタンはマップに隠れたまま。
オブジェクトの前面、背面の設定はどのように設定できるのですか?
よろしくお願いします

Re: objective-cでRPG開発

Posted: 2012年1月02日(月) 14:05
by kira
すいません
ボタンについては解決いたしました

コード:

#import "mainfield.h"


int x,y,kind;

UIImage *sougen,*mori,*umi,*player;

@implementation mainfield

int map[30][30] = {
   
    {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
    {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},    
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},       
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},    
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},        
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},       
    {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}

};

-(void)viewDidLoad {
	[super viewDidLoad];
    
    HogeView *view = [[HogeView alloc]initWithFrame:self.view.bounds];
    [self.view addSubview:view];
    
    UIButton *btn_up = [UIButton buttonWithType:UIButtonTypeRoundedRect];     //ここに入れました
    btn_up.frame = CGRectMake(120,320, 50, 30);
    [self.view addSubview:btn_up];
    
    
    sougen = [UIImage imageNamed:@"草原.png"];
	mori  = [UIImage imageNamed:@"森1.png"];
	umi   = [UIImage imageNamed:@"海.png"];
	player = [UIImage imageNamed:@"騎士.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;
				case 2:
                    x = j * umi.size.width;
                    y = i * umi.size.height;
                    [umi drawAtPoint:CGPointMake(x,y)];
                default:
					break;
			}		
		}
    }
   }                    

@end
原因は2つで生成だけして描画処理をしてなかったのとHogeviewのあとに入れないと上書きされてしまうみたいでした。
お騒がせして申し訳ありませんでした。
ボタンについては解決したのですが次の”主人公を画面中央に配置”でまた悩んでいます。
”当たり判定付き画面スクロール”実装を見据えると、ただ単にdrawRectで描画するだけではスクロールはできても当たり判定ができないのではないかと素人考えで思っているのですがどのようなやり方が一番わかりやすいのでしょうか?
よろしくお願いいたします。

Re: objective-cでRPG開発

Posted: 2012年1月02日(月) 14:49
by h2so5
ボタンを押したときに、
それ以上主人公が移動できるか判定して可能な場合のみ移動すればいいですよね。

Re: objective-cでRPG開発

Posted: 2012年1月02日(月) 16:13
by kira
h2so5さん

こんにちは

うーん、とりあえず主人公を配置し移動ボタンが押せるところまではなんとか書けました。

しかし、こちらのサイト、googleで見てif文を使って2次元配列で"0"と"1"は森と草原だから移動可,"2"ならば海だから移動不可みたいにす

るということは調べられたのですが”上下左右それぞれのボタンのプッシュイベントの受け方”、そして”主人公の2次元配列上の現在地取得”

の仕方がいまいちわかりません。初歩的な質問で申し訳ありません

コード:

#import "mainfield.h"


int x,y,kind;

UIImage *sougen,*mori,*umi,*player;

@implementation mainfield

int map[30][30] = {
   
    {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
    {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},    
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},       
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},    
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},        
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},       
    {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}

};

-(void)viewDidLoad {
	[super viewDidLoad];
    
    HogeView *view = [[HogeView alloc]initWithFrame:self.view.bounds];
    [self.view addSubview:view];
    
    
    UIButton *btn_up=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    UIButton *btn_down=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    UIButton *btn_right=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    UIButton *btn_left=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    
    [btn_up setTitle:@"up" forState:UIControlStateNormal];
    btn_up.frame = CGRectMake(220,360, 50, 30);
    [btn_up addTarget:self action:@selector(buttonDidPush)forControlEvents:UIControlEventTouchUpInside];
    
    [btn_down setTitle:@"down" forState:UIControlStateNormal];
    btn_down.frame = CGRectMake(220,420, 50, 30);
    [btn_down addTarget:self action:@selector(buttonDidPush)forControlEvents:UIControlEventTouchUpInside];
    
    [btn_right setTitle:@"right" forState:UIControlStateNormal];
    btn_right.frame = CGRectMake(270,390, 50, 30);
    [btn_right addTarget:self action:@selector(buttonDidPush)forControlEvents:UIControlEventTouchUpInside];
    
    [btn_left setTitle:@"left" forState:UIControlStateNormal];
    btn_left.frame = CGRectMake(170,390, 50, 30);
    [btn_left addTarget:self action:@selector(buttonDidPush)forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:btn_up];
    [self.view addSubview:btn_down];
    [self.view addSubview:btn_right];    
    [self.view addSubview:btn_left];    
    
    sougen = [UIImage imageNamed:@"草原.png"];
	mori  = [UIImage imageNamed:@"森1.png"];
	umi   = [UIImage imageNamed:@"海.png"];
	player = [UIImage imageNamed:@"騎士.png"];
   
    [view setNeedsDisplay];

    }

-(void)buttonDidPush {          //ボタンアクション ここから2次元配列のマップの移動処理がわかりません
    
    
}


@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;
				case 2:
                    x = j * umi.size.width;
                    y = i * umi.size.height;
                    [umi drawAtPoint:CGPointMake(x,y)];
                default:
					break;
			}		
		}
    }
 [player drawAtPoint:CGPointMake(170,238)];          //主人公を概略ですが画面中央に配置しました
}

@end

Re: objective-cでRPG開発

Posted: 2012年1月02日(月) 17:28
by h2so5
主人公の位置を保持するための変数を作ってください。

主人公を描画するときは、その変数から描画位置を決めて描画します。
ボタンが押されたときにその変数を操作すれば、主人公の移動を実装できます。

Re: objective-cでRPG開発

Posted: 2012年1月02日(月) 19:52
by kira
こんばんわ

h2so5さんに教えて頂いたとおり主人公初期位置をマップ配列の値で変数に代入いたしましたが

エラーこそでないものの狙った位置に表示されず画面の一番左上に表示され、アクションを割り振ったボタンを押すとシミュレータが落ちてしまい

ます。せっかくアドバイスを頂いておきながら私の発想が乏しくご迷惑をおかけします。

可能であれば具体的なソースを教えていただけたら幸いです。貴重なお時間を割いてしまい申し訳ございません。

コード:

#import "mainfield.h"


int x,y,kind;

UIImage *sougen,*mori,*umi,*player;



@implementation mainfield



int map[30][30] = {
   
    {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
    {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},    
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},       
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},    
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},        
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},       
    {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}

};

-(void)viewDidLoad {
	[super viewDidLoad];
    
    HogeView *view = [[HogeView alloc]initWithFrame:self.view.bounds];
    [self.view addSubview:view];
    
    
    UIButton *btn_up=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    UIButton *btn_down=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    UIButton *btn_right=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    UIButton *btn_left=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    
    [btn_up setTitle:@"up" forState:UIControlStateNormal];
    btn_up.frame = CGRectMake(220,360, 50, 30);
    [btn_up addTarget:self action:@selector(buttonDidPush)forControlEvents:UIControlEventTouchUpInside];
    
    [btn_down setTitle:@"down" forState:UIControlStateNormal];
    btn_down.frame = CGRectMake(220,420, 50, 30);
    [btn_down addTarget:self action:@selector(buttonDidPush)forControlEvents:UIControlEventTouchUpInside];
    
    [btn_right setTitle:@"right" forState:UIControlStateNormal];
    btn_right.frame = CGRectMake(270,390, 50, 30);
    [btn_right addTarget:self action:@selector(buttonDidPush)forControlEvents:UIControlEventTouchUpInside];
    
    [btn_left setTitle:@"left" forState:UIControlStateNormal];
    btn_left.frame = CGRectMake(170,390, 50, 30);
    [btn_left addTarget:self action:@selector(buttonDidPush)forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:btn_up];
    [self.view addSubview:btn_down];
    [self.view addSubview:btn_right];    
    [self.view addSubview:btn_left];    

    sougen = [UIImage imageNamed:@"草原.png"];
	mori  = [UIImage imageNamed:@"森1.png"];
	umi   = [UIImage imageNamed:@"海.png"];
	player = [UIImage imageNamed:@"騎士.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;
				case 2:
                    x = j * umi.size.width;
                    y = i * umi.size.height;
                    [umi drawAtPoint:CGPointMake(x,y)];
                default:
					break;
			}		
		}
    }
 
    int player_x = map[1][0];                              //スタート時の主人公位置
    int player_y = map[0][1];
    
    [player drawAtPoint:CGPointMake(player_x,player_y)];  //主人公描画
}

-(void)buttonDidPush:btn_up   {                           //とりあえず上ボタンのアクションのみ
        
        switch (kind) {                                 
            case 0:                                       //0及び1は移動可、2は移動不可
                y = y-1;
                break;
            case 1:                 
                y = y-1;
            default:
                break;
    }

}                         
@end

Re: objective-cでRPG開発

Posted: 2012年1月03日(火) 01:04
by しひ
こんばんは。
主人公の位置云々はちょっと厄介そうなので置いておきます。
とりあえず、主人公の位置はローカル変数ではなくインスタンス変数として持って下さい、とだけ。

ボタンを押したときに落ちてしまうのは、ボタンを押したときに呼ばれるメソッドが存在しないからです。

コード:

 [btn_up addTarget: self action: @selector(buttonDidPush) forControlEvents: UIControlEventTouchUpInside];
とありますが、@selector(buttonDidPush) ではなく @selector(buttonDidPush:) としなければなりません。

また、その呼ばれるメソッドですが

コード:

-(void)buttonDidPush:btn_up   {                           //とりあえず上ボタンのアクションのみ
という書き方はしません。警告などは出ないのでしょうか?
-(void)buttonDidPush:btn_up { ではなく、-(void)buttonDidPush { となります。

ただ、ボタンのアクションの場合は、押したボタンの情報も受け取れると便利なので、上2つの箇所はそれぞれ

コード:

[btn_up addTarget: self action: @selector(buttonDidPush:sender) forControlEvents: UIControlEventTouchUpInside];
// 中略
-(void)buttonDidPush:(id) sender {
とすることが多いのではないかと思います。

Re: objective-cでRPG開発

Posted: 2012年1月03日(火) 09:40
by kira
しひさん

おはようございます

おお、そうでしたか早速入力してみます

今いろいろなHPを勉強中ですがなかな思うようにいかなくて壁にぶち当たっています。

貴重なアドバイスありがとうございます。

Re: objective-cでRPG開発

Posted: 2012年1月03日(火) 13:27
by kira
今、現状で配列と使って主人公の画面表示が出来たのはできたのですが

突拍子もないところに表示されて困っています。

これはどういった事でしょうか?

コード:

#import "mainfield.h"


int x,y,kind;


UIImage *sougen,*mori,*umi,*player;


@implementation mainfield



int map[30][30] = {
   
    {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2},
    {2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},    
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},       
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},    
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},        
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},
    {2,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,2},       
    {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2}

};

-(void)viewDidLoad {
	[super viewDidLoad];
    
    HogeView *view = [[HogeView alloc]initWithFrame:self.view.bounds];
    [self.view addSubview:view];
    
    
    UIButton *btn_up=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    UIButton *btn_down=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    UIButton *btn_right=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    UIButton *btn_left=[UIButton buttonWithType:UIButtonTypeRoundedRect];
    
    [btn_up setTitle:@"up" forState:UIControlStateNormal];
    btn_up.frame = CGRectMake(220,360, 50, 30);
    [btn_up addTarget: self action: @selector(buttonDidPush_up:) forControlEvents: UIControlEventTouchUpInside];

    [btn_down setTitle:@"down" forState:UIControlStateNormal];
    btn_down.frame = CGRectMake(220,420, 50, 30);
    [btn_down addTarget: self action: @selector(buttonDidPush_down:) forControlEvents:UIControlEventTouchUpInside]; 
    
    [btn_right setTitle:@"right" forState:UIControlStateNormal];
    btn_right.frame = CGRectMake(270,390, 50, 30);
    [btn_right addTarget: self action: @selector(buttonDidPush_right:) forControlEvents:UIControlEventTouchUpInside];
    
    [btn_left setTitle:@"left" forState:UIControlStateNormal];
    btn_left.frame = CGRectMake(170,390, 50, 30);
    [btn_left addTarget:self action: @selector(buttonDidPush_left:) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:btn_up];
    [self.view addSubview:btn_down];
    [self.view addSubview:btn_right];    
    [self.view addSubview:btn_left];    

    sougen = [UIImage imageNamed:@"草原.png"];
	mori  = [UIImage imageNamed:@"森1.png"];
	umi   = [UIImage imageNamed:@"海.png"];
	player = [UIImage imageNamed:@"騎士.png"];
  
    [view setNeedsDisplay];

 }

@end

int player_x,player_y;

@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;
				case 2:
                    x = j * umi.size.width;
                    y = i * umi.size.height;
                    [umi drawAtPoint:CGPointMake(x,y)];
                     break;
                default:
                break;
                     
             }		
		}
    }
  
    player_x = sizeof map[1] ;              //配列から主人公位置取得
    player_y = sizeof map[8] ;
    
    [player drawAtPoint:CGPointMake(player_x,player_y)];
}

 




/*-(void)buttonDidPush_up:(id)sender   {    //とりあえず上ボタンのアクションのみ 保留中
                                            
           } */   
    

@end
今ここをいじってます

コード:

 player_x = sizeof map[1] ;              //配列から主人公位置取得
    player_y = sizeof map[8] ;
    
    [player drawAtPoint:CGPointMake(player_x,player_y)];
MAP[][]の数値の部分をいろいろと変えてみているのですが数値を変えても表示がかわらなかったり

突然意外なところに表示されてみたり良く意味がわかりません。

Re: objective-cでRPG開発

Posted: 2012年1月03日(火) 16:57
by しひ
こんばんは。
主人公の描画を

コード:

    player_x = sizeof map[1] ;              //配列から主人公位置取得
    player_y = sizeof map[8] ;
    
    [player drawAtPoint:CGPointMake(player_x,player_y)];
としているみたいですけど、この sizeof の意味を知っていますか?
また、どういう意図でこれを使っていますか?

Re: objective-cでRPG開発

Posted: 2012年1月04日(水) 11:40
by kira
しひさん

こんにちは

sizeofについてgoogleで調べました。突拍子もないのは表示ではなく、自分のコードの書き方でした。

主人公の初期描画位置を配列で取得しようとあらゆることを試している中、例のsizeofを用いたら描画位置に変化があり

無知がゆえに”これを使えばいいのかな”という安易な考えで書きました。

こういった2次元配列からある一つの要素を抽出する場合はどんなコードの書き方をすれば良いのでしょうか?

ご教授の程よろしくお願いします。

Re: objective-cでRPG開発

Posted: 2012年1月04日(水) 13:16
by softya(ソフト屋)
配列に対するアクセスですので
map[y][x]
で目的のマップチップ座標のマップ情報が取得できるはずです。

C言語とDXライブラリで私が書いたRPG講座がありますので良かったら参考にして下さい。
「マイ 日記 • C言語交流フォーラム ~ mixC++ ~」
http://dixq.net/forum/blog.php?u=114&sd=a&c=2

Re: objective-cでRPG開発

Posted: 2012年1月04日(水) 14:38
by kira
softyaさん

こんにちはアドバイスありがとうございます。2次元配列の要素取得を早速入力させて頂きました

コード:

    player_x = map[0][1];              //配列から主人公位置取得
    player_y = map[1][0];
    
    [player drawAtPoint:CGPointMake(player_x,player_y)];
map[1][1]にキャラを表示させようとしていますがmap[0[]0]の位置に表示されてしまいます。そして[]内の値をいくつに変えてもやはり

map[0][0]の位置に表示されてしまいます。CGPointMake(x,y)の様にx座標とy座標を入力しなければならない場合の配列の記述方法は

どのような感じになるのでしょうか?

RPG講座拝見させて頂きました、すごすぎますね。

softyaさんのソースでキャラ描画のための位置取得の部分はマップ管理の2ですか

自分の様にただ単に2次元配列から位置取得ではなく,softyaさんの様に画面のピクセルとマップチップの

座標を合致させて表示位置を取得しないとだめなのでしょうか?

初歩的な質問ばかりで申し訳ございません。

Re: objective-cでRPG開発

Posted: 2012年1月04日(水) 18:02
by h2so5
コメントに「配列から主人公位置取得」って書いてありますけど、
配列に入っているのは地形の情報であって位置情報じゃないですよね。

Re: objective-cでRPG開発

Posted: 2012年1月04日(水) 18:03
by softya(ソフト屋)
Windows系の人なのでMac系の描画関数は不明ですが、map[0][1];やmap[1][0];で得られるのはマップチップ(マップパーツ)の番号でプレーヤーの座標ではありません。
まず、マップチップの番号、マップチップ座標、マップの座標、プレーヤーの座標、表示座標などの区別が出来ていないと思われます。
それとmap[y][x]はobjective-cの前に基本であるC言語の理解が不十分だと思いますので、まず配列や構造体は理解されたほうが良いと思いますよ。その上でゲームプログラミングの基本から勉強されることをお勧めします。

あと、C言語やC++でSDLで組んでもらうとWin/Linux/Mac互換なのでこちらでも検証が楽にはなりますので、一度ご検討下さい。
※ ただし、私も組んだことがない&微妙に違う部分が出てくる可能性があります。
「SDL - Wikipedia」
http://ja.wikipedia.org/wiki/SDL
「SDLゲームプログラミング講座 〜紅音製作所〜」
http://www5.big.or.jp/~high/VENIO/kuz/index.htm
私もこの機会にSDLを入れてみようかと思います。

Re: objective-cでRPG開発

Posted: 2012年1月04日(水) 19:39
by kira
こんばんわ

私の度重なる初歩的な質問に懇切丁寧にお答え頂きありがとうございました

もう一度最初からC言語を勉強したいと思います。そして皆様の貴重なお時間を割いてしまい

申し訳ございませんでした。時間はすごくかかると思いますが、いつの日か必ず一つの

アプリを完成できればと考えております。

重ねてお礼申し上げます

Re: objective-cでRPG開発

Posted: 2012年1月04日(水) 19:49
by みけCAT
解決したのでしたら解決チェックをお願いします。

Re: objective-cでRPG開発

Posted: 2012年1月04日(水) 19:50
by softya(ソフト屋)
ここでC言語自体の基礎的な質問をしてもらっても良いですし、ローグの様にコンソールだけで作れるRPGもあります。
配列や構造体は言語仕様の理解度の問題ですが、その他の部分はゲーム/アプリ構築の理解度の問題ですので作らいないと経験が積めません。RPGが最初として難易度が高すぎたと思いますので、もっと簡単なじゃんけんゲーム頭から始めて徐々に難易度が高いゲームとかを作ってみてはどうでしょうか?

Re: objective-cでRPG開発

Posted: 2012年1月05日(木) 23:54
by kira
すいません

チェック忘れていました