azamsharp
azamsharp

Reputation: 20094

Cocos2d Drawing App Making Lines

I am making a very simple drawing application. I got the lines to draw using the ccTouchMoved event. I am putting all the touch moved moved points into an array and then using a for loop to draw a line between all the points. Now, I do not want to join the points when I have lifted my finger and started new line drawing. I got that part working too but now whenever I begin a new drawing the whole screen flicker.

//
//  HelloWorldLayer.mm
//  DrawPuppets
//
//  Created by Mohammad Azam on 12/11/12.
//  Copyright __MyCompanyName__ 2012. All rights reserved.
//

// Import the interfaces
#import "DrawPuppetLayer.h"
#import "AppDelegate.h"
#import "PhysicsSprite.h"

enum {
    kTagParentNode = 1,
};


#pragma mark - HelloWorldLayer

@interface DrawPuppetLayer()
-(void) initPhysics;
-(void) addNewSpriteAtPosition:(CGPoint)p;
-(void) createMenu;
@end

@implementation DrawPuppetLayer

+(CCScene *) scene
{
    // 'scene' is an autorelease object.
    CCScene *scene = [CCScene node];

    // 'layer' is an autorelease object.
    DrawPuppetLayer *layer = [DrawPuppetLayer node];

    // add layer as a child to scene
    [scene addChild: layer];

    // return the scene
    return scene;
}

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

        // enable events

        self.isTouchEnabled = YES;
        self.isAccelerometerEnabled = YES;
        index = -1;

        canvas = [[NSMutableArray alloc] init];

        // init physics
        [self initPhysics];

        [self scheduleUpdate];
    }
    return self;
}


-(void) draw
{

    if([lineDrawing.points count] > 1)
    {

    for(int i = 0; i<([canvas count]) ;i++)
    {
        LineDrawing *drawing = (LineDrawing *) [canvas objectAtIndex:i];

        for(int j=0;j<[drawing.points count] - 1;j++)
        {

        LinePoint *firstPoint = (LinePoint *) drawing.points[j];
        LinePoint *secondPoint = (LinePoint *) drawing.points[j + 1];

        CGPoint point1 = [[CCDirector sharedDirector] convertToGL:CGPointMake(firstPoint.x, firstPoint.y)];

        CGPoint point2 = [[CCDirector sharedDirector] convertToGL:CGPointMake(secondPoint.x, secondPoint.y)];

        ccDrawLine(point1, point2);
        }

    }


    }


    //
    // IMPORTANT:
    // This is only for debug purposes
    // It is recommend to disable it
    //
    [super draw];

    ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );

    kmGLPushMatrix();

    world->DrawDebugData();

    kmGLPopMatrix();
}




-(void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{

    lineDrawing = [[LineDrawing alloc] init];
    lineDrawing.points = [[NSMutableArray alloc] init];

    [canvas addObject:lineDrawing];

}

-(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [touches anyObject];
    CGPoint point = [touch locationInView: [touch view]];

    LinePoint *linePoint = [[LinePoint alloc] init];
    linePoint.x = point.x;
    linePoint.y = point.y;


    [lineDrawing.points addObject:linePoint];

}

- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    //Add a new body/atlas sprite at the touched location
    for( UITouch *touch in touches ) {
        CGPoint location = [touch locationInView: [touch view]];

        location = [[CCDirector sharedDirector] convertToGL: location];


    }
}



@end

Can anyone spot my mistake?

Upvotes: 0

Views: 832

Answers (1)

abitofcode
abitofcode

Reputation: 3076

Try visiting it all down to a texture, there's going to be a time when your points array gets too large to be drawn nicely

-(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    // get the node space location of our touch
    CGPoint location    = [self getNodeSpaceTouchLocationFromUIEvent:event];

    // draw with our current location and a random colour
    [_canvas begin]; // our rendertexture instance

    // do your drawing here
    [_pen drawPenWithPosition:location andColour:_colour];  

    // end capturing the current pen state
    [_canvas end];
}

Here's a simple example project written for iOSDevUK 2012 it uses GL_POINTS in Cocos2d v1 and is based on the approach we took when developing SketchShare

Upvotes: 1

Related Questions