// Sprite.hpp : Sprite class // // 08.09.1998 / DH - First release // 16.11.1998 / DH - Sprite brightness // // Copyright (c) 1998 Daniel Hartmeier. All rights reserved. #ifndef __Sprite__ #define __Sprite__ #include class Image; class Sprite; class ActiveSprite; class Bullet; #include "Light.hpp" // ------------------------------------------------------------------- class Image { public: Image(unsigned char *address); virtual ~Image(); virtual u_short tpage() const; virtual int cx() const; virtual int cy() const; virtual int pw() const { return gsimage.pw; } virtual int ph() const { return gsimage.ph; } virtual void moveImage(int x, int y, int w = 0, int h = 0, int u = 0, int v = 0); protected: private: GsIMAGE gsimage; }; // ------------------------------------------------------------------- class Sprite { public: Sprite(Image *image, int w, int h, int u = 0, int v = 0); virtual ~Sprite(); virtual void draw(GsOT *ot); virtual void move(int x, int y) { gssprite.x = x; gssprite.y = y; return; } virtual void change(int u, int v) { gssprite.u = u; gssprite.v = v; return; } virtual int x() const { return gssprite.x; } virtual int y() const { return gssprite.y; } virtual int w() const { return gssprite.w; } virtual int h() const { return gssprite.h; } virtual unsigned long attribute() const { return gssprite.attribute; } virtual void setAttribute(unsigned long attribute) { gssprite.attribute = attribute; return; } virtual void setScale(int sx, int sy) { gssprite.scalex = sx; gssprite.scaley = sy; return; } virtual void setSize(int w, int h) { gssprite.w = w; gssprite.h = h; gssprite.mx = w/2; gssprite.my = h/2; return; } virtual void setRGB(unsigned char r, unsigned char g, unsigned char b); virtual void setRotate(long r) { gssprite.rotate = r; return; } virtual bool isVisible() const { return (gssprite.x > -gssprite.w/2) && (gssprite.x < 320+gssprite.w/2) && (gssprite.y >-gssprite.h/2) && (gssprite.y < 256+gssprite.h/2); } protected: private: Image *image; GsSPRITE gssprite; }; // ------------------------------------------------------------------- class ActiveSprite : public Sprite { public: // speed in 1/256 pixel per frame (>0 means down/right) ActiveSprite(Image *image, int w, int h, int u = 0, int v = 0) : Sprite(image, w, h, u, v), _speedX(0), _speedY(0), wayX(0), wayY(0) {} virtual int speedX() const { return _speedX; } virtual int speedY() const { return _speedY; } virtual void setSpeedX(int speedX) { _speedX = speedX; return; } virtual void setSpeedY(int speedY) { _speedY = speedY; return; } virtual void moveSpeed() { int pixelX, pixelY; wayX += _speedX; pixelX = wayX / 256; wayX -= pixelX * 256; wayY += _speedY; pixelY = wayY / 256; wayY -= pixelY * 256; move(x()+pixelX, y()+pixelY); return; } virtual void act(unsigned long pad) { moveSpeed(); return; } protected: private: int _speedX, _speedY; int wayX, wayY; }; // ------------------------------------------------------------------- class PersonSprite : public ActiveSprite { public: PersonSprite(Image *image, int w, int h, int u = 0, int v = 0) : ActiveSprite(image, w, h, u, v), health(1024), left(false), right(false), top(false), bottom(true), dead(false), dying(false) {} virtual ~PersonSprite() {} virtual void hit(int force) { health -= force; if (health <= 0) dying = true; } virtual void contact(bool left, bool right, bool top, bool bottom); virtual bool isDying() const { return dead; } virtual bool isDead() const { return dead; } protected: int health; bool left, right, top, bottom; bool dying, dead; private: }; // ------------------------------------------------------------------- class ExitSprite : public Sprite { public: ExitSprite(Image *image); virtual void setLight(Light *light) { this->light = light; return; } virtual void draw(GsOT *ot); virtual void move(int x, int y); virtual void setReached() { reached = true; return; } protected: private: Light *light; int step, delta; bool reached; }; // ------------------------------------------------------------------- #endif