1

可可之王 - 我需要帮助!

我正在编写我的第一个应用程序(游戏),并尝试在 Core Frameworks 和 UIKit 中完成所有工作。我的游戏涉及一个由我手动创建的 UIButtons 制成的 5 x 8 板(!)。当我改变一个人的行为时要更新的大量 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

好的,对于这个解决方案,我假设每个按钮都有一个“TapxY”BOOL 变量和“buttonxY:”选择器,其中 x:[A,B,C,D,E] 和 Y:[1-8]。

您想要做的是使每个按钮的按钮标签为 1000+n(1000 只是为了使标签永远不会为 0。只要您跟踪它,这可以是任何东西。)

这样,标签将是 1000,1001,...,1000+col*row-1(在 5x8 中为 1039)。

我还假设 tapxY (ex 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 回答