Question

I want to create a visible object with a trajectory using standard actions (CCMoveBy and e.t.c) which is similar to:

x = sin(y)

My code:

CCMoveBy *moveAction1 = [CCMoveBy actionWithDuration:1.5 position:ccp(300, 0)];
CCEaseInOut *easeInOutAction1 = [CCEaseInOut actionWithAction:moveAction1 rate:2];
CCMoveBy *moveAction2 = [CCMoveBy actionWithDuration:1.5 position:ccp(-300, 0)];
CCEaseInOut *easeInOutAction2 = [CCEaseInOut actionWithAction:moveAction2 rate:2];
CCMoveBy *moveAction3 = [CCMoveBy actionWithDuration:1.5 position:ccp(0, -32)];
CCSpawn *moveActionRight = [CCSpawn actionOne:easeInOutAction1 two:moveAction3];
CCSpawn *moveActionLeft = [CCSpawn actionOne:easeInOutAction2 two:moveAction3];
CCSequence *sequenceOfActions = [CCSequence actionOne:moveActionRight two:moveActionLeft];
CCRepeatForever *finalMoveAction = [CCRepeatForever actionWithAction:sequenceOfActions];
[enemy runAction:finalMoveAction];

This code shows move down only. The problem is that object has a different x and y accelerations and I don't know how to combine them

UPDATED

- (void)tick:(ccTime)dt
{
    CGPoint pos = self.position;
    pos.y -= 50 * dt;
    if (pos.y < activationDistance) {
        pos.x = 240 + sin(angle) * 140;
        angle += dt * 360 * 0.007;
        if (angle >= 360) {
            angle = ((int)angle) % 360;
        }
    }
    self.position = pos;
}

It is my current solution. I can increase activationDistance to adjust the object trajectory. But I want to setup an initial value of the angle variable.

I use numbers instead of variables because they are used inside this function only.

SOLVED

To change the initial angle:

angle = point.x < 240 ? -asin((240 - point.x) / 140) : asin((point.x - 240) / 140);

the main problem was my tiled map has its own coordinates and cover 320x320 part of the screen only

Was it helpful?

Solution

I think it will be easier for you to just do it in your frame update method (the one I assume you schedule for updating your objects. So why not just do :

- (void)tick:(ccTime)dt {
   CGPoint pos = myObject.position;
   pos.x = <desired x> + sin(angle);
   pos.y = pos.y - y_acceleration * dt;
   angle += dt * 360 * x_acceleration;
   if (angle >= 360) 
       angle = ((int)angle) % 360;

   myObject.position = pos;
}

And you can apply the same for the y axis of the object

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top