This is InfoView.m in view mode; [Download] [Up]
#import "InfoView.h"
#import <math.h>
#define RANDINT(n) (random() % ((n)+1))
inline float restrictValue(float val, float max, float min)
{
if (val > max)
return max;
else if (val < min)
return min;
else
return val;
}
@implementation InfoView
void handler(DPSTimedEntry teNumber, double now, void *userData)
{
id obj = (id) userData;
[obj animationClick];
}
- initFrame:(NXRect *)frameRect;
{
id bundle;
char buf[MAXPATHLEN + 1];
char fileName[MAXPATHLEN + 1];
[super initFrame:frameRect];
bundle = [NXBundle bundleForClass:[self class]];
if(![bundle getPath:buf
forResource:"InfoPanel"
ofType:"nib"])
return nil;
strcpy(fileName, buf);
strcat(fileName, "/OutOfTheWood.tiff");
oldImage = frontImage = [[NXImage alloc] initFromFile:fileName];
strcpy(fileName, buf);
strcat(fileName, "/Credits.tiff");
image = [[NXImage alloc] initFromFile:fileName];
strcpy(fileName, buf);
strcat(fileName, "/bat.tiff");
bat = [[NXImage alloc] initFromFile:fileName];
strcpy(fileName, buf);
strcat(fileName, "/BatSound.snd");
batSound = [[Sound alloc] initFromSoundfile:fileName];
toggle = YES;
[image getSize:&imageSize];
[bat getSize:&batSize];
buffer = [[NXImage alloc] initSize:&imageSize];
[self compositeWithDissolve:NO andDelta:0.0];
frontPage = YES;
return self;
}
- free;
{
[self removeTe];
[image free];
[oldImage free];
[buffer free];
[bat free];
return [super free];
}
- compositeWithDissolve:(BOOL)aBool andDelta:(float)aDelta
{
NXPoint pt = {0.0,0.0};
[buffer lockFocus];
[oldImage composite:NX_COPY toPoint:&pt];
if(aBool)
[image dissolve:aDelta toPoint:&pt];
[buffer unlockFocus];
return self;
}
- compositeWithChecker:(BOOL)aBool andDelta:(float)aDelta
{
NXRect rects[64], r;
NXSize imgSize,rectSize;
NXPoint pt = {0.0,0.0};
float height,h;
int x, y, index;
id img;
[buffer lockFocus];
[oldImage composite:NX_COPY toPoint:&pt];
if(!aBool){
[buffer unlockFocus];
return self;
}
[image getSize:&imgSize];
img = [[NXImage alloc] initSize:&imgSize];
rectSize.width = imgSize.width / 8;
rectSize.height = imgSize.height / 8;
height = 2 * aDelta * rectSize.height;
h = height - rectSize.height;
for(x = 0; x < 8; x ++){
for(y = 0; y < 8; y ++){
index = x + y * 8;
if(height > rectSize.height){
if((x % 2) == (y % 2)){
NXSetRect(&rects[index],x * rectSize.width,
(y + 1) * rectSize.height - h,
rectSize.width, h);
} else {
NXSetRect(&rects[index],x * rectSize.width,
y * rectSize.height,
rectSize.width,rectSize.height);
}
} else {
if((x % 2) != (y % 2)){
NXSetRect(&rects[index],x * rectSize.width,
y * rectSize.height,rectSize.width, height);
} else {
NXSetRect(&rects[index],0,0,0,0);
}
}
}
}
[img lockFocus];
PSsetgray(0.0);
PSsetalpha(0.0);
NXSetRect(&r,0,0,imgSize.width,imgSize.height);
NXRectFill(&r);
PSsetalpha(1.0);
NXRectFillList(rects,64);
[image composite:NX_SIN toPoint:&pt];
[img unlockFocus];
[img composite:NX_SOVER toPoint:&pt];
[buffer unlockFocus];
[img free];
return self;
}
- drawSelf:(NXRect *)rects :(int)rectCount;
{
NXPoint p1 = {0.0, 0.0};
PSsetgray (NX_LTGRAY);
NXRectFill (&bounds);
[buffer composite:NX_COPY toPoint:&p1];
return self;
}
- mouseDown:(NXEvent *) thisEvent
{
delta = 0.0;
[self compositeWithDissolve:NO andDelta:delta];
[self display];
animationDissolve =YES;
animationCrowl = NO;
animationStep = 0;
if(!animateTe)
animateTe = DPSAddTimedEntry(.03,(DPSTimedEntryProc) handler, self, NX_BASETHRESHOLD);
return self;
}
- start:sender
{
[self display];
[self removeTe];
animationDissolve = NO;
animationCrowl = YES;
animationStep = 0;
randDirection = 0;
batRect.origin.y = 50.0;
batRect.origin.x = 50.0;
batRect.size.width = batSize.width;
batRect.size.height = batSize.height / 4;
if(!animateTe)
animateTe = DPSAddTimedEntry(.03,(DPSTimedEntryProc) handler, self, NX_BASETHRESHOLD);
return self;
}
- stop:sender
{
[self removeTe];
return self;
}
- animationClick
{
if(animationCrowl)
[self animateCrowl];
if(animationDissolve)
[self animateDissolve];
NXPing();
return self;
}
- animateCrowl
{
NXRect tmpRect;
int nr;
[self lockFocus];
[self drawBackground:&batRect];
if(animationStep % 11 == 0)
randDirection = RANDINT(7);
if(animationStep % 13 == 0 && randDirection % 2 == 0)
[batSound play:self];
switch(randDirection){
case 0 :batRect.origin.x += 1;
break;
case 1 :batRect.origin.x += 1;
batRect.origin.y += 1;
break;
case 2 :batRect.origin.y += 1;
break;
case 3 :batRect.origin.x -= 1;
batRect.origin.y += 1;
break;
case 4 :batRect.origin.x -= 1;
break;
case 5 :batRect.origin.x -= 1;
batRect.origin.y -= 1;
break;
case 6 :batRect.origin.y -= 1;
break;
case 7 :batRect.origin.x += 1;
batRect.origin.y -= 1;
break;
}
animationStep++;
batRect.origin.x = restrictValue(batRect.origin.x,200,50);
batRect.origin.y = restrictValue(batRect.origin.y,230,50);
NXSetRect(&tmpRect,0,0,batSize.width,batSize.height / 4);
nr = animationStep % 8;
switch(nr){
case 1:
case 6:
tmpRect.origin.y += batSize.height / 4;
break;
case 2:
case 5:
tmpRect.origin.y += batSize.height / 2;
break;
case 3:
case 4:
tmpRect.origin.y += 3 * batSize.height / 4;
break;
}
[bat composite:NX_SOVER fromRect:&tmpRect toPoint:&batRect.origin];
[[self window] flushWindow];
[self unlockFocus];
return self;
}
- animateDissolve
{
id dummy;
delta = delta + 0.20;
if(toggle)
[self compositeWithDissolve:YES andDelta:delta];
else
[self compositeWithChecker:YES andDelta:delta];
[self display];
if(delta < 1.0)
return self;
toggle = !toggle;
dummy = oldImage;
oldImage = image;
image = dummy;
frontPage = (!frontPage);
[self removeTe];
if(frontPage)
[self start:self];
return self;
}
- removeTe
{
if(animateTe){
DPSRemoveTimedEntry(animateTe);
animateTe = 0;
}
return self;
}
- drawBackground:(NXRect *)rect
{
NXRect tmpRect = *rect;
NX_X(&tmpRect) = floor(NX_X(&tmpRect));
NX_Y(&tmpRect) = floor(NX_Y(&tmpRect));
if (NXDrawingStatus == NX_DRAWING) {
PSsetgray (NX_WHITE);
PScompositerect (NX_X(&tmpRect), NX_Y(&tmpRect),
NX_WIDTH(&tmpRect), NX_HEIGHT(&tmpRect), NX_SOVER);
}
[frontImage composite:NX_SOVER fromRect:&tmpRect toPoint:&tmpRect.origin];
return self;
}
- windowWillClose:sender
{
id dummy;
[self stop:self];
if(!frontPage){
toggle = !toggle;
frontPage = YES;
dummy = oldImage;
oldImage = image;
image = dummy;
[self compositeWithDissolve:NO andDelta:0.0];
}
return self;
}
- woodPage:sender
{
Pasteboard *pboard = nil;
static const char *url = NULL;
const char *types[1];
if(!url){
if(strings)
url = [strings valueForStringKey:"URL"];
else
url= NXUniqueString("file:/Hoffmann/Uwe/Library/HTML/HomePage/Wood/Wood.html");
}
if(!pboard)
pboard = [Pasteboard newUnique];
types[0] = NXAsciiPboardType;
[pboard declareTypes:types num:1 owner:NXApp];
[pboard writeType:NXAsciiPboardType
data:url length:strlen(url)];
if(NXPerformService("OmniWeb/Open URL", pboard))
[window performClose:self];
else if(NXPerformService("SpiderWoman/Open URL", pboard))
[window performClose:self];
else if(NXPerformService("NetSurfer/Open URL", pboard))
[window performClose:self];
else
NXBeep();
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.