2012-05-29 3 views
8

enter image description hereКак мы можем выполнять действия по UIButtons последовательности?

В Мой снимок экрана показывают, что я работаю на слово сопрягая game.In эту игру я присвоить мои слова к различным UIButtons в специфической последовательности на различных loctions (моя красная стрелка показывает эту последовательность) и остальных UIButtons я назначьте один из случайных символов (AZ). Когда я нажимаю на какие-либо UIButtons, его заголовок будет присвоен UILabel, который находится в Fornt текущего раздела: i campare этот текст UILabel ниже текста UILabels, который находится в режиме таймера. Когда он совпадает для любого из моих UILabels его будет удалено. Теперь все это уже реализовано.

Но моя проблема в том, что это шоу черными линиями. Если игрок найдет первое слово, которое является «СОБАКОЙ». он нажимает «Два UIButtons in Sequence», но не нажимает «Третий» в «Последовательности» (как показано черной линией). Здесь я хочу, чтобы, когда игрок нажимает любые UIButtons, которые не находятся в Sequence, затем удаляет предыдущий текст (который является " DO ") UILabel, и теперь текст UILabel является только« G ». Вот мой код, чтобы получить названия UIButtons и присвоить ему UILabel.

- (void)aMethod:(id)sender 
     { 
    UIButton *button = (UIButton *)sender; 
    NSString *get = (NSString *)[[button titleLabel] text]; 
    NSString *origText = mainlabel.text; 
    mainlabel.text = [origText stringByAppendingString:get]; 

if ([mainlabel.text length ]== 3) 
    { 
if([mainlabel.text isEqualToString: a]){ 
    [email protected]"Right"; 
    [btn1 removeFromSuperview]; 
    score=score+10; 
    lblscore.text=[NSString stringWithFormat:@"%d",score]; 
    words=words-1; 
    lblwords.text=[NSString stringWithFormat:@"%d",words]; 
    [email protected]""; 
    [email protected]"tbbb"; 
} 

    else if([mainlabel.text isEqualToString: c]){ 
    [email protected]"Right"; 
    [btn2 removeFromSuperview]; 
    score=score+10; 
    lblscore.text=[NSString stringWithFormat:@"%d",score]; 
    words=words-1; 
    lblwords.text=[NSString stringWithFormat:@"%d",words]; 
    [email protected]""; 
[email protected]"yyyy"; 

} 
else 
    if([mainlabel.text isEqualToString: d]){ 
    [email protected]"Right"; 
    [btn3 removeFromSuperview]; 
    score=score+10; 
    lblscore.text=[NSString stringWithFormat:@"%d",score]; 
    words=words-1; 
    lblwords.text=[NSString stringWithFormat:@"%d",words]; 
    [email protected]""; 
    [email protected]"yyyy"; 
} 
else { 
    [email protected]"Wrong"; 
    [email protected]""; 
    } 

}} 

Thanx заранее

+2

Возможно, вы могли подклассифицировать UIButton или создать категорию UIButton, которая добавляет свойство, которое вы можете установить во время выполнения, которое указывает, что кнопка является частью слова или нет? Это может помочь вам: http://stackoverflow.com/questions/5500327/subclass-uibutton-to-add-a-property – Luke

+1

Назначьте тег каждой кнопке. И получите тег, когда вы нажимаете. сохраните тег в переменной e.g name, prevTapBtn = 10, тогда другая переменная nextTapBtn = 11 должна быть 11, что больше предыдущего. Если это так, то countinue еще удалить. Надеюсь, что это поможет вам. –

ответ

2

Назначьте тег каждой кнопке слева направо. Значит, у вас будет,

GButton.tag = 0; TButton.tag = 1; DButton.tag = 2; . . . VButton.tag = 9; . . . EButton.tag = 18; . . . CButton.tag = 26;

Теперь сохраните дорожку предыдущей нажатой кнопки и нажатой текущей кнопки. Вызова ниже функции, когда попадет ваша кнопка делегат:

Написать ниже кода в ваш файл .h

#define SEQ_TYPE_ANY 0 
#define SEQ_TYPE_RIGHT 1 
#define SEQ_TYPE_LEFT 2 
#define SEQ_TYPE_TOP 3 
#define SEQ_TYPE_BOTTOM 4 
#define SEQ_TYPE_RIGHT_DIAGONAL_DOWN 5 
#define SEQ_TYPE_RIGHT_DIAGONAL_UP 6 
#define SEQ_TYPE_LEFT_DIAGONAL_DOWN 7 
#define SEQ_TYPE_LEFT_DIAGONAL_UP 8 

#define NO_OF_BUTTONS_IN_ROW 9 

//Add below variables into your class 
int curentSequence; 
UILabel *resultLabel; 
UIButton *previousButton; 

//Declare property for previousButton 
@property(nonatomic, retain) UIButton *previousButton; 


//Write below code to .m file 
@synthesize previousButton; 

-(BOOL) isAdjacent:(UIButton *)currentButton 
{ 
    if(previousButton == nil) 
    { 
      resultLabel.text = currentButton.titleLabel.text; 
      curentSequence = SEQ_TYPE_ANY; 
      return TRUE; 
    } 


    if((curentSequence == SEQ_TYPE_ANY || curentSequence == SEQ_TYPE_RIGHT) && 
      (previousButton.tag + 1 == currentButton.tag)) 
    { 
      resultLabel.text = [resultLabel.text stringByAppendingString:currentButton.titleLabel.text]; 
      curentSequence = SEQ_TYPE_ANY; 
      return TRUE; 
    } 

    else if((curentSequence == SEQ_TYPE_ANY || curentSequence == SEQ_TYPE_LEFT) && 
     (previousButton.tag - 1 == currentButton.tag)) 
    { 
      resultLabel.text = [resultLabel.text stringByAppendingString:currentButton.titleLabel.text]; 
      curentSequence = SEQ_TYPE_LEFT; 
      return TRUE; 
    } 

    else if((curentSequence == SEQ_TYPE_ANY || curentSequence == SEQ_TYPE_TOP) && 
      (previousButton.tag - NO_OF_BUTTONS_IN_ROW == currentButton.tag)) 
    { 
      resultLabel.text = [resultLabel.text stringByAppendingString:currentButton.titleLabel.text]; 
      curentSequence = SEQ_TYPE_TOP; 
      return TRUE; 
    } 

    else if((curentSequence == SEQ_TYPE_ANY || curentSequence == SEQ_TYPE_BOTTOM) && 
      (previousButton.tag + NO_OF_BUTTONS_IN_ROW == currentButton.tag)) 
    { 
      resultLabel.text = [resultLabel.text stringByAppendingString:currentButton.titleLabel.text]; 
      curentSequence = SEQ_TYPE_BOTTOM; 
      return TRUE; 
    } 

    else if((curentSequence == SEQ_TYPE_ANY || curentSequence == SEQ_TYPE_RIGHT_DIAGONAL_DOWN) && 
      (previousButton.tag + NO_OF_BUTTONS_IN_ROW + 1 == currentButton.tag)) 
    { 
      resultLabel.text = [resultLabel.text stringByAppendingString:currentButton.titleLabel.text]; 
      curentSequence = SEQ_TYPE_RIGHT_DIAGONAL_DOWN; 
      return TRUE; 
    } 

    else if((curentSequence == SEQ_TYPE_ANY || curentSequence == SEQ_TYPE_RIGHT_DIAGONAL_UP) && 
      (previousButton.tag - NO_OF_BUTTONS_IN_ROW + 1 == currentButton.tag)) 
    { 
      resultLabel.text = [resultLabel.text stringByAppendingString:currentButton.titleLabel.text]; 
      curentSequence = SEQ_TYPE_RIGHT_DIAGONAL_UP; 
      return TRUE; 
    } 

    else if((curentSequence == SEQ_TYPE_ANY || curentSequence == SEQ_TYPE_LEFT_DIAGONAL_UP) && 
      (previousButton.tag - NO_OF_BUTTONS_IN_ROW - 1 == currentButton.tag)) 
    { 
      resultLabel.text = [resultLabel.text stringByAppendingString:currentButton.titleLabel.text]; 
      curentSequence = SEQ_TYPE_LEFT_DIAGONAL_UP; 
      return TRUE; 
    } 
    else if((curentSequence == SEQ_TYPE_ANY || curentSequence == SEQ_TYPE_LEFT_DIAGONAL_DOWN) && 
      (previousButton.tag + NO_OF_BUTTONS_IN_ROW - 1 == currentButton.tag)) 
    { 
      resultLabel.text = [resultLabel.text stringByAppendingString:currentButton.titleLabel.text]; 
      curentSequence = SEQ_TYPE_LEFT_DIAGONAL_DOWN; 
      return TRUE; 
    } 
    else 
    { 
      resultLabel.text = @""; 
      curentSequence = SEQ_TYPE_ANY; 
      return FALSE; 
    }  
} 

// Event handler for button event 
- (void)aMethod:(id)sender 
{ 
    UIButton *currentButton = (UIButton *)sender; 
    BOOL result = [self isAdjacent:currentButton]; 
    if(result == FALSE) 
    { 
      self.previousButton = nil; 
      resultLabel.text = @""; 
      curentSequence = SEQ_TYPE_ANY; 
    } 
    else 
    { 
      self.previousButton = sender; 
    } 
} 

Надеется, что это поможет.

+0

Я пытаюсь реализовать свой код, но на кнопке щелкните, как мы можем проверить ваше состояние, которое вы упомянули в ur code.bcz на кнопке. Я вызываю функцию - (void) aMethod: (id) отправитель, могу ли вы помочь мне реализовать ваш код в правильном направлении.thanx – jamil

+0

я осматриваю тег для каждого uibutton, но на кнопке щелкните, как мы можем назвать ур funtion, я попробую это. \t \t \t \t [btn addTarget: self action: @selector (isAdjacent:) forControlEvents: UIControlEventTouchUpInside]; но когда я вызываю это на каждой кнопке, нажмите его, чтобы убить мое приложение. – jamil

+0

см. Обновленный код .. – Apurv

1

Если я правильно понимаю, что вам нужно знать, если кнопка нажата находится рядом с ранее нажатой кнопке? Используйте эту функцию для проверки прилегания в сетке:

bool isAdjacent(UIButton* current, UIButton* previous) { 
    if(!previous) 
     return false; 

    //Create a rectangle around the previous button (assuming all buttons are in a fixed grid) 
    CGRect previousRect = previous.frame; 
    CGRect adjacentRect = CGRectMake(previous.frame.origin.x - previous.frame.size.width, 
            previous.frame.origin.y - previous.frame.size.height, 
            previous.frame.size.width*3, 
            previous.frame.size.height*3); 
    return CGRectIntersectsRect(adjacentRect, previousRect); 
} 

И только добавить, если они являются смежными, то есть:

- (void)aMethod:(id)sender 
{ 
    UIButton *button = (UIButton *)sender; 
    static UIButton* previous = nil; 
    NSString *get = (NSString *)[[button titleLabel] text]; 
    NSString *origText = mainlabel.text; 

    if(isAdjacent(button, previous)) 
     mainlabel.text = [origText stringByAppendingString:get]; 

    previous = button; 

    //Rest of function 
} 
+0

благодарит за ответ. Я видел ваш код. что я получил от вашего кода, вы делаете previousRect, передавая previous.frame и еще одно соседнееRect, используя предыдущие и проверяя Intersect для этих двух. но мой вопрос - где проверить смежность с текущим и предыдущим? – jamil

+0

проверяет функцию aMethod - (void). Если они смежны, добавьте письмо, иначе ...? –

+0

спасибо за ответ, но я прошу о текущем смежности с предыдущей кнопкой в ​​isAdjacent code blcok. – jamil

2

Fun вопрос: В данном конкретном случае, я согласен с Люком о подклассах UIButton. Таким образом, вы можете дать каждой кнопке (X, Y) в своей сетке, а также список (Xnext, Ynext) для всех возможных ожидаемых следующих мест для печати (если сама кнопка может использоваться для создания нескольких слов). Внешне вы сравните текущий удар с ожидаемым (Xnext, Ynext). Если два не совпадают, это сигнал, который вы ищете.

Это ответ, который учитывает все ваши ситуации, вперед и назад по горизонтали (если вы решили внедрить backware), вверх и вниз по вертикали (если вы решите реализовать вверх) и любую диагональ или любую другую комбинацию вы можете придумать!

Это также объясняет позволяет сказать, что попав в D, то O затем пытается нажать D снова против удара G. Он также берет на себя удары неверную G.

Создать новую .m .h пару файлов (новый объект) и дайте ему свое имя.

Некоторые примеры кода для реализации пользовательских UIButton (ч файл):

@interface myConnectedUIButton : UIButton { 

    BOOL    isAWordBeginCharacter; 
    unsigned int  beginWordKey; 

    unsigned int  myGridX; 
    unsigned int  myGridY; 

    NSMutableArray * myConnectedSet; 

} 

-(id)init; 
-(void)initWithGridX:(unsigned int)X GridY:(unsigned int)Y BeginChar:(BOOL)yesNo BeginWordKey:(unsigned int)key; 
-(void)setGridPosWithX:(unsigned int)X Y:(unsigned int)Y; 
-(void)setGridX:(unsigned int)X; 
-(void)setGridY:(unsigned int)Y; 
-(unsigned int)getGridX; 
-(unsigned int)getGridY; 

-(void)setIsABeginChar:(BOOL)yesNo; 
-(BOOL)getIsABeginChar; 

-(void)addPosToConnectedSetGridX:(unsigned int)X GridY:(unsigned int)Y WordKey:(unsigned int)key; 
-(NSArray *)getMyConnectedSetArray; 
-(void)clearConnectedSet; 

@end 

В .m файл вашего

@implementation myConnectedUIButton 

-(id)init{ 
    [super init]; 

    // Lets go ahead and initialize the NSMutableArray here also IFF it hasnt already been allocated 
    if(nil == myConnectedSet){ 
     myConnectedSet = [[NSMutableArray alloc] init]; 
    } 

    // Lets also zero out the x, y position 
    myGridX = 0; 
    myGridY = 0; 

    // Lets also state that this is NOT a begin char for the time being and 0 for the begin char key 
    isAWordBeginCharacter = NO; 
    beginWordKey = 0; 

    return self; 
} 

-(void)initWithGridX:(unsigned int)X GridY:(unsigned int)Y BeginChar:(BOOL)yesNo BeginWordKey:(unsigned int)key{ 
    // Lets go ahead and initialize the NSMutableArray here also IFF it hasnt already been allocated 
    if(nil == myConnectedSet){ 
     myConnectedSet = [[NSMutableArray alloc] init]; 
    } 

    myGridX = X; 
    myGridY = Y; 

    isAWordBeginCharacter = yesNo; 
    beginWordKey = key; 
} 

-(void)setGridPosWithX:(unsigned int)X Y:(unsigned int)Y{ 
    myGridX = X; 
    myGridY = Y; 
} 

-(void)setGridX:(unsigned int)X{ 
    myGridX = X; 
} 

-(void)setGridY:(unsigned int)Y{ 
    myGridY = Y; 
} 

-(unsigned int)getGridX{ 
    return myGridX; 
} 

-(unsigned int)getGridY{ 
    return myGridY;  
} 

-(void)setIsABeginChar:(BOOL)yesNo{ 
    isAWordBeginCharacter = yesNo; 
} 

-(BOOL)getIsABeginChar{ 
    return isAWordBeginCharacter; 
} 

-(void)addPosToConnectedSetGridX:(unsigned int)X GridY:(unsigned int)Y WordKey:(unsigned int)key{ 
    [myConnectedSet addObject:[GridPointNext GridPointNextWithX:X GridPointY:Y NextWordKey:key]]; 
} 

-(NSArray *)getMyConnectedSetArray{ 
    return myConnectedSet; 
} 

-(void)clearConnectedSet{ 
    [myConnectedSet removeAllObjects]; 
} 

-(void)dealloc{ 
    [myConnectedSet release]; 

    [super dealloc]; 
} 

@end 

Вы также теперь нужно "GridPointNext" объект.

заголовка объекта Сетка должна выглядеть следующим образом:

@interface GridPointNext : NSObject { 
    unsigned int GridPointX; 
    unsigned int GridPointY; 

    unsigned int nextWordKey; 
} 

+(GridPointNext *)GridPointNextWithX:(unsigned int)X GridPointY:(unsigned int)Y NextWordKey:(unsigned int)key; 
-(id)initWithX:(unsigned int)X GridPointY:(unsigned int)Y NextWordKey:(unsigned int)key; 

-(unsigned int)getGridX; 
-(unsigned int)getGridY; 
-(unsigned int)getNextWordKey; 

@end 

М-файл для объекта должен выглядеть следующим образом:

@implementation GridPointNext 

+(GridPointNext *)GridPointNextWithX:(unsigned int)X GridPointY:(unsigned int)Y NextWordKey:(unsigned int)key{ 
    GridPointNext * aPoint = [[GridPointNext alloc] initWithX:X GridPointY:Y NextWordKey:key]; 

    [aPoint autorelease]; 

    return aPoint; 
} 

-(id)initWithX:(unsigned int)X GridPointY:(unsigned int)Y NextWordKey:(unsigned int)key{ 
    GridPointX = X; 
    GridPointY = Y; 

    nextWordKey = key; 

    return self; 
} 


-(unsigned int)getGridX{ 
    return GridPointX; 
} 

-(unsigned int)getGridY{ 
    return GridPointY; 
} 

-(unsigned int)getNextWordKey{ 
    return nextWordKey; 
} 

@end 

Вам придется иметь дело с dealloc части. Это, по крайней мере, даст вам некоторые инструменты для создания вашей пользовательской кнопки и вашего алгоритма списка слов вокруг нее.

+0

К сожалению, я не могу редактировать ваш код выше, поскольку у вас нет объектного кода UIButton. Дайте мне пару минут, и я приведу пару строк примера кода о том, как подклассы класса UIButton. – trumpetlicks

+0

@ Trumpetlicks для edit.i надеюсь, что его работа для меня. – jamil

+0

Просто продолжайте сообщать мне, мы будем работать через него :-) – trumpetlicks

0

Если я правильно понял. У пользователя может быть только правильное слово, если выбранные буквы сидят рядом друг с другом?

Вы пробоились: Держите две ссылки. Один UIButton для предыдущегоPressedButton и один UIButtonfor lastPressedButton.

Сначала пользователь нажимает D. lastPressedButton будет относиться к D. Затем пользователь нажимает O. previousPressedButton будет D. lastPressedButton будет О.

Теперь, получить ширину и высоту UIButtons и сравнить если lastPressedButton.frame.origin.x будет меньше ширины или ширины. Также проверьте, будет ли lastPressedButton.frame.origin.y меньше высоты или -высокой. Теперь вы знаете, что касается касания предыдущей кнопки. Используйте это, чтобы решить, новое ли это слово или нет.

Я бы поставил это в метод.

-(BOOL)isAdjacentLetter { 
      float buttonWidth = lastPressedButton.size.width; 
      float buttonHeight = lastPressedButton.size.height; 
      if(lastPressedButton.frame.origin.x>previousPressedButton.frame.origin.x+buttonWidth) return NO; 
      if(lastPressedButton.frame.origin.y>previousPressedButton.frame.origin.y+buttonHeight) return NO; 
      if(lastPressedButton.frame.origin.x<previousPressedButton.frame.origin.x-buttonWidth) return NO; 
      if(lastPressedButton.frame.origin.y<previousPressedButton.frame.origin.y-buttonHeight) return NO; 

      return YES; 
} 

Затем всякий раз, когда нажимается кнопка. вы можете использовать

if ([self isAdjacentLetter]) { 
    //still same word 
} else { 
    //new word. erase 
} 

Или, если я понимаю по-другому. Слова могут быть сделаны только тогда, когда буквы находятся в строке. Такие как: слева направо. Спуститься. Справа справа вверху и т.д. В этом случае определите все направления. Например, верхний левый 0, верхний - 1, верхний правый - 2. правый 3. справа вниз 4. вниз 5. слева вниз 6. слева 7.

При нажатии двух кнопок, сохраните указания. Например: Если это слева направо, направление = 3; Затем, когда нажата другая кнопка, проверьте новое направление. Если это 3, слово все еще находится в одном направлении. если это что-то еще, тогда сотрите и начните.

Надеюсь, это поможет.

+0

@ Tjeerd Я реализую ваш код, но его не работает для меня, вы можете отредактировать свой ответ, используя мой код. – jamil

Смежные вопросы