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.