2009-03-28 17 views
12

Qualcuno può suggerire alcuni collegamenti per l'utilizzo di UITextField in cocos2d. Voglio premere sull'etichetta, quindi il UITextField dovrebbe essere selezionato e ho bisogno di modificare su quello UITextField.Esempio UITextField in Cocos2d

risposta

15

Sto facendo questo in un progetto corrente per consentire di inserire il numero del livello per iniziare a giocare, ecco perché le mie variabili e metodi sono nominati come sono; probabilmente dovresti regolarle per dare un senso a te.

nel controller app, definire questo come una variabile di istanza:

UITextField *levelEntryTextField; 

Creare all'interno applicationDidFinishLaunching:

levelEntryTextField = [[UITextField alloc] initWithFrame: 
               CGRectMake(60, 165, 200, 90)]; 
    [levelEntryTextField setDelegate:self]; 

definire un metodo per attivare il campo di testo. Dovresti anche dichiararlo nel file di intestazione del tuo controller dell'app.

- (void)specifyStartLevel 
{ 
    [levelEntryTextField setText:@""]; 
    [window addSubview:levelEntryTextField]; 
    [levelEntryTextField becomeFirstResponder];  
} 

Questo renderà premendo il tasto "ritorno" sulla modifica fine tastiera

- (BOOL)textFieldShouldReturn:(UITextField*)textField { 
    //Terminate editing 
    [textField resignFirstResponder]; 
    return YES; 
} 

Questo viene attivato quando la modifica viene effettivamente fatto.

- (void)textFieldDidEndEditing:(UITextField*)textField { 
    if (textField==levelEntryTextField) { 
     [levelEntryTextField endEditing:YES]; 
     [levelEntryTextField removeFromSuperview]; 
     // here is where you should do something with the data they entered 
     NSString *result = levelEntryTextField.text; 
    } 
} 

Ora per impostare realmente le cose in movimento, è mettere questo da qualche parte. Io chiamo questo dall'interno di uno dei miei corsi di scena, in risposta a un'azione dell'utente:

[[[UIApplication sharedApplication] delegate] specifyStartLevel]; 
+0

ehi, ho provato questo modo, ma solo la tastiera si presenta. non ho visto il campo di testo – OMGPOP

+1

Prova [textBox setTextColor: [UIColor colorWithRed: 0 green: 0 blue: 0 alpha: 1.0]]; [textBox setBackgroundColor: [UIColor colorWithRed: 255 green: 255 blue: 255 alpha: 1.0]]; – RSH1

+0

cos'è 'window' in' SpecifyStartLevel'? ok per quei veri principianti è '[[[CCDirector sharedDirector] view] window]'. – Claudiu

10

ho preso l'esempio che Jack fornito ed effettivamente creato un progetto di lavoro, questo è stato fatto utilizzando il Cocos2d 0.7.1 XCode Template , e quindi semplicemente modificando i file * AppDelegate.m/.h, che sono forniti qui di seguito interamente. Ho anche modificato un po 'di quello che ha detto Jack, perché ritengo che la creazione di UITextField nell'appDidFinishLoading possa utilizzare un po' troppa memoria, soprattutto se il campo di testo non viene utilizzato tutto il tempo ... questa soluzione crea il campo di testo solo quando è necessario, l'esempio disegna una scena Layer Cocos2D vuota e, sullo schermo, mostra il campo di testo in cui iniziare a inserire il testo. Sputerà il risultato di ciò che hai inserito nella Console - puoi passare a ciò che è necessario nel tuo codice.

il .h

#import <UIKit/UIKit.h> 
#import "cocos2d.h" 
@interface MYSCENE : Layer <UITextFieldDelegate> 
{ 
    UITextField *myText; 
} 
-(void)specificStartLevel; 
@end 
@interface textFieldTestAppDelegate : NSObject <UIAccelerometerDelegate, UIAlertViewDelegate, UITextFieldDelegate, UIApplicationDelegate> 
{ 
    UIWindow *window; 
} 
@end 

e poi il .m

#import "textFieldTestAppDelegate.h" 
@implementation MYSCENE 
-(id) init 
{ 
    self = [super init]; 
    isTouchEnabled = YES; 
    return self; 
} 
-(BOOL)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    [self specifyStartLevel]; 
    return kEventHandled; 
} 
-(void)specifyStartLevel { 
    myText = [[UITextField alloc] initWithFrame:CGRectMake(60, 165, 200, 90)]; 
    [myText setDelegate:self]; 
    [myText setText:@""]; 
    [myText setTextColor: [UIColor colorWithRed:255 green:255 blue:255 alpha:1.0]]; 
    [[[[Director sharedDirector] openGLView] window] addSubview:myText]; 
    [myText becomeFirstResponder]; 
} 
-(BOOL)textFieldShouldReturn:(UITextField *)textField { 
    [myText resignFirstResponder]; 
    return YES; 
} 
-(void)textFieldDidEndEditing: (UITextField *)textField { 
    if(textField == myText) { 
     [myText endEditing:YES]; 
     [myText removeFromSuperview]; 
     NSString *result = myText.text; 
     NSLog([NSString stringWithFormat:@"entered: %@", result]); 
    } else { 
     NSLog(@"textField did not match myText"); 
    } 
} 
-(void) dealloc 
{ 
[super dealloc]; 
} 
@end 
@implementation textFieldTestAppDelegate 
- (void)applicationDidFinishLaunching:(UIApplication *)application 
{ 
    window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    [window setUserInteractionEnabled:YES]; 
    [[Director sharedDirector] setDisplayFPS:YES]; 
    [[Director sharedDirector] attachInWindow:window]; 
    Scene *scene = [Scene node]; 
    [scene addChild: [MYSCENE node]]; 
    [window makeKeyAndVisible]; 
    [[Director sharedDirector] runWithScene: scene]; 
} 
-(void)dealloc 
{ 
    [super dealloc]; 
} 
-(void) applicationWillResignActive:(UIApplication *)application 
{ 
    [[Director sharedDirector] pause]; 
} 
-(void) applicationDidBecomeActive:(UIApplication *)application 
{ 
    [[Director sharedDirector] resume]; 
} 
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application 
{ 
    [[TextureMgr sharedTextureMgr] removeAllTextures]; 
} 
@end 
+0

grazie fratello. bello fatto – OMGPOP

+0

Quello dovrebbe essere [[[[CCDirector sharedDirector] openGLView] window] addSubview: myText]; al posto di [[[[Director SharedDirector] openGLView] window] addSubview: myText]; –

0

provare il seguente sottoclasse CCNode, CCMenuItemTextField, di utilizzare i campi di testo in cocos2d.

La classe è direttamente sottoclasa da CCMenuItemSprite. Quando viene toccato, viene chiamato il metodo "selezionato" e viene aggiunto un UITextField alla finestra principale. Al termine della modifica, viene chiamato il metodo "unselected" e UITextField viene rimosso dalla schermata. L'input dell'utente viene salvato su un nodo CCLabelTTF, che si posiziona esattamente come UITextField originale.

CCMenuItemTextField.h

@interface CCMenuItemTextField : CCMenuItemSprite<UITextFieldDelegate> { 
    UITextField  *textField_; 
    CCLabelTTF  *label_; 

    CGFloat   paddingLeft_; 
} 

@property (readonly, nonatomic) UITextField  *textField; 
@property (readonly, nonatomic) CCLabelTTF  *label; 
@property (assign, nonatomic) CGFloat   paddingLeft; 

- (void)selected; 
- (void)unselected; 
- (void)setFontSize:(CGFloat)size; 

- (NSString*)text; 
- (void)setText:(NSString*)text; 

@end 

CCMenuItemTextField.m

#import "CCMenuItemTextField.h" 

@implementation CCMenuItemTextField 

@synthesize 
textField = textField_, 
label = label_, 
paddingLeft = paddingLeft_; 

- (id)init 
{ 
    CCSprite *normalSprite = [CCSprite spriteWithFile:@"text_field_background.png"]; 
    CCSprite *selectedSprite = [CCSprite spriteWithFile:@"text_field_background.png"]; 
    CCSprite *disabledSprite = [CCSprite spriteWithFile:@"text_field_background.png"]; 

    return [self initWithNormalSprite:normalSprite selectedSprite:selectedSprite disabledSprite:disabledSprite]; 
} 

- (id)initWithNormalSprite:(CCNode<CCRGBAProtocol> *)normalSprite 
      selectedSprite:(CCNode<CCRGBAProtocol> *)selectedSprite 
      disabledSprite:(CCNode<CCRGBAProtocol> *)disabledSprite 
{ 
    self = [super initWithNormalSprite:normalSprite 
         selectedSprite:selectedSprite 
         disabledSprite:disabledSprite 
           target:self 
           selector:@selector(selected)]; 

    if (self) { 
     paddingLeft_ = 3.0; 

     textField_ = [[UITextField alloc] init]; 
     [textField_ setTextColor:[UIColor blackColor]]; 
     [textField_ setFont:[UIFont systemFontOfSize:18]]; 

     label_ = [[CCLabelTTF node] retain]; 
     [label_ setAnchorPoint:ccp(0,0.5)]; 
     [label_ setFontSize:18]; 
     [label_ setVisible:NO]; 
     [label_ setColor:ccBLACK]; 
     [self addChild:label_]; 
    } 

    return self; 
} 

- (void)dealloc 
{ 
    [label_ release]; 
    [textField_ release]; 
    [super dealloc]; 
} 

// -------------------------------- 
// Public 
// -------------------------------- 

- (void)selected 
{ 
    [super selected]; 

    [label_ setVisible:NO]; 

    CGAffineTransform transform = [self nodeToWorldTransform]; 
    float textFieldHeight = textField_.font.lineHeight; 
    float width = self.contentSize.width; 
    float height = self.contentSize.height; 
    float left = transform.tx + paddingLeft_; 
    float top = 480 - transform.ty - height + (height - textFieldHeight)/2; 

    [textField_ setFrame:CGRectMake(left, top, width, height)]; 
    [[[[CCDirector sharedDirector] view] window] addSubview:textField_]; 
    [textField_ becomeFirstResponder]; 
    [textField_ setDelegate:self]; 
} 

- (void)unselected 
{ 
    [super unselected]; 

    [label_ setVisible:YES]; 
    [label_ setPosition:ccp(paddingLeft_, self.contentSize.height/2)]; 

    NSString *text = textField_.text ? textField_.text : @""; 
    [label_ setString:text]; 

    [textField_ resignFirstResponder]; 
    [textField_ removeFromSuperview]; 
} 

- (NSString*)text 
{ 
    return [label_ string]; 
} 

- (void)setText:(NSString*)text 
{ 
    [label_ setString:text]; 
    [textField_ setText:text]; 
} 

// -------------------------------- 
// UITextFieldDelegate 
// -------------------------------- 

- (BOOL)textFieldShouldReturn:(UITextField*)textField { 
    [self unselected]; 
    return YES; 
} 

- (void)textFieldDidEndEditing:(UITextField*)textField { 
    [self unselected]; 
} 

- (void)setFontSize:(CGFloat)size 
{ 
    [label_ setFontSize:size]; 
    [textField_ setFont:[UIFont systemFontOfSize:size]]; 
} 

// -------------------------------- 
// CCNode 
// -------------------------------- 

- (void)onExitTransitionDidStart 
{ 
    [super onExitTransitionDidStart]; 
    [self unselected]; 
} 

@end 
+1

Quale versione di Cocos2d hai usato? Non sembra funzionare direttamente con la v1.1. –

2

Per aggiungere campo di testo in cocos2d, come di seguito Codice

prima di tutto si aggiunge vista in scena e afetr aggiuntivo textfield aggiungere in vista questo è molto facile.

-(id) init 
{ 
    if((self=[super init])) 
    { 

     // add view in scene 

     UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 568)]; 
     view.backgroundColor = [UIColor redColor]; 

    // add textfield in view 

     UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 140, 300, 30)]; 
     textField.borderStyle = UITextBorderStyleRoundedRect; 
     textField.font = [UIFont systemFontOfSize:15]; 
     textField.placeholder = @"enter text"; 
     textField.autocorrectionType = UITextAutocorrectionTypeNo; 
     textField.keyboardType = UIKeyboardTypeDefault; 
     textField.returnKeyType = UIReturnKeyDone; 
     textField.clearButtonMode = UITextFieldViewModeWhileEditing; 
     textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter; 
     textField.delegate = self; 
     [view addSubview:textField]; 

    // add view in scene 

     [[[CCDirector sharedDirector] view] addSubview:view]; 
} 
    return self; 
} 

è anche possibile utilizzare CCTextfield nel miglior esempio cocos2d è https://github.com/iNinja/CCTextField