git repos / blockattack-game

blame: source/code/MenuSystem.cpp

normal view · raw

f3ef3495 sago007 2008-11-13 20:00 1
/*
c53e6443 sago007 2012-04-17 11:04 2
===========================================================================
c53e6443 sago007 2012-04-17 11:04 3
blockattack - Block Attack - Rise of the Blocks
c53e6443 sago007 2012-04-17 11:04 4
Copyright (C) 2005-2012 Poul Sander
c53e6443 sago007 2012-04-17 11:04 5
c53e6443 sago007 2012-04-17 11:04 6
This program is free software: you can redistribute it and/or modify
c53e6443 sago007 2012-04-17 11:04 7
it under the terms of the GNU General Public License as published by
c53e6443 sago007 2012-04-17 11:04 8
the Free Software Foundation, either version 2 of the License, or
c53e6443 sago007 2012-04-17 11:04 9
(at your option) any later version.
c53e6443 sago007 2012-04-17 11:04 10
c53e6443 sago007 2012-04-17 11:04 11
This program is distributed in the hope that it will be useful,
c53e6443 sago007 2012-04-17 11:04 12
but WITHOUT ANY WARRANTY; without even the implied warranty of
c53e6443 sago007 2012-04-17 11:04 13
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
c53e6443 sago007 2012-04-17 11:04 14
GNU General Public License for more details.
c53e6443 sago007 2012-04-17 11:04 15
c53e6443 sago007 2012-04-17 11:04 16
You should have received a copy of the GNU General Public License
c53e6443 sago007 2012-04-17 11:04 17
along with this program.  If not, see http://www.gnu.org/licenses/
c53e6443 sago007 2012-04-17 11:04 18
c53e6443 sago007 2012-04-17 11:04 19
Source information and contacts persons can be found at
a077dceb sago007 2016-03-19 19:19 20
http://www.blockattack.net
c53e6443 sago007 2012-04-17 11:04 21
===========================================================================
f3ef3495 sago007 2008-11-13 20:00 22
*/
f3ef3495 sago007 2008-11-13 20:00 23
b7590374 sago007 2011-05-19 16:15 24
f3ef3495 sago007 2008-11-13 20:00 25
#include "MenuSystem.h"
f3ef3495 sago007 2008-11-13 20:00 26
#include "common.h"
7d604e02 sago007 2015-11-29 18:39 27
#include "global.hpp"
a077dceb sago007 2016-03-19 19:19 28
#include "gamecontroller.h"
c0a3362c sago007 2016-10-07 20:23 29
#include "BlockGame.hpp"
f3ef3495 sago007 2008-11-13 20:00 30
20d77c6e sago007 2016-11-12 16:28 31
static int oldmousex = 0;
20d77c6e sago007 2016-11-12 16:28 32
static int oldmousey = 0;
f3ef3495 sago007 2008-11-13 20:00 33
96eb7a16 sago007 2016-04-29 17:01 34
using std::string;
96eb7a16 sago007 2016-04-29 17:01 35
using std::cerr;
96eb7a16 sago007 2016-04-29 17:01 36
using std::cout;
96eb7a16 sago007 2016-04-29 17:01 37
using std::vector;
33f4e975 sago007 2015-11-14 21:49 38
094b2dfe sago007 2016-06-12 10:50 39
const char* const menu_marked = "menu_marked";
094b2dfe sago007 2016-06-12 10:50 40
const char* const menu_unmarked = "menu_unmarked";
f3ef3495 sago007 2008-11-13 20:00 41
b283e0f7 sago007 2012-07-29 14:01 42
ButtonGfx standardButton;
f3ef3495 sago007 2008-11-13 20:00 43
094b2dfe sago007 2016-06-12 10:50 44
void ButtonGfx::setSurfaces() {
72383a9e sago007 2016-10-30 11:56 45
	this->xsize = globalData.spriteHolder->GetSprite(menu_marked).GetWidth();
72383a9e sago007 2016-10-30 11:56 46
	this->ysize = globalData.spriteHolder->GetSprite(menu_marked).GetHeight();
72383a9e sago007 2016-10-30 11:56 47
	if (globalData.verboseLevel) {
13476fc2 sago007 2016-09-28 18:34 48
		cout << "Surfaces set, size: " << this->xsize << " , " << this->ysize << "\n";
acd79baf sago007 2015-11-22 19:37 49
	}
f3ef3495 sago007 2008-11-13 20:00 50
}
f3ef3495 sago007 2008-11-13 20:00 51
d91e7363 sago007 2018-03-26 13:09 52
sago::SagoTextField* ButtonGfx::getLabel(const std::string& text) {
d91e7363 sago007 2018-03-26 13:09 53
	const auto& theLabel = labels.find(text);
d91e7363 sago007 2018-03-26 13:09 54
	if (theLabel != labels.end()) {
9f7a6344 sago007 2018-03-30 12:05 55
		return labels[text].get();
d91e7363 sago007 2018-03-26 13:09 56
	}
9f7a6344 sago007 2018-03-30 12:05 57
	std::shared_ptr<sago::SagoTextField> newField = std::make_shared<sago::SagoTextField>();
d91e7363 sago007 2018-03-26 13:09 58
	newField->SetHolder(&globalData.spriteHolder->GetDataHolder());
d91e7363 sago007 2018-03-26 13:09 59
	newField->SetFont("freeserif");
36bbe751 sago007 2018-03-26 17:27 60
	newField->SetFontSize(30);
d8fe60bd sago007 2018-04-02 16:15 61
	newField->SetOutline(1, {64,64,64,255});
0b8fb137 sago007 2018-03-31 19:53 62
	newField->SetText(text);
d91e7363 sago007 2018-03-26 13:09 63
	labels[text] = newField;
9f7a6344 sago007 2018-03-30 12:05 64
	return labels[text].get();
d91e7363 sago007 2018-03-26 13:09 65
}
d91e7363 sago007 2018-03-26 13:09 66
ecef5838 sago007 2015-11-24 20:01 67
Button::Button() {
c53e6443 sago007 2012-04-17 11:04 68
	label = "";
c53e6443 sago007 2012-04-17 11:04 69
	marked = false;
acd79baf sago007 2015-11-22 19:37 70
	action = nullptr;
67a32395 sago007 2012-04-19 18:40 71
	popOnRun = false;
f3ef3495 sago007 2008-11-13 20:00 72
}
f3ef3495 sago007 2008-11-13 20:00 73
ecef5838 sago007 2015-11-24 20:01 74
Button::~Button() {
f3ef3495 sago007 2008-11-13 20:00 75
}
f3ef3495 sago007 2008-11-13 20:00 76
ecef5838 sago007 2015-11-24 20:01 77
Button::Button(const Button& b) {
c53e6443 sago007 2012-04-17 11:04 78
	label = b.label;
c53e6443 sago007 2012-04-17 11:04 79
	marked = b.marked;
c53e6443 sago007 2012-04-17 11:04 80
	action = b.action;
67a32395 sago007 2012-04-19 18:40 81
	popOnRun = false;
f3ef3495 sago007 2008-11-13 20:00 82
}
f3ef3495 sago007 2008-11-13 20:00 83
ecef5838 sago007 2015-11-24 20:01 84
void Button::setLabel(const string& text) {
c53e6443 sago007 2012-04-17 11:04 85
	label = text;
f3ef3495 sago007 2008-11-13 20:00 86
}
f3ef3495 sago007 2008-11-13 20:00 87
29edda2d sago007 2016-10-08 18:06 88
void Button::setAction(void (*action2run)(void)) {
c53e6443 sago007 2012-04-17 11:04 89
	action = action2run;
f3ef3495 sago007 2008-11-13 20:00 90
}
f3ef3495 sago007 2008-11-13 20:00 91
ecef5838 sago007 2015-11-24 20:01 92
void Button::doAction() {
6258a442 sago007 2015-11-14 22:11 93
	if (action) {
29edda2d sago007 2016-10-08 18:06 94
		action();
6258a442 sago007 2015-11-14 22:11 95
		return;
6258a442 sago007 2015-11-14 22:11 96
	}
6258a442 sago007 2015-11-14 22:11 97
	cerr << "Warning: button \"" << label << "\" has no action assigned!";
f3ef3495 sago007 2008-11-13 20:00 98
}
f3ef3495 sago007 2008-11-13 20:00 99
ecef5838 sago007 2015-11-24 20:01 100
void Button::setPopOnRun(bool popOnRun) {
67a32395 sago007 2012-04-19 18:40 101
	this->popOnRun = popOnRun;
67a32395 sago007 2012-04-19 18:40 102
}
67a32395 sago007 2012-04-19 18:40 103
ecef5838 sago007 2015-11-24 20:01 104
bool Button::isPopOnRun() const {
67a32395 sago007 2012-04-19 18:40 105
	return popOnRun;
67a32395 sago007 2012-04-19 18:40 106
}
67a32395 sago007 2012-04-19 18:40 107
092bdebe sago007 2017-03-19 14:39 108
static void drawToScreen(const Button& b) {
c0a3362c sago007 2016-10-07 20:23 109
	if (b.marked) {
72383a9e sago007 2016-10-30 11:56 110
		globalData.spriteHolder->GetSprite(menu_marked).Draw(globalData.screen, SDL_GetTicks(), b.x, b.y);
c0a3362c sago007 2016-10-07 20:23 111
	}
c0a3362c sago007 2016-10-07 20:23 112
	else {
72383a9e sago007 2016-10-30 11:56 113
		globalData.spriteHolder->GetSprite(menu_unmarked).Draw(globalData.screen, SDL_GetTicks(), b.x, b.y);
c0a3362c sago007 2016-10-07 20:23 114
	}
092bdebe sago007 2017-03-19 14:39 115
d2ba3cf5 sago007 2018-05-13 15:00 116
	standardButton.getLabel(b.label)->Draw(globalData.screen, b.x+standardButton.xsize/2,b.y+standardButton.ysize/2,
d2ba3cf5 sago007 2018-05-13 15:00 117
	                                       sago::SagoTextField::Alignment::center, sago::SagoTextField::VerticalAlignment::center);
d91e7363 sago007 2018-03-26 13:09 118
	//standardButton.thefont->drawCenterAlsoHeight(globalData.screen, b.x+standardButton.xsize/2,b.y+standardButton.ysize/2, b.label);
1b710a1e sago007 2016-09-28 19:01 119
}
1b710a1e sago007 2016-09-28 19:01 120
7b384c3f sago007 2016-10-08 17:34 121
092bdebe sago007 2017-03-19 14:39 122
static bool isClicked(const Button& b, int x,int y) {
7b384c3f sago007 2016-10-08 17:34 123
	if ( x >= b.x && y >= b.y && x<= b.x+standardButton.xsize && y <= b.y + standardButton.ysize) {
7b384c3f sago007 2016-10-08 17:34 124
		return true;
7b384c3f sago007 2016-10-08 17:34 125
	}
7b384c3f sago007 2016-10-08 17:34 126
	return false;
7b384c3f sago007 2016-10-08 17:34 127
}
7b384c3f sago007 2016-10-08 17:34 128
95ab6b0d sago007 2016-11-12 16:11 129
void Menu::drawSelf(SDL_Renderer* target) {
95ab6b0d sago007 2016-11-12 16:11 130
	DrawBackground(target);
a1e83d35 sago007 2016-10-08 17:29 131
	for (const Button* b : buttons) {
a1e83d35 sago007 2016-10-08 17:29 132
		drawToScreen(*b);
6258a442 sago007 2015-11-14 22:11 133
	}
c0a3362c sago007 2016-10-07 20:23 134
	drawToScreen(exit);
e554e0a8 sago007 2018-03-26 20:57 135
	standardButton.getLabel(title)->Draw(target, 50, 50);
f3ef3495 sago007 2008-11-13 20:00 136
}
f3ef3495 sago007 2008-11-13 20:00 137
f3ef3495 sago007 2008-11-13 20:00 138
ecef5838 sago007 2015-11-24 20:01 139
void Menu::placeButtons() {
c53e6443 sago007 2012-04-17 11:04 140
	int nextY = 100;
1b710a1e sago007 2016-09-28 19:01 141
	int X = 50;
1b710a1e sago007 2016-09-28 19:01 142
	for (Button* it : buttons) {
72383a9e sago007 2016-10-30 11:56 143
		X = (globalData.xsize - standardButton.xsize)/2;
1b710a1e sago007 2016-09-28 19:01 144
		it->x = X;
1b710a1e sago007 2016-09-28 19:01 145
		it->y = nextY;
18c5059e sago007 2016-10-08 17:41 146
		nextY += standardButton.ysize+10;
c53e6443 sago007 2012-04-17 11:04 147
	}
c53e6443 sago007 2012-04-17 11:04 148
	exit.x = X;
c53e6443 sago007 2012-04-17 11:04 149
	exit.y = nextY;
f3ef3495 sago007 2008-11-13 20:00 150
}
f3ef3495 sago007 2008-11-13 20:00 151
ecef5838 sago007 2015-11-24 20:01 152
void Menu::addButton(Button* b) {
c53e6443 sago007 2012-04-17 11:04 153
	buttons.push_back(b);
c53e6443 sago007 2012-04-17 11:04 154
	b->marked = false;
c53e6443 sago007 2012-04-17 11:04 155
	placeButtons();
f3ef3495 sago007 2008-11-13 20:00 156
}
f3ef3495 sago007 2008-11-13 20:00 157
1d2e2129 sago007 2015-12-23 15:41 158
Menu::Menu(SDL_Renderer* screen) {
0c1de203 sago007 2015-12-05 22:15 159
	this->screen = screen;
c53e6443 sago007 2012-04-17 11:04 160
	buttons = vector<Button*>(10);
c53e6443 sago007 2012-04-17 11:04 161
	isSubmenu = true;
c53e6443 sago007 2012-04-17 11:04 162
	exit.setLabel( _("Back") );
f3ef3495 sago007 2008-11-13 20:00 163
}
f3ef3495 sago007 2008-11-13 20:00 164
1d2e2129 sago007 2015-12-23 15:41 165
Menu::Menu(SDL_Renderer* screen,bool submenu) {
0c1de203 sago007 2015-12-05 22:15 166
	this->screen = screen;
c53e6443 sago007 2012-04-17 11:04 167
	buttons = vector<Button*>(0);
c53e6443 sago007 2012-04-17 11:04 168
	isSubmenu = submenu;
ecef5838 sago007 2015-11-24 20:01 169
	if (isSubmenu) {
c53e6443 sago007 2012-04-17 11:04 170
		exit.setLabel( _("Back") );
acd79baf sago007 2015-11-22 19:37 171
	}
acd79baf sago007 2015-11-22 19:37 172
	else {
c53e6443 sago007 2012-04-17 11:04 173
		exit.setLabel( _("Exit") );
acd79baf sago007 2015-11-22 19:37 174
	}
f3ef3495 sago007 2008-11-13 20:00 175
}
f3ef3495 sago007 2008-11-13 20:00 176
1d2e2129 sago007 2015-12-23 15:41 177
Menu::Menu(SDL_Renderer* screen, const string& title, bool submenu) {
0c1de203 sago007 2015-12-05 22:15 178
	this->screen = screen;
c53e6443 sago007 2012-04-17 11:04 179
	buttons = vector<Button*>(0);
c53e6443 sago007 2012-04-17 11:04 180
	isSubmenu = submenu;
c53e6443 sago007 2012-04-17 11:04 181
	this->title = title;
ecef5838 sago007 2015-11-24 20:01 182
	if (isSubmenu) {
c53e6443 sago007 2012-04-17 11:04 183
		exit.setLabel(_("Back") );
acd79baf sago007 2015-11-22 19:37 184
	}
acd79baf sago007 2015-11-22 19:37 185
	else {
c53e6443 sago007 2012-04-17 11:04 186
		exit.setLabel(_("Exit") );
acd79baf sago007 2015-11-22 19:37 187
	}
cc3ef158 sago007 2011-07-03 16:13 188
}
cc3ef158 sago007 2011-07-03 16:13 189
826cf176 sago007 2016-03-12 10:53 190
bool isUpEvent(const SDL_Event& event) {
826cf176 sago007 2016-03-12 10:53 191
	if ( event.type == SDL_KEYDOWN ) {
826cf176 sago007 2016-03-12 10:53 192
		if (event.key.keysym.sym == SDLK_UP) {
826cf176 sago007 2016-03-12 10:53 193
			return true;
826cf176 sago007 2016-03-12 10:53 194
		}
826cf176 sago007 2016-03-12 10:53 195
	}
826cf176 sago007 2016-03-12 10:53 196
	if (event.type == SDL_CONTROLLERBUTTONDOWN) {
d21782d4 sago007 2016-03-13 11:17 197
		if (event.cbutton.button == SDL_CONTROLLER_BUTTON_DPAD_UP ) {
826cf176 sago007 2016-03-12 10:53 198
			return true;
826cf176 sago007 2016-03-12 10:53 199
		}
826cf176 sago007 2016-03-12 10:53 200
	}
a077dceb sago007 2016-03-19 19:19 201
	if (event.type == SDL_CONTROLLERAXISMOTION  && event.caxis.axis == SDL_CONTROLLER_AXIS_LEFTY ) {
a077dceb sago007 2016-03-19 19:19 202
		checkDeadZone(event);
a35ab74b sago007 2016-04-02 10:26 203
		const SDL_ControllerAxisEvent& a = event.caxis;
a077dceb sago007 2016-03-19 19:19 204
		if (getDeadZone(a.which, a.axis)) {
a077dceb sago007 2016-03-19 19:19 205
			if (event.caxis.value < -deadZoneLimit) {
a077dceb sago007 2016-03-19 19:19 206
				setDeadZone(a.which,a.axis,false);
a077dceb sago007 2016-03-19 19:19 207
				return true;
a077dceb sago007 2016-03-19 19:19 208
			}
a077dceb sago007 2016-03-19 19:19 209
		}
a077dceb sago007 2016-03-19 19:19 210
	}
826cf176 sago007 2016-03-12 10:53 211
	return false;
826cf176 sago007 2016-03-12 10:53 212
}
826cf176 sago007 2016-03-12 10:53 213
d5efd7d1 sago007 2016-03-12 11:32 214
bool isDownEvent(const SDL_Event& event) {
d5efd7d1 sago007 2016-03-12 11:32 215
	if ( event.type == SDL_KEYDOWN ) {
d5efd7d1 sago007 2016-03-12 11:32 216
		if (event.key.keysym.sym == SDLK_DOWN) {
d5efd7d1 sago007 2016-03-12 11:32 217
			return true;
d5efd7d1 sago007 2016-03-12 11:32 218
		}
d5efd7d1 sago007 2016-03-12 11:32 219
	}
d5efd7d1 sago007 2016-03-12 11:32 220
	if (event.type == SDL_CONTROLLERBUTTONDOWN) {
d21782d4 sago007 2016-03-13 11:17 221
		if (event.cbutton.button == SDL_CONTROLLER_BUTTON_DPAD_DOWN ) {
d21782d4 sago007 2016-03-13 11:17 222
			return true;
d21782d4 sago007 2016-03-13 11:17 223
		}
d21782d4 sago007 2016-03-13 11:17 224
	}
a077dceb sago007 2016-03-19 19:19 225
	if (event.type == SDL_CONTROLLERAXISMOTION  && event.caxis.axis == SDL_CONTROLLER_AXIS_LEFTY ) {
a077dceb sago007 2016-03-19 19:19 226
		checkDeadZone(event);
a35ab74b sago007 2016-04-02 10:26 227
		const SDL_ControllerAxisEvent& a = event.caxis;
a077dceb sago007 2016-03-19 19:19 228
		if (getDeadZone(a.which, a.axis)) {
a077dceb sago007 2016-03-19 19:19 229
			if (event.caxis.value > deadZoneLimit) {
a077dceb sago007 2016-03-19 19:19 230
				setDeadZone(a.which,a.axis,false);
a077dceb sago007 2016-03-19 19:19 231
				return true;
a077dceb sago007 2016-03-19 19:19 232
			}
a077dceb sago007 2016-03-19 19:19 233
		}
a077dceb sago007 2016-03-19 19:19 234
	}
d21782d4 sago007 2016-03-13 11:17 235
	return false;
d21782d4 sago007 2016-03-13 11:17 236
}
d21782d4 sago007 2016-03-13 11:17 237
d21782d4 sago007 2016-03-13 11:17 238
bool isLeftEvent(const SDL_Event& event) {
d21782d4 sago007 2016-03-13 11:17 239
	if ( event.type == SDL_KEYDOWN ) {
d21782d4 sago007 2016-03-13 11:17 240
		if (event.key.keysym.sym == SDLK_LEFT) {
d21782d4 sago007 2016-03-13 11:17 241
			return true;
d21782d4 sago007 2016-03-13 11:17 242
		}
d21782d4 sago007 2016-03-13 11:17 243
	}
d21782d4 sago007 2016-03-13 11:17 244
	if (event.type == SDL_CONTROLLERBUTTONDOWN) {
d21782d4 sago007 2016-03-13 11:17 245
		if (event.cbutton.button == SDL_CONTROLLER_BUTTON_DPAD_LEFT ) {
d21782d4 sago007 2016-03-13 11:17 246
			return true;
d21782d4 sago007 2016-03-13 11:17 247
		}
d21782d4 sago007 2016-03-13 11:17 248
	}
a077dceb sago007 2016-03-19 19:19 249
	if (event.type == SDL_CONTROLLERAXISMOTION  && event.caxis.axis == SDL_CONTROLLER_AXIS_LEFTX ) {
a077dceb sago007 2016-03-19 19:19 250
		checkDeadZone(event);
a35ab74b sago007 2016-04-02 10:26 251
		const SDL_ControllerAxisEvent& a = event.caxis;
a077dceb sago007 2016-03-19 19:19 252
		if (getDeadZone(a.which, a.axis)) {
a077dceb sago007 2016-03-19 19:19 253
			if (event.caxis.value < -deadZoneLimit) {
a077dceb sago007 2016-03-19 19:19 254
				setDeadZone(a.which,a.axis,false);
a077dceb sago007 2016-03-19 19:19 255
				return true;
a077dceb sago007 2016-03-19 19:19 256
			}
a077dceb sago007 2016-03-19 19:19 257
		}
a077dceb sago007 2016-03-19 19:19 258
	}
d21782d4 sago007 2016-03-13 11:17 259
	return false;
d21782d4 sago007 2016-03-13 11:17 260
}
d21782d4 sago007 2016-03-13 11:17 261
d21782d4 sago007 2016-03-13 11:17 262
bool isRightEvent(const SDL_Event& event) {
d21782d4 sago007 2016-03-13 11:17 263
	if ( event.type == SDL_KEYDOWN ) {
877b7c65 sago007 2016-04-09 09:32 264
		if (event.key.keysym.sym == SDLK_RIGHT) {
d21782d4 sago007 2016-03-13 11:17 265
			return true;
d21782d4 sago007 2016-03-13 11:17 266
		}
d21782d4 sago007 2016-03-13 11:17 267
	}
d21782d4 sago007 2016-03-13 11:17 268
	if (event.type == SDL_CONTROLLERBUTTONDOWN) {
d21782d4 sago007 2016-03-13 11:17 269
		if (event.cbutton.button == SDL_CONTROLLER_BUTTON_DPAD_RIGHT ) {
d5efd7d1 sago007 2016-03-12 11:32 270
			return true;
d5efd7d1 sago007 2016-03-12 11:32 271
		}
d5efd7d1 sago007 2016-03-12 11:32 272
	}
a077dceb sago007 2016-03-19 19:19 273
	if (event.type == SDL_CONTROLLERAXISMOTION  && event.caxis.axis == SDL_CONTROLLER_AXIS_LEFTX ) {
a077dceb sago007 2016-03-19 19:19 274
		checkDeadZone(event);
a35ab74b sago007 2016-04-02 10:26 275
		const SDL_ControllerAxisEvent& a = event.caxis;
a077dceb sago007 2016-03-19 19:19 276
		if (getDeadZone(a.which, a.axis)) {
a077dceb sago007 2016-03-19 19:19 277
			if (event.caxis.value > deadZoneLimit) {
a077dceb sago007 2016-03-19 19:19 278
				setDeadZone(a.which,a.axis,false);
a077dceb sago007 2016-03-19 19:19 279
				return true;
a077dceb sago007 2016-03-19 19:19 280
			}
a077dceb sago007 2016-03-19 19:19 281
		}
a077dceb sago007 2016-03-19 19:19 282
	}
d5efd7d1 sago007 2016-03-12 11:32 283
	return false;
d5efd7d1 sago007 2016-03-12 11:32 284
}
d5efd7d1 sago007 2016-03-12 11:32 285
d5efd7d1 sago007 2016-03-12 11:32 286
bool isEscapeEvent(const SDL_Event& event) {
d5efd7d1 sago007 2016-03-12 11:32 287
	if ( event.type == SDL_KEYDOWN ) {
d5efd7d1 sago007 2016-03-12 11:32 288
		if ( event.key.keysym.sym == SDLK_ESCAPE ) {
d5efd7d1 sago007 2016-03-12 11:32 289
			return true;
d5efd7d1 sago007 2016-03-12 11:32 290
		}
d5efd7d1 sago007 2016-03-12 11:32 291
	}
d5efd7d1 sago007 2016-03-12 11:32 292
	if (event.type == SDL_CONTROLLERBUTTONDOWN) {
d5efd7d1 sago007 2016-03-12 11:32 293
		if (event.cbutton.button == SDL_CONTROLLER_BUTTON_Y ) {
d5efd7d1 sago007 2016-03-12 11:32 294
			return true;
d5efd7d1 sago007 2016-03-12 11:32 295
		}
d5efd7d1 sago007 2016-03-12 11:32 296
	}
d5efd7d1 sago007 2016-03-12 11:32 297
	return false;
d5efd7d1 sago007 2016-03-12 11:32 298
}
d5efd7d1 sago007 2016-03-12 11:32 299
d5efd7d1 sago007 2016-03-12 11:32 300
bool isConfirmEvent(const SDL_Event& event) {
d5efd7d1 sago007 2016-03-12 11:32 301
	if ( event.type == SDL_KEYDOWN ) {
d5efd7d1 sago007 2016-03-12 11:32 302
		if (event.key.keysym.sym == SDLK_RETURN || event.key.keysym.sym == SDLK_KP_ENTER ) {
d5efd7d1 sago007 2016-03-12 11:32 303
			return true;
d5efd7d1 sago007 2016-03-12 11:32 304
		}
d5efd7d1 sago007 2016-03-12 11:32 305
	}
d5efd7d1 sago007 2016-03-12 11:32 306
	if (event.type == SDL_CONTROLLERBUTTONDOWN) {
d5efd7d1 sago007 2016-03-12 11:32 307
		if (event.cbutton.button == SDL_CONTROLLER_BUTTON_A || event.cbutton.button == SDL_CONTROLLER_BUTTON_B ) {
d5efd7d1 sago007 2016-03-12 11:32 308
			return true;
d5efd7d1 sago007 2016-03-12 11:32 309
		}
d5efd7d1 sago007 2016-03-12 11:32 310
	}
d5efd7d1 sago007 2016-03-12 11:32 311
	return false;
d5efd7d1 sago007 2016-03-12 11:32 312
}
d5efd7d1 sago007 2016-03-12 11:32 313
00e866da sago007 2016-10-31 20:47 314
00e866da sago007 2016-10-31 20:47 315
bool Menu::IsActive() {
00e866da sago007 2016-10-31 20:47 316
	return running;
00e866da sago007 2016-10-31 20:47 317
}
00e866da sago007 2016-10-31 20:47 318
void Menu::Draw(SDL_Renderer* target) {
00e866da sago007 2016-10-31 20:47 319
	placeButtons();
95ab6b0d sago007 2016-11-12 16:11 320
	drawSelf(target);
a44568bd sago007 2018-03-26 11:13 321
#if DEBUG
a44568bd sago007 2018-03-26 11:13 322
	static unsigned long int Frames;
a44568bd sago007 2018-03-26 11:13 323
	static unsigned long int Ticks;
a44568bd sago007 2018-03-26 11:13 324
	static char FPS[10];
e7e189c7 sago007 2018-03-31 15:30 325
	static sago::SagoTextField fpsField;
e7e189c7 sago007 2018-03-31 15:30 326
	sagoTextSetBlueFont(fpsField);
a44568bd sago007 2018-03-26 11:13 327
	Frames++;
a44568bd sago007 2018-03-26 11:13 328
	if (SDL_GetTicks() >= Ticks + 1000) {
a44568bd sago007 2018-03-26 11:13 329
		if (Frames > 999) {
a44568bd sago007 2018-03-26 11:13 330
			Frames=999;
a44568bd sago007 2018-03-26 11:13 331
		}
a44568bd sago007 2018-03-26 11:13 332
		snprintf(FPS, sizeof(FPS), "%lu fps", Frames);
a44568bd sago007 2018-03-26 11:13 333
		Frames = 0;
a44568bd sago007 2018-03-26 11:13 334
		Ticks = SDL_GetTicks();
a44568bd sago007 2018-03-26 11:13 335
	}
e7e189c7 sago007 2018-03-31 15:30 336
	fpsField.SetText(FPS);
e7e189c7 sago007 2018-03-31 15:30 337
	fpsField.Draw(globalData.screen, 800, 4);
a44568bd sago007 2018-03-26 11:13 338
#endif
00e866da sago007 2016-10-31 20:47 339
}
092bdebe sago007 2017-03-19 14:39 340
void Menu::ProcessInput(const SDL_Event& event, bool& processed) {
00e866da sago007 2016-10-31 20:47 341
	if (isUpEvent(event)) {
00e866da sago007 2016-10-31 20:47 342
		marked--;
00e866da sago007 2016-10-31 20:47 343
		if (marked<0) {
00e866da sago007 2016-10-31 20:47 344
			marked = buttons.size();    //not -1, since exit is after the last element in the list
00e866da sago007 2016-10-31 20:47 345
		}
c79aae93 sago007 2016-12-23 16:55 346
		processed = true;
00e866da sago007 2016-10-31 20:47 347
	}
00e866da sago007 2016-10-31 20:47 348
00e866da sago007 2016-10-31 20:47 349
	if (isDownEvent(event)) {
00e866da sago007 2016-10-31 20:47 350
		marked++;
00e866da sago007 2016-10-31 20:47 351
		if (marked> (int)buttons.size()) {
00e866da sago007 2016-10-31 20:47 352
			marked = 0;
00e866da sago007 2016-10-31 20:47 353
		}
c79aae93 sago007 2016-12-23 16:55 354
		processed = true;
00e866da sago007 2016-10-31 20:47 355
	}
00e866da sago007 2016-10-31 20:47 356
00e866da sago007 2016-10-31 20:47 357
	if (isEscapeEvent(event) && isSubmenu) {
00e866da sago007 2016-10-31 20:47 358
		running = false;
c79aae93 sago007 2016-12-23 16:55 359
		processed = true;
00e866da sago007 2016-10-31 20:47 360
	}
00e866da sago007 2016-10-31 20:47 361
00e866da sago007 2016-10-31 20:47 362
	if (isConfirmEvent(event)) {
00e866da sago007 2016-10-31 20:47 363
		if (marked < (int)buttons.size()) {
00e866da sago007 2016-10-31 20:47 364
			buttons.at(marked)->doAction();
00e866da sago007 2016-10-31 20:47 365
			if (buttons.at(marked)->isPopOnRun()) {
00e866da sago007 2016-10-31 20:47 366
				running = false;
00e866da sago007 2016-10-31 20:47 367
			}
00e866da sago007 2016-10-31 20:47 368
		}
00e866da sago007 2016-10-31 20:47 369
		if (marked == (int)buttons.size()) {
00e866da sago007 2016-10-31 20:47 370
			running = false;
00e866da sago007 2016-10-31 20:47 371
		}
c79aae93 sago007 2016-12-23 16:55 372
		processed = true;
00e866da sago007 2016-10-31 20:47 373
	}
00e866da sago007 2016-10-31 20:47 374
}
00e866da sago007 2016-10-31 20:47 375
50fd2c5f sago007 2016-11-12 16:05 376
void Menu::Update() {
50fd2c5f sago007 2016-11-12 16:05 377
	for (int i=0; i<(int)buttons.size(); i++) {
50fd2c5f sago007 2016-11-12 16:05 378
		buttons.at(i)->marked = (i == marked);
50fd2c5f sago007 2016-11-12 16:05 379
	}
50fd2c5f sago007 2016-11-12 16:05 380
	exit.marked = (marked == (int)buttons.size());
50fd2c5f sago007 2016-11-12 16:05 381
	Uint8 buttonState = SDL_GetMouseState(nullptr,nullptr);
50fd2c5f sago007 2016-11-12 16:05 382
	// If the mouse button is released, make bMouseUp equal true
50fd2c5f sago007 2016-11-12 16:05 383
	if ( (buttonState&SDL_BUTTON(1))==0) {
50fd2c5f sago007 2016-11-12 16:05 384
		bMouseUp=true;
50fd2c5f sago007 2016-11-12 16:05 385
	}
c7f2082f sago007 2016-03-13 11:48 386
20d77c6e sago007 2016-11-12 16:28 387
	if (abs(globalData.mousex-oldmousex)>5 || abs(globalData.mousey-oldmousey)>5) {
50fd2c5f sago007 2016-11-12 16:05 388
		for (int i=0; i< (int)buttons.size(); ++i) {
20d77c6e sago007 2016-11-12 16:28 389
			if (isClicked(*buttons.at(i), globalData.mousex, globalData.mousey)) {
50fd2c5f sago007 2016-11-12 16:05 390
				marked = i;
d5efd7d1 sago007 2016-03-12 11:32 391
			}
50fd2c5f sago007 2016-11-12 16:05 392
		}
20d77c6e sago007 2016-11-12 16:28 393
		if (isClicked(exit, globalData.mousex, globalData.mousey)) {
50fd2c5f sago007 2016-11-12 16:05 394
			marked = buttons.size();
50fd2c5f sago007 2016-11-12 16:05 395
		}
20d77c6e sago007 2016-11-12 16:28 396
		oldmousex = globalData.mousex;
20d77c6e sago007 2016-11-12 16:28 397
		oldmousey = globalData.mousey;
50fd2c5f sago007 2016-11-12 16:05 398
	}
c7f2082f sago007 2016-03-13 11:48 399
50fd2c5f sago007 2016-11-12 16:05 400
	//mouse clicked
50fd2c5f sago007 2016-11-12 16:05 401
	if ( (buttonState&SDL_BUTTON(1) )==SDL_BUTTON(1) && bMouseUp) {
50fd2c5f sago007 2016-11-12 16:05 402
		bMouseUp = false;
50fd2c5f sago007 2016-11-12 16:05 403
		for (int i=0; i< (int)buttons.size(); ++i) {
20d77c6e sago007 2016-11-12 16:28 404
			if (isClicked(*buttons.at(i), globalData.mousex, globalData.mousey)) {
50fd2c5f sago007 2016-11-12 16:05 405
				buttons.at(i)->doAction();
50fd2c5f sago007 2016-11-12 16:05 406
				if (buttons.at(i)->isPopOnRun()) {
d5efd7d1 sago007 2016-03-12 11:32 407
					running = false;
d5efd7d1 sago007 2016-03-12 11:32 408
				}
4dbeef9f sago007 2018-04-14 10:48 409
				//Quit here to ensure that we do not continue checking buttons after we have done the action.
4dbeef9f sago007 2018-04-14 10:48 410
				return;
826cf176 sago007 2016-03-12 10:53 411
			}
c53e6443 sago007 2012-04-17 11:04 412
		}
20d77c6e sago007 2016-11-12 16:28 413
		if (isClicked(exit,  globalData.mousex, globalData.mousey)) {
50fd2c5f sago007 2016-11-12 16:05 414
			running = false;
c53e6443 sago007 2012-04-17 11:04 415
		}
50fd2c5f sago007 2016-11-12 16:05 416
	}
50fd2c5f sago007 2016-11-12 16:05 417
}
c53e6443 sago007 2012-04-17 11:04 418
1970-01-01 00:00 419