1

Lords of Cocoa - 助けが必要です!

私は最初のアプリ (ゲーム) をコーディングしており、コア フレームワークと UIKit ですべてを実行しようとしています。私のゲームには、手動 (!) で作成した UIButton から作成された 5 x 8 のボードが含まれます。1 つの動作を変更すると更新される大規模な PItA。私は変更可能な配列と UIButton ジェネレーターを使用してみましたが、私はまだこのようなことが苦手で、物事を機能させることに非常に失敗しています。

ボタンは、その状態、価値、所有者、およびオリジンを保存します。私は現在、A、B、C、D、E を列に、1-8 を行に再表示しています。ボタンは 62x62 で、グリッドの両側に 1 ピクセルのマージン、ボタン間に 2 ピクセルのバッファーとマージンがあります。

各ボタンのタグ、値などを指定し、プログラムでグリッドを吐き出すクラスから素敵な小さな配列ジェネレーターを取得するのを手伝ってくれる人はいますか?

ボタンのサンプル:

    -(IBAction) buttonA1:(id)sender {
UIButton *theButton = (UIButton *)sender;
theButton.titleLabel.font = [UIFont fontWithName:@"Gotham Rounded" size:22];
NSString *Title = theButton.titleLabel.text;

if (tapA1 != 1) {

    [theButton  setAlpha:1.0];

    tapSum++;
    tapA1 = 1;

    [theButton setTitle: @"A1" forState: UIControlStateNormal];
    NSLog(@"Press recieved from %@:\n\nSum is %i.\n", Title, tapSum);
    [theButton setBackgroundImage:[UIImage imageNamed:@"red-dot.png"] forState:UIControlStateNormal];



}
else if (tapA1 == 1)
{
    [theButton  setAlpha:0.3];

    tapA1 = 0;
    tapSum--;

    NSLog(@"Press recieved from %@:\n\nSum is %i.\n", Title, tapSum);
}

前もって感謝します!

4

4 に答える 4

3

さて、このようなグリッドを作成できます:-

#define WIDTH 62
#define HEIGHT 62
#define PADDING 3
#define NUMBEROFBUTTONSINAROW 8
#define X 100
#define Y 100
#define TOTALBUTTONS 40

NSMutableArray *array = [[NSMutableArray alloc] init];

    for(int i=0 ; i<TOTALBUTTONS;i++)
    {
        UIButton *btnClick = [UIButton buttonWithType:UIButtonTypeCustom];
        [btnClick setImage:[UIImage imageNamed:@"ship.jpg"] forState:UIControlStateNormal];
        [btnClick setFrame:CGRectMake(X+((WIDTH + PADDING) * (i%NUMBEROFBUTTONSINAROW)), Y + (HEIGHT + PADDING)*(i/NUMBEROFBUTTONSINAROW), WIDTH, HEIGHT)];
        [btnClick addTarget:self action:@selector(btnTapped:) forControlEvents:UIControlEventTouchUpInside];
        btnClick.tag=i + 1;
        [self.view addSubview:btnClick];

        [array addObject:btnClick];
    }

そして最後にボタンアクション:-

-(void)btnTapped:(id)sender
{

    NSLog(@"Button Clicked %d",((UIButton *)sender).tag);
}

タグ値でボタンにアクセスできます。配列は必要ありません。しかし、必要に応じて、配列でアクセスしてください。

または、すべてのボタンのカスタマイズを関連付けるクラスを作成し、クラス オブジェクトを Array に格納して、後でアクセスすることもできます。この場合、ボタンの実装はクラスになります。

于 2013-03-17T06:01:40.403 に答える
1

OK、このソリューションでは、x:[A、B、C、D、E] と Y:[1-8] の各ボタンに「TapxY」BOOL 変数と「buttonxY:」セレクターがあると想定しています。

やりたいことは、ボタンタグが各ボタンに対して 1000+n になるようにすることです (タグが 0 にならないようにするためだけに 1000 になります。追跡している限り、これは何でもかまいません)。

このように、タグは 1000,1001,...,1000+col*row-1 (5x8 では 1039 になります) になります。

また、tapxY (例: tapA1) は 0 または 1 のみになると想定しています。代わりに、ブール値の NSMutableArray ([NSNumber numberWithBool:boolVal] として格納できます) を作成し、col*row ( 40) すべて [NSNumber numberWithBool:NO] で始まる要素。

buttonAction:(id)sender メソッドでは、次のようにすることができます。

UIButton *theButton = (UIButton *)sender;
int buttonNum = theButton.tag-1000;
BOOL buttonTapped = [[tapped objectAtIndex:buttonNum] boolValue];
if (buttonTapped) { //Assuming tapped is your array of tapped buttons.
    tapSum++;
    //Set this button up however you want for the tapped state.
}
else {
    tapSum--;
    //Set this button up as not tapped
}
[tapped replaceObjectAtIndex:buttonNum withObject [NSNumber numberWithBool:!buttonTapped]]; //set this button as the opposite of what it just was.

次に、ボタンを作成するときは、次のことを行う必要があります。

int rows = 5;
int columns = 8;
for (int n=0;n<rows;n++) {
    for (int m=0;m<columns;m++) {
        CGRect frame = CGRectMake(1+64*n,1+64*m,62,62);
        Button *button = [[UIButton alloc] initWithFrame:frame]; // or create a rounded rect and set its frame.
        [button setTag:1000+n*columns+m]; //sets tag to a number 1000 to rows*columns-1
        //Then do other setup for the button.
        [button addTarget:self forSelector:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:button];
    }
}

注: おそらくいくつかのタイプミスがあり、テストされていないため、このコードを正確にコピーしないでください。

于 2013-03-17T05:49:33.573 に答える
0

これのことですか?

#define kButtonSize 62
#define kMaxRows 6
#define kMaxColumns 4
#define kButtonSpacingWidth (([[UIScreen mainScreen].bounds.size.width - kMaxColumns * kButtonSize) / (kMaxColumns + 1))
#define kButtonSpacingHeight (([[UIScreen mainScreen].bounds.size.height - kMaxRows * kButtonSize) / (kMaxRows + 1))

- (UIButton *)buttonAtRow:(int)r column:(int)c
{
    CGRect frm = CGRectMake(
        kButtonSpacingWidth + c * (kButtonSize + kButtonSpacingWidth),
        kButtonSpacingHeight + r * (kButtonSize + kButtonSpacingHeight),
        kButtonSize,
        kButtonSize
    );

    UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
    btn.titleLabel.font = [UIFont fontWithName:@"FooBar-Bold" size:42.0];
    btn.frame = frm;
    [btn setBackgroundImage:[UIImage imageNamed:@"Baz.jpg"] forState:UIControlStateNormal];

    return btn;
}

ボタンがどのように配置されているか想像して、引き算や割り算などの小学校の数学を適用すれば、あとは簡単です。

于 2013-03-17T05:41:37.800 に答える
0

forループが助けになります!少し視覚空間的な考え方でグリッドを作成できます。

-(void)generateSomeButtons {
    int row = 0;
    int col = 0;
    for (int tag = 0; tag < 40; tag++)
        UIButton *btn = //...
        btn.tag = tag;
        int buf = 1;
        //no division by 0 
        if (tag == 0) {
            buf = 2;
            row = 0; 
        }
        //Reset when it moves to the sixth element
        else if (tag % 6 == 0) {
            row = 0;
            col++;
        } 
        //Else buffer by 2 pixels
        else {
            buf = 2;
        }
        btn.frame = CGRectMake(buf + (row * 62), (col*62) + 2, 62, 62);
        [self.view addSubview:btn];
        row++;
    }
}

ここでは基本的な数学のみです。

于 2013-03-17T05:44:23.663 に答える