ftp.nice.ch/pub/next/games/action/xox/xox.940213.s.tar.gz#/xoxsrc.940213/xoxsrc/Xoxeroids.bproj/Rocket.m

This is Rocket.m in view mode; [Download] [Up]

#import "Rocket.h"
#import "ActorMgr.h"
#import "SoundMgr.h"
#import "Explosion.h"
#import "Xoxeroids.h"
#import "Thinker.h"

@implementation Rocket

- activate:sender :(int)tag
{
	NXSize tsize = {42,42};
	NXSize tsize2 = {21,21};
	Actor *dude = (Actor *)sender;
	float ttheta = (135. * (PI/180.) * (tag%8));

	[super activate:sender :tag];

	[self reinitWithImage:"rocket1"
		frameSize:&tsize
		numFrames:24
//		shape: LINEARRAY
		shape: RECTCIRC
		alliance: EVIL
		radius: 21
		buffered: YES
		x: dude->x - (sin(ttheta) * (dude->radius + 10))
		y: dude->y + cos(ttheta) * (dude->radius + 10)
		theta: ttheta
		vel: randBetween(10,16)
		interval: 50
		distToCorner: &tsize2];

	hits = 0;
	turnRate = randBetween(0.8,1.2) * PI/30.0;
	wobbleRate = randBetween(0.8,1.2) * (2.0*PI) / 10.0;
	thrustState = timeInMS;
	chicken = tag & 1;
	pointValue = 100;
	return self;
}

+ initialize
{
	[super initialize];
	[[NXApp delegate] addImageResource:"rocket1" for: self];
	[[NXApp delegate] addImageResource:"rocket2" for: self];
	return self;
}

- init
{
	[super init];
	r1 = [self findImageNamed:"rocket1"];
	r2 = [self findImageNamed:"rocket2"];
	return self;
}

- calcDxDy:(NXPoint *)dp
{
	if (timeInMS >= moveChangeTime)
	{
		float aimX, aimY, desiredAngle, desiredChange;
		float dx,dy, dist;
		moveChangeTime = timeInMS + 100;
		dx = gx-x; dy=gy-y;
		dist = sqrt(dx*dx+dy*dy);

		wobble += wobbleRate;
		aimX = gx + .75 * dist * sin(wobble);
		aimY = gy - .75 * dist * cos(wobble);
//		desiredAngle = atan2(x - aimX, aimY - y);
		desiredAngle = atan2(aimX - x, y - aimY);
		desiredChange = theta - desiredAngle;
		if (desiredChange < PI) desiredChange += 2.0 * PI;
		if (desiredChange >= PI) desiredChange -= 2.0 * PI;

		if (desiredChange < PI) desiredChange += 2.0 * PI;
		if (desiredChange >= PI) desiredChange -= 2.0 * PI;

		if (desiredChange < -turnRate) desiredChange = -turnRate;
		if (desiredChange > turnRate) desiredChange = turnRate;

		theta += desiredChange;
		xv = vel * -sin(theta);
		yv = vel * cos(theta);
	}
	[super calcDxDy:dp];
	return self;
}

- positionChanged
{
	float t_theta;

	if (timeInMS > changeTime)
	{
		changeTime = timeInMS + interval;
		if (++thrustState & 1) image = r1;
		else image = r2;
	}

	while (theta < 0) theta += (2*PI);
	while (theta >= (2*PI)) theta -= (2*PI);

	t_theta = theta + (7.5 * PI / 180.0);
	if (t_theta >= 2.0*PI) t_theta -= 2.0*PI;
	frame = (t_theta/(15.0 * PI / 180.0));

	[self wrapAtDistance: (3*xOffset) :(3*yOffset)];

	return self;
}

- performCollisionWith:(Actor *) dude
{
	id ret = self;
	if (++hits >= 4)
	{
		[soundMgr playSound: (EXP2SND) at:0.5];
		[actorMgr newActor:xx_explosion for:self tag:1];
		ret = [super performCollisionWith: dude];
	}
	else
	{
		theta = atan2(dude->xv, -dude->yv);
		if (chicken) theta += PI;
		moveChangeTime = timeInMS;
		[soundMgr playSound: FUTILITYSND at:0.5];
	}

	return ret;
}

@end

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.