Translate

Home > October 2011

October 2011

XML Parsing and Saving Using GDataXML

Tuesday, October 25, 2011 Category : 0

My XML Have Following pattern

<Party>
  <Player>
    <Name>Butch</Name>
    <Level>1</Level>
    <Class>Fighter</Class>
  </Player>
  <Player>
    <Name>Shadow</Name>
    <Level>2</Level>
    <Class>Rogue</Class>
  </Player>
  <Player>
    <Name>Crak</Name>
    <Level>3</Level>
    <Class>Wizard</Class>
  </Player>
</Party>

So i have root node Party and a Child Node Player
After parsing XML i will be used two class for store data in memory. here is the two class


//Party.h
#import <Foundation/Foundation.h>

@interface Party : NSObject {
    NSMutableArray *_players;
}

@property (nonatomic, retain) NSMutableArray *players;

@end


//
//  Party.m
//  XMLTest
//
//  Created by Ray Wenderlich on 3/17/10.
//  Copyright 2010 Ray Wenderlich. All rights reserved.
//

#import "Party.h"

@implementation Party
@synthesize players = _players;

- (id)init {

    if ((self = [super init])) {
        self.players = [[[NSMutableArray alloc] init] autorelease];
    }
    return self;
   
}

- (void) dealloc {
    self.players = nil;   
    [super dealloc];
}

@end


//
//  Player.h
//  XMLTest
//
//  Created by Ray Wenderlich on 3/17/10.
//  Copyright 2010 Ray Wenderlich. All rights reserved.
//

#import <Foundation/Foundation.h>

typedef enum {
    RPGClassFighter,
    RPGClassRogue,
    RPGClassWizard
} RPGClass;
   
@interface Player : NSObject {
    NSString *_name;
    int _level;
    RPGClass _rpgClass;
}

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int level;
@property (nonatomic, assign) RPGClass rpgClass;

- (id)initWithName:(NSString *)name level:(int)level rpgClass:(RPGClass)rpgClass;

@end


#import "Player.h"

@implementation Player
@synthesize name = _name;
@synthesize level = _level;
@synthesize rpgClass = _rpgClass;

- (id)initWithName:(NSString *)name level:(int)level rpgClass:(RPGClass)rpgClass {

    if ((self = [super init])) {
        self.name = name;
        self.level = level;
        self.rpgClass = rpgClass;
    }   
    return self;
   
}

- (void) dealloc {
    self.name = nil;   
    [super dealloc];
}

@end

use following function in any class where you want to build your parse method

#import "Party.h"
#import "Player.h"
#import "GDataXMLNode.h"

+ (Party *)loadParty {

    NSString *filePath = [self dataFilePath:FALSE];
    NSData *xmlData = [[NSMutableData alloc] initWithContentsOfFile:filePath];
    NSError *error;
    GDataXMLDocument *doc = [[GDataXMLDocument alloc] initWithData:xmlData options:0 error:&error];
    if (doc == nil) { return nil; }
   
    Party *party = [[[Party alloc] init] autorelease];
    //NSArray *partyMembers = [doc.rootElement elementsForName:@"Player"];
    NSArray *partyMembers = [doc nodesForXPath:@"//Party/Player" error:nil];
    for (GDataXMLElement *partyMember in partyMembers) {
               
        // Let's fill these in!
        NSString *name;
        int level;
        RPGClass rpgClass;

        // Name
        NSArray *names = [partyMember elementsForName:@"Name"];
        if (names.count > 0) {
            GDataXMLElement *firstName = (GDataXMLElement *) [names objectAtIndex:0];
            name = firstName.stringValue;
        } else continue;
               
        // Level
        NSArray *levels = [partyMember elementsForName:@"Level"];
        if (levels.count > 0) {
            GDataXMLElement *firstLevel = (GDataXMLElement *) [levels objectAtIndex:0];
            level = firstLevel.stringValue.intValue;
        } else continue;
       
        // Class
        NSArray *classes = [partyMember elementsForName:@"Class"];
        if (classes.count > 0) {
            GDataXMLElement *firstClass = (GDataXMLElement *) [classes objectAtIndex:0];
            if ([firstClass.stringValue caseInsensitiveCompare:@"Fighter"] == NSOrderedSame) {
                rpgClass = RPGClassFighter;
            } else if ([firstClass.stringValue caseInsensitiveCompare:@"Rogue"] == NSOrderedSame) {
                rpgClass = RPGClassRogue;
            } else if ([firstClass.stringValue caseInsensitiveCompare:@"Wizard"] == NSOrderedSame) {
                rpgClass = RPGClassWizard;
            } else {
                continue;
            }           
        } else continue;
       
        Player *player = [[[Player alloc] initWithName:name level:level rpgClass:rpgClass] autorelease];
        [party.players addObject:player];
       
    }
           
    [doc release];
    [xmlData release];
    return party;
   
}

+ (void)saveParty:(Party *)party {

    GDataXMLElement * partyElement = [GDataXMLNode elementWithName:@"Party"];
   
    for(Player *player in party.players) {
    
        GDataXMLElement * playerElement = [GDataXMLNode elementWithName:@"Player"];
        GDataXMLElement * nameElement = [GDataXMLNode elementWithName:@"Name" stringValue:player.name];
        GDataXMLElement * levelElement = [GDataXMLNode elementWithName:@"Level" stringValue:[NSString stringWithFormat:@"%d", player.level]];
        NSString *classString;
        if (player.rpgClass == RPGClassFighter) {
            classString = @"Fighter";
        } else if (player.rpgClass == RPGClassRogue) {
            classString = @"Rogue";
        } else if (player.rpgClass == RPGClassWizard) {
            classString = @"Wizard";
        }       
        GDataXMLElement * classElement = [GDataXMLNode elementWithName:@"Class" stringValue:classString];
       
        [playerElement addChild:nameElement];
        [playerElement addChild:levelElement];
        [playerElement addChild:classElement];
        [partyElement addChild:playerElement];
    }
   
    GDataXMLDocument *document = [[[GDataXMLDocument alloc] initWithRootElement:partyElement] autorelease];
    NSData *xmlData = document.XMLData;
   
    NSString *filePath = [self dataFilePath:TRUE];
    NSLog(@"Saving xml data to %@...", filePath);
    [xmlData writeToFile:filePath atomically:YES];
       
}

Download GDataXML class from here

Polymorphism

Monday, October 24, 2011 Category : 0

Polymorphism is the ability of an object of one class to appear and be used as an object 
of another class. This is usually done by creating methods and attributes that are similar to 
those of another class. 
// file: Animal.h
#import <Foundation/Foundation.h>
 
@interface Animal : NSObject
{
        NSString *name;
}
 
@property(copy) NSString *name;
 
-(id) initWithName: (NSString *) aName;
 
-(void) talk;
 
@end
 
// =============================
 
// file: Animal.m
#import "Animal.h"
 
@implementation Animal
 
@synthesize name;
 
-(id) initWithName:(NSString *)aName {
        self = [super init];
 
        if ( self ) 
                self.name = aName;
 
        return self;
}
 
-(id) init {
        return [self initWithName:@""];
}
 
-(void) talk {
        NSLog(@"%@: Animals cannot talk!", name);
}
 
-(void) dealloc {
        if ( name )
                [name release];
        [super dealloc];
}
 
@end
 
// =============================
 
// file: Cat.h
#import "Animal.h"
 
@interface Cat : Animal
 
-(void) talk;
 
@end
 
// =============================
 
// file: Cat.m
#import "Cat.h"
 
@implementation Cat
 
-(void) talk {
        NSLog(@"%@: Meow!", name);
}
 
@end
 
// =============================
 
// file: Dog.h
#import "Animal.h"
 
@interface Dog : Animal
 
-(void) talk;
 
@end
 
// =============================
 
// file: Dog.m
#import "Dog.h"
 
@implementation Dog
 
-(void) talk {
        NSLog(@"%@: Woof! Woof!", name);
}
 
@end
 
// =============================
 
// file: main.m
#import <Foundation/Foundation.h>
#import "Animal.h"
#import "Cat.h"
#import "Dog.h"
 
int main (int argc, const char * argv[])
{
        // all instances are behind a superclass type (Animal)
        Animal *animal = [[Animal alloc] initWithName:@"Animal"];
        Animal *missy = [[Cat alloc] initWithName:@"Missy"];
        Animal *mr = [[Cat alloc] initWithName:@"Mr. Mistophelees"];
        Animal *lassie = [[Dog alloc] initWithName:@"Lassie"];
 
        // polymorphic behavior
        [animal talk];
        [missy talk];
        [mr talk];
        [lassie talk];
 
        // releasing memory
        [animal release];
        [missy release];
        [mr release];
        [lassie release];
 
    return 0;
}
 
// =============================
 
// --> Console output:
// Animal: Animals cannot talk!
// Missy: Meow!
// Mr. Mistophelees: Meow!
// Lassie: Woof! Woof!

Dynamic Image Load

Thursday, October 13, 2011 Category : 0

var imageLocation:String = File.applicationDirectory.nativePath + "\\assets\\LineBoarderTop.png";
                var borderImage:Image = new Image();
                borderImage.source = imageLocation;
                borderImage.percentHeight = 100;
                borderImage.percentWidth = 100;
                borderImage.scaleContent = true;
                borderImage.maintainAspectRatio = false;
                borderImage.addEventListener(Event.COMPLETE, function(e:Event):void
                {
                    var bitmapData:BitmapData = Bitmap(e.target.content).bitmapData;
                    // draw white background
                });
                borderImage.load(imageLocation);

pixel value to RGB value extract

Saturday, October 1, 2011 Category : 0

var pixel:uint = bitmap.bitmapData.getPixel(i,j);
 var alpha:uint = pixel >> 24 & 0xff;
  var red:uint = pixel >> 16 & 0xff;
  var green:uint = pixel >> 8 & 0xff;
var blue:uint = pixel & 0xff;

BitmapData to Pixel Value , image pixel value

Category : 0

for(var i:int=startPoint.x; i < endPoint.x;i++)
                {
                    for(var j:int=startPoint.y;j<endPoint.y; j++)
                    {
                        var pixel:uint = bitmap.bitmapData.getPixel(i,j);
                        //var alpha:uint = pixel >> 24 & 0xff;
                        var red:uint = pixel >> 16 & 0xff;
                        var green:uint = pixel >> 8 & 0xff;
                        var blue:uint = pixel & 0xff;

                        var redIntensity:Number = (red / ((green + blue) / 2));
                        if (redIntensity > 1.8)  // 1.5 because it gives the best results
                        {
                            // reduce red to the average of blue and green
                            //bm.SetPixel(i, j, Color.FromArgb((pixel.G + pixel.B) / 2, pixel.G, pixel.B));
                            var colorTrans:ColorTransform = new ColorTransform(90,green,blue);
                            //bitmap.bitmapData.setPixel(i,j,uint((green + blue) / 2));
                            bitmap.bitmapData.setPixel(i,j,colorTrans.color);
                        }

                    }
                }

Powered by Blogger.