File: cursor.h

package info (click to toggle)
scummvm 2.9.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 450,268 kB
  • sloc: cpp: 4,297,604; asm: 28,322; python: 12,901; sh: 11,219; java: 8,477; xml: 7,843; perl: 2,633; ansic: 2,465; yacc: 1,670; javascript: 1,020; makefile: 933; lex: 578; awk: 275; objc: 82; sed: 11; php: 1
file content (155 lines) | stat: -rw-r--r-- 4,049 bytes parent folder | download | duplicates (2)
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