1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef ASYLUM_SYSTEM_CURSOR_H
#define ASYLUM_SYSTEM_CURSOR_H
#include "common/events.h"
#include "common/rect.h"
#include "asylum/shared.h"
namespace Asylum {
class AsylumEngine;
class GraphicResource;
enum CursorAnimation {
kCursorAnimationNone = 0,
kCursorAnimationLinear = 1,
kCursorAnimationMirror = 2
};
/**
* Asylum cursors are GraphicResources, and are stored in
* ResourcePacks, as are all game assets.
*/
class Cursor {
public:
Cursor(AsylumEngine *engine);
virtual ~Cursor();
/**
* Show the current cursor
*/
void show() const;
/**
* Hide the current cursor
*/
void hide() const;
/**
* Query if the cursor is hidden.
*
* @return true if hidden, false if not.
*/
bool isHidden() const;
/**
* Set the current cursor instance to the graphic resource provide. The frames parameter defaults to -1, which in this case means that the frame count
* should be derived from the graphic resource as opposed to being explicitly set.
*
* @param resourceId Identifier for the resource.
* @param cnt The counter.
* @param anim The animation type
* @param frames The frames.
*/
void set(ResourceId resourceId, int32 cnt = 0, CursorAnimation anim = kCursorAnimationMirror, int32 frames = -1);
/**
* Get the next logical frame from the currently loaded
* cursorResource and draw it
*/
void animate();
// Accessors
void setForceHide(bool state) { _forceHide = state; }
ResourceId getResourceId() { return _graphicResourceId; }
CursorAnimation getAnimation() { return _animation; }
/**
* Return the cursor's position on the screen
*/
const Common::Point position() const;
private:
AsylumEngine *_vm;
// Cursor resource
GraphicResource *_cursorRes;
/** the point on the screen the cursor is at */
Common::Point _pos;
/** the point of the cursor that triggers click hits */
Common::Point _hotspot;
// The number of milliseconds between cursor gfx updates
uint32 _nextTick;
int32 _frameStep;
// NOTE: The original engine contains a function that assigns global variables to a
// struct associated with cursor graphics info. Since this functionality only
// ever seems to be used to reference cursor info, the struct members
// may as well be class members in order to simplify the logic a bit
ResourceId _graphicResourceId;
uint32 _currentFrame;
uint32 _lastFrameIndex;
int32 _counter;
CursorAnimation _animation;
/**
* Since the cursor is updated by various event handlers, if an action is
* currently being processed that requires the cursor to remain hidden, another
* event may override that request and show the cursor regardless
*
* This is currently used during the intro speech in Scene 1 after the intro
* video plays
*
* @default false
*/
bool _forceHide;
/**
* Updates the cursor
*/
void update();
/**
* Updates the cursor current frame.
*/
void updateFrame();
/**
* Gets the hotspot for a specific frame.
*
* @param frameIndex Zero-based index of the frame.
*
* @return The hotspot.
*/
Common::Point getHotspot(uint32 frameIndex);
};
} // end of namespace Asylum
#endif // ASYLUM_SYSTEM_CURSOR_H
|