This is FlyingWindow.m in view mode; [Download] [Up]
// Copyright (c) 1997 by Don Yacktman
// All rights reserved.
// Permission to use this code in your application, whether
// commercial, shareware, or freeware, is granted.
// This notice may not be removed or altered.
#import "FlyingWindow.h"
#import <libc.h>
static id contentImage = nil;
@implementation FlyingWindow
- initAt:(NSPoint *)thePoint
{
// set up window with image and put it on the screen centered at thePoint
NSRect theFrame;
// make sure we have the mini-envelope image loaded
if (!contentImage)
contentImage = [NSImage imageNamed:@"FlyingIcon.tiff"];
// set up our frame (where we'll be on the screen and our size)
// get the size from the image
theFrame.size = [contentImage size];
// place our selves on the screen so that our center is at the
// point passed in by the caller of this method
theFrame.origin.x = thePoint->x - NSWidth(theFrame) / 2;
theFrame.origin.y = thePoint->y - NSHeight(theFrame) / 2;
// call the superclass designate initializer to set ourself up.
[self initWithContentRect:theFrame styleMask:NSBorderlessWindowMask backing:NSBackingStoreRetained defer:NO screen:NULL];
// set up a new random velocity vector
velocity.x = (random() % HORIZ_JUMPS) - HORIZ_JUMPS / 2;
velocity.y = (random() % VERT_JUMPS) + MIN_VERT;
// create an NSImageView and insert it into ourself so that
// the mini-envelope image will be displayed
{
NSImageView *imageView = [[NSImageView alloc] initWithFrame:[[self contentView] frame]];
[imageView setImage:contentImage];
[imageView setImageAlignment:NSImageAlignCenter]; // this is redundant since it is the default
[imageView setImageFrameStyle:NSImageFrameNone]; // this is redundant since it is the default
[imageView setImageScaling:NSScaleNone]; // make sure the image isn't resized at all
[imageView setEditable:NO]; // make sure no one can replace the image by dragging in a new one
[[self contentView] addSubview:imageView];
}
// put us on the screen immediately
[self orderFront:nil];
return self;
}
- reInitAt:(NSPoint *)thePoint
{ // re-init the window as above, but for already created window.
// ideally, the code above should call this method and not be a
// cut and paste job. The problem is that some of the things
// need to be set up in varying orders between the two methods.
// So we'd have to break the initializations into seperate private
// methods and call those methods from this and the above method.
// To reduce complexity in this example, I chose to not do that,
// even though IMHO it is a better design.
// get the frame size
NSSize theSize;
theSize = [contentImage size];
// reset our position on the screen, as above, so that we are centered on thePoint
[self setFrameOrigin:NSMakePoint((thePoint->x - theSize.width / 2), (thePoint->y - theSize.height / 2))];
// set up a new random velocity vector
velocity.x = (random() % HORIZ_JUMPS) - HORIZ_JUMPS / 2;
velocity.y = (random() % VERT_JUMPS) + MIN_VERT;
// put us on the screen
[self orderFront:nil];
return self;
}
- move
{ // move us one animation step.
// get our window's frame
NSRect theFrame = [self frame];
// Move ourself by the amount our present velocity requires
[self setFrameOrigin:NSMakePoint((NSMinX(theFrame) + velocity.x), (NSMinY(theFrame) + velocity.y))];
// update the velocity, taking gravity into account
velocity.y -= GRAVITY;
return self;
}
- (BOOL)onScreen
{ // are we still on the screen, or did we move out of bounds?
NSRect theFrame = [self frame];
NSScreen *myscreen = [self screen];
// normalize (translate) to the screen's position
theFrame.origin.x -= [myscreen frame].origin.x;
theFrame.origin.y -= [myscreen frame].origin.y;
// consider us on screen if we're off the top since we'll be
// coming back down sometime
if (!myscreen) { // no screen returned? Use standard NeXT screen size
if ((NSMaxX(theFrame) < 0) || (NSMaxY(theFrame) < 0) ||
(NSMinX(theFrame) > 1120.0)) return NO;
return YES;
}
// if we are off the left, right, or bottom side of the screen,
// then we are off the screen.
if ((NSMaxX(theFrame) < NSMinX(([myscreen frame]))) ||
(NSMinX(theFrame) > NSMaxX(([myscreen frame]))) ||
(NSMaxY(theFrame) < NSMinY(([myscreen frame])))) {
return NO;
}
// otherwise, we're on the screen.
return YES;
}
@endThese are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.