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

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

#import "Cannonball.h"
#import "ActorMgr.h"
#import "SoundMgr.h"
#import "Explosion.h"
#import "Xoxeroids.h"

@implementation Cannonball

- activate:sender :(int)tag
{
	NXSize tsize = {30,30};
	NXSize tsize2 = {15,15};
	Actor *dude = (Actor *)sender;
	float ttheta = (90. * (PI/180.) * (tag%4));

	[super activate:sender :tag];

	[self reinitWithImage:"cannonball1"
		frameSize:&tsize
		numFrames:5
		shape: CIRCLE
		alliance: EVIL
		radius: 15
		buffered: YES
		x: dude->x - (sin(ttheta) * (dude->radius + 10))
		y: dude->y + cos(ttheta) * (dude->radius + 10)
		theta: ttheta
		vel: randBetween(9,13)
		interval: 70
		distToCorner: &tsize2];

	hits = 0;
	pointValue = 70;
	return self;
}

- calcDxDy:(NXPoint *)dp
{
	if (timeInMS > moveChangeTime)
	{
		float dx, dy, dist, dxv, dyv;
		moveChangeTime = timeInMS + 300;
		dx = gx-x; dy=gy-y;
		dist = sqrt(dx*dx+dy*dy);
		dxv = vel * dx/dist;
		dyv = vel * dy/dist;
		if (dxv < xv) xv-=1;
		else if (dxv > xv) xv+=1;
		if (dyv < yv) yv-=1;
		else if (dyv > yv) yv+=1;
	}
	[super calcDxDy:dp];
	return self;
}

- positionChanged
{
	[super positionChanged];
	[self wrapAtDistance: (3*xOffset) :(3*yOffset)];
	return self;
}

- performCollisionWith:(Actor *) dude
{
	id ret = self;
	if (++hits >=2)
	{
		[soundMgr playSound: (EXP2SND) at:0.5];
		[actorMgr newActor:xx_explosion for:self tag:1];
		ret = [super performCollisionWith: dude];
	}
	else
	{
		[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.