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

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

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

@implementation Cannon

- activate:sender :(int)tag
{
	NXSize tsize = {48,48};
	NXSize tsize2 = {24,24};

	[super activate:sender :tag];

	[self reinitWithImage:"cannon1"
		frameSize:&tsize
		numFrames:4
		shape: CIRCLE
		alliance: EVIL
		radius: tsize2.width
		buffered: YES
		x: randBetween(gx+xOffset/2, gx+5.5*xOffset)
		y: randBetween(gy+yOffset/2, gy+5.5*yOffset)
		theta: randBetween(0,2*PI)
		vel: randBetween(1,4)
		interval: 100
		distToCorner: &tsize2];

	hits = 0;
	frameDir = 1;
	pointValue = 125;
	return self;
}

- positionChanged
{
	if (timeInMS > changeTime)
	{
		changeTime = timeInMS + interval;
		frame += frameDir;
		if (frame >= numFrames-1) frameDir = -1;
		else if (frame <= 0) frameDir = 1;
	}
	[self wrapAtDistance: (3*xOffset) :(3*yOffset)];
	return self;
}

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

- performCollisionWith:(Actor *) dude
{
	id ret = self;
	if (++hits >= 6)
	{
		[soundMgr playSound: (EXP3SND) at:0.5];
		[actorMgr newActor:xx_explosion for:self tag:0];
		ret = [super performCollisionWith: dude];
	}
	else
	{
		[soundMgr playSound: FUTILITYSND at:0.5];
		if ((timeInMS < panicTime) || !((hits-1)%3))
			[self fire];
	}

	panicTime = timeInMS+220;
	return ret;
}

- fire
{
	lastFireTime = timeInMS;
	[actorMgr newActor:xx_cannonball for:self tag: ++currentCannon];
	return self;
}

@end







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