quakeforge/ruamoko/cl_menu/HUD.r
Jeff Teunissen f86e933c6a Array API fixes
NQ menus work now.
2010-12-12 05:40:24 -05:00

213 lines
2.8 KiB
R

#include "draw.h"
#include "debug.h"
#include "gib.h"
#include "string.h"
#include "system.h"
#include "HUD.h"
integer HUDHandleClass;
@implementation HUDObject
- (id) initWithComponents: (integer) x : (integer) y
{
self = [super init];
origin = makePoint (x, y);
visible = YES;
return self;
}
- (void) dealloc
{
[super dealloc];
}
- (integer) handle
{
return handle;
}
- (Point) origin
{
return origin;
}
- (Size) size
{
return makeSize (0, 0);
}
- (void) setOrigin: (Point) newPoint
{
origin = newPoint;
}
- (void) translate: (Point) offset
{
origin = addPoint(origin, offset);
}
- (BOOL) isVisible
{
return visible;
}
- (void) setVisible: (BOOL) _visible
{
visible = _visible;
}
- (void) display
{
}
@end
@implementation HUDText : HUDObject
- (id) initWithComponents: (integer) x :(integer) y :(string) _text
{
self = [super initWithComponents :x :y];
[self setText :_text];
return self;
}
- (Size) size
{
return makeSize (8*(integer) strlen (text), 8);
}
- (string) text
{
return text;
}
- (void) setText: (string) _text
{
text = _text;
}
- (void) display
{
if (visible)
Draw_String (origin.x, origin.y, text);
}
@end
@implementation HUDGraphic : HUDObject
- (id) initWithComponents: (integer)x :(integer)y :(string) _file
{
self = [super initWithComponents :x :y];
[self setFile :_file];
return self;
}
- (void) dealloc
{
[picture release];
[super dealloc];
}
- (Size) size
{
return makeSize ([picture width], [picture height]);
}
- (void) setFile: (string) _file
{
[picture release];
picture = [[QPic alloc] initName :_file];
}
- (void) display
{
if (visible)
[picture draw :origin.x :origin.y];
}
@end
@implementation HUDAnimation : HUDObject
- (id) initWithComponents: (integer) x :(integer) y
{
self = [super initWithComponents :x :y];
frames = [[Array alloc] init];
currentFrame = 0;
nextFrameTime = 0;
looping = NO;
return self;
}
- (void) dealloc
{
[frames release];
[super dealloc];
}
- (Size) size
{
local Frame frame;
frame = [frames objectAtIndex: currentFrame];
return [frame size];
}
- (void) addFrame: (Frame) frame
{
[frames addObject: frame];
}
- (void) changeFrame
{
while (time >= nextFrameTime) {
local Frame f;
if (++currentFrame == [frames count]) {
if (looping)
currentFrame = 0;
else {
nextFrameTime = 0.0;
currentFrame = 0;
return;
}
}
f = [frames objectAtIndex: currentFrame];
nextFrameTime += [f duration];
}
}
- (void) display
{
local Frame f;
if (!visible)
return;
if (nextFrameTime)
[self changeFrame];
f = [frames objectAtIndex: currentFrame];
[f draw :origin.x :origin.y];
}
- (void) start
{
local Frame f;
currentFrame = 0;
f = [frames objectAtIndex: 0];
nextFrameTime = time + [f duration];
}
- (void) stop
{
nextFrameTime = 0.0;
currentFrame = 0;
}
- (void) setLooping: (BOOL) _looping
{
looping = _looping;
}
@end