1

Obj C とプログラミング全般の初心者 - このサイトから多くのことを学び、皆さんの貢献に本当に感謝しています。

私のシナリオは次のとおりです(面白い名前を説明するiPhoneゲームのプログラミング)

メインのgameLoop(ビューコントローラーにあります)で、特定の条件が満たされた場合、敵を作成します-チェリーボム

if (bounceCounterGlobal % 2 == 0 && bounceCounterGlobal > 1 && cherryBombSwitch == 0){
    [self addCherryBomb];
}

addCherryBomb メソッドは次のとおりです。

-(void) addCherryBomb{
    CherryBomb *myCherryBomb = [[CherryBomb alloc] init];
    [cherryBombArray insertObject:myCherryBomb atIndex:0];
    [myCherryBomb release];
    [[cherryBombArray objectAtIndex:0] initializeCherryBomb];
     [self.view addSubview:[[cherryBombArray objectAtIndex:0] cherryBombView]];
    cherryBombSwitch = 1;
}

CherryBomb ヘッダー ファイルは短いです。

#import <Foundation/Foundation.h>
#import "SimpleGameViewController.h"

    @interface CherryBomb : NSObject {

        UIImageView *cherryBombView;
        NSTimer *cherryBombDetonateTimer;
        NSTimer *cherryBombMoveTimer;
    }

    @property (nonatomic, retain) UIView *cherryBombView;

    -(void) initializeCherryBomb;
    -(void) detonateCherryBomb;
    -(void) moveCherryBomb;

    @end

私がしたいのは、チェリーボムが爆発したとき(cherryBombオブジェクト内で決定されます)、ビューコントローラーのivarであるcherryBombArrayからオブジェクトを削除したいということです。

これを行うためにView Controllerクラスメソッドを呼び出してみましたが、View Controllerのivarにアクセスできません(クラスメソッドであるため)。ビューコントローラークラスに通信して、分解されたオブジェクトを削除するように指示する方法がわかりません。

@implementation CherryBomb
...
-(void) detonateCherryBomb{
    NSLog(@"KABOOM!");
    cherryBombDetonateTimer = nil;
    [cherryBombMoveTimer invalidate];
    [cherryBombView removeFromSuperview];
    //I would like to remove this object from the view controller's cherryBombArray
}
@end

よろしくお願いいたします。前もって感謝します!

4

4 に答える 4

2

すべてのゲーム ロジックを処理する「環境」オブジェクトを作成することをお勧めします。

cherryBomb はその爆発に対処すべきではありません。cherryBomb は多くの情報 (爆発のサイズ、爆発の種類など) を保存できますが、cherryBomb が他の「もの」 (キャラクター、爆弾など) に及ぼす影響は、cherryBomb 自体によって計算されるべきではありません。

私はゲーム プログラミングにあまり慣れていませんが、アーキテクチャ/設計のこの側面は共通しています: 各オブジェクト/クラスにはそれぞれの責任があります。

cherryBomb はもはや爆弾を表していません (「グラフィック」の側面でもありません)。

環境は、現時点での「世界」を表し、世界の要素間のアクション/相互作用をモデル化します。

ゲームをデザインする最良の方法については、言いたいことがたくさんあります...

とにかく、あなたの質問に答えるために、「イベント」を使用することができます。ボムはコントローラーにメッセージを送信して、「私は爆発しました。私を取り除いてください」と伝えます。

爆弾で:

[[NSNotificationCenter defaultCenter] postNotificationName:@"kaBOOM" 
                                                    object:self];

コントローラーで:

[NSNotificationCenter defaultCenter] addObserver:self
                                        selector:@selector(methodToCallWhenKaBOOM) 
                                            name:@"kaBOOM" 
                                          object:nil];

- (void)methodToCallWhenKaBOOM:(NSNotification *)note
{
    // do stuffs
}

http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSNotificationCenter_Class/Reference/Reference.html

于 2010-10-20T20:45:45.067 に答える
1

これを行うにはいくつかの方法があり、コントローラーとモデルの観点から、ここでの正確な分業について考えたいと思うかもしれません。コールのやり取りが多すぎると、物事がかなりスパゲティになる可能性があります。

ただし、そのすべてには触れずに、あるオブジェクトが別のオブジェクトにアクセスできるようにするために必要な基本的なことは、最初のオブジェクトに 2 番目のオブジェクトへの参照を与えることです。

この場合、実際CherryBombには View Controller で を作成しているので、その時点で参照を渡すだけで簡単です。CherryBomb次のような別のivarをクラスに与えます。

SimpleGameViewController* cherryBombViewController;

メソッドまたはあなたCherryBombのメソッド(これらはおそらく単一のメソッドである必要があります)がそのようなポインターを取り、ivarに割り当てるように変更します。initinitializeCherryBomb

- (void) initializeCherryBomb:(SimpleGameViewController*)vc
{
    // ... whatever other stuff you do in here, plus something like:
    cherryBombViewController = vc;
}

これを呼び出すときはself、パラメーターとして渡しvcます。その後、爆弾が爆発すると、コントローラーに追加したメソッドを呼び出して自分自身を削除できます。

[cherryBombViewController handleDetonationOfCherryBomb:self];

コントローラの配列に直接アクセスするべきではないことに注意してください。これは、爆弾が知らない実装の詳細です。単純なケースでは、制御構造が少しずさんであっても問題はありませんが、カプセル化を台無しにしてはいけません。

于 2010-10-20T21:11:29.460 に答える
0

これはキー値観測の良い応用だと思います。その状態を表すチェリーボムのプロパティが必要です。

@property (assign) BOOL isExploded;

チェリーボムが爆発したかどうかに関心のあるオブジェクトは、 isExploded プロパティで KVO に登録します。たとえば、View Controller は次のようにします。

[cherryBomb addObserver: self
             forKeyPath: @"isExploded"
                options: ....
                context: ....];

-observeValueForKeyPath:ofObject:change:context:ビューコントローラーの場合、配列からチェリーボムを削除します。

あなたの detonate メソッドは、現在行っている他のすべてと同様に、次のことを行います。

[self setExploded: YES];
于 2010-10-21T10:14:27.920 に答える
0

MVC 設計パターンを読んでください。ビュー間で共有する必要がある ivar を見つけた場合、一部のビューを他のビューの ivar にピークさせるのではなく、より高いレベルの Model オブジェクト (MVC の M) に配置する必要があります。この Model オブジェクトへのポインタは、それにアクセスする必要があるすべてのビュー オブジェクトに渡すことができます。

于 2010-10-20T22:26:46.413 に答える