comparison lamertetris/sources/game.C @ 0:2787f5e749ae

INIT
author prymula <prymula76@outlook.com>
date Thu, 21 Sep 2023 22:33:57 +0200
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:2787f5e749ae
1 /*
2 * LamerTetris 2
3 * author: prymula
4 * date: 10-VI-2023
5 * licence: Public Domain
6 * tool: Geany
7 * Program based on:
8 * -This source code copyrighted by Lazy Foo' Productions (2004-2020)
9 * and may not be redistributed without written permission.
10 * -Andrew Lim Chong Liang https://github.com/andrew-lim/sdl2-boilerplate
11 */
12
13
14 #include "game.h"
15
16 Game::Game()
17 :running(0), window(NULL), renderer(NULL) {
18 screenSurface = SDL_CreateRGBSurface(0,400,600,32,0,0,0,0);
19 }
20
21 Game::~Game() {
22 //delete actual_ball;
23 //delete octagon;
24 this->stop();
25 }
26
27 void Game::start() {
28
29 if (SDL_Init(SDL_INIT_EVERYTHING)) {
30 return ;
31 }
32 // Ten sposób tworzenia okna i renderu gwarantuje że duszki nie będą przerywać
33 window = SDL_CreateWindow( "Lamer Tetris", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, DISPLAY_WIDTH, DISPLAY_HEIGHT, SDL_WINDOW_SHOWN );
34 if( window == NULL )
35 {
36 printf( "Window could not be created! SDL Error: %s\n", SDL_GetError() );
37 return;
38 }
39 renderer = SDL_CreateRenderer( window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC );
40 if( renderer == NULL )
41 {
42 printf( "Renderer could not be created! SDL Error: %s\n", SDL_GetError() );
43 return;
44 }
45 if(TTF_Init()==-1) {
46 printf("TTF_Init: %s\n", TTF_GetError());
47 return;
48 }
49
50 if( !loadWallpaper()){
51 printf( "Failed to load media!\n" );
52 exit(1);
53 }
54
55 if(hiscore.file_exist())
56 hi_score = hiscore.load_hiscore();
57 else hi_score = 0;
58
59 this->running = 1 ;
60 }
61
62 void Game::draw(SDL_Rect *srcField, SDL_Rect *positionField, bool end) {
63
64 SDL_Rect destrect; //, srcrect;
65 SDL_Surface * scoreSurface;
66
67 //destrect = set_rect(0, 0, background->w, background->h);
68 //srcrect = set_rect(0, 0, background->w, background->h);
69 SDL_BlitSurface(background, NULL, screenSurface, NULL);
70
71 // dla elementu wysuwanego
72 if(srcField->y>0 && !end){
73 SDL_BlitSurface( field.get(figure,n_element), srcField, screenSurface, positionField );
74 } else // dla elementu wysunietego
75 SDL_BlitSurface( field.get(figure,n_element), srcField, screenSurface, positionField );
76
77
78 szlam.draw();
79 SDL_BlitSurface( szlam.get(), NULL, screenSurface, NULL );
80
81 // punkty na tapete
82 scoreSurface = scoreTxt.loadFromRenderedText(std::to_string(score) ,{0xff, 0xff, 0xff}, fontScore);
83 destrect = set_rect(10, 3, background->w, background->h);
84 SDL_BlitSurface( scoreSurface, NULL, screenSurface, &destrect );
85 SDL_FreeSurface( scoreSurface );
86
87 // najlepszy wynik na tapete
88 scoreSurface = scoreTxt.loadFromRenderedText(std::to_string(hi_score) ,{0xe1, 0x06, 0x40}, fontScore);
89 destrect = set_rect(300, 3, background->w, background->h);
90 SDL_BlitSurface( scoreSurface, NULL, screenSurface, &destrect );
91 SDL_FreeSurface( scoreSurface );
92
93
94
95 texture = SDL_CreateTextureFromSurface( renderer, screenSurface);
96 if( texture == NULL )
97 {
98 printf( "Unable to create texture ! SDL Error: %s\n", SDL_GetError() );
99 exit(1);
100 }
101 destrect = set_rect(0, 0, background->w, background->h);
102 SDL_RenderCopy(renderer, texture, NULL, &destrect);
103
104 SDL_RenderPresent(renderer);
105 SDL_DestroyTexture(texture);
106
107 }
108
109 void Game::stop() {
110 if (NULL != renderer) {
111 SDL_DestroyRenderer(renderer);
112 renderer = NULL;
113 }
114 if (NULL != window) {
115 SDL_DestroyWindow(window);
116 window = NULL;
117 }
118 SDL_Quit() ;
119 }
120
121 void Game::fillRect(SDL_Rect* rc, int r, int g, int b ) {
122 SDL_SetRenderDrawColor(renderer, r, g, b, SDL_ALPHA_OPAQUE);
123 SDL_RenderFillRect(renderer, rc);
124 }
125
126 void Game::fpsChanged( int fps ) {
127 char szFps[ 128 ] ;
128 sprintf( szFps, "%s: %d FPS", "Lamer Tetris", fps );
129 SDL_SetWindowTitle(window, szFps);
130 }
131 /*
132 void Game::onQuit() {
133
134 running = 0 ;
135 }
136 */
137 void Game::up_direction() {
138 tmp_element=n_element;
139 if(tmp_element<3) {
140 tmp_element+=1;
141 } else tmp_element=0;
142
143 if(!szlam.collisionRotate(field.get(figure,tmp_element), tmp_element,
144 figure, positionField.x, positionField.y, field.getColor(figure)))
145 if (field.checkEdgeRotate(field.get(figure, tmp_element), positionField.x)) {
146 if(n_element<3) {
147 n_element+=1;
148 } else n_element=0;
149 }
150 }
151
152 void Game::left_direction() {
153 left=0;
154 if(!szlam.collisionLeft(field.get(figure,n_element), n_element,
155 figure, positionField.x, positionField.y, field.getColor(figure)))
156 if (field.checkEdgeLeft(field.get(figure, n_element), positionField.x))
157 positionField.x-=20;
158 }
159 void Game::right_direction() {
160 if(!szlam.collisionRight(field.get(figure,n_element), n_element,
161 figure, positionField.x, positionField.y, field.getColor(figure)))
162 if (field.checkEdgeRight(field.get(figure, n_element), positionField.x))
163 positionField.x+=20;
164 }
165 void Game::run() {
166 int past = SDL_GetTicks();
167 int now = past, pastFps = past ;
168 int fps = 0;
169 bool end = SDL_FALSE;
170 int rate = 1;
171 SDL_Joystick *joystick;
172 joystick = SDL_JoystickOpen(0);
173 score = 0;
174
175 positionField = set_rect(200, 0, 80, 0);
176 srcField = set_rect(0, 0, 80, 80);
177
178 printf("Name: %s\n", SDL_JoystickNameForIndex(0));
179
180 SDL_Event event ;
181 while ( running ) {
182 int timeElapsed = 0 ;
183 if (SDL_PollEvent(&event)) {
184
185 switch (event.type) {
186 case SDL_QUIT:
187 if (score > hi_score)
188 {
189 hi_score=score;
190 hiscore.save_hiscore(hi_score);
191 }
192
193 running = 0 ;
194 break;
195 case SDL_KEYDOWN:
196 if (event.key.keysym.sym==SDLK_ESCAPE)
197 running = 0;
198
199 if (event.key.keysym.sym==SDLK_SPACE) {
200 if (end) {
201 szlam.reset();
202 end = false;
203 score = 0;
204 figure = rand()%7;
205 }
206 }
207 if (event.key.keysym.sym==SDLK_UP) {
208 up_direction();
209 }
210 if (event.key.keysym.sym==SDLK_LEFT) {
211 left_direction();
212 }
213 if (event.key.keysym.sym==SDLK_RIGHT) {
214 right_direction();
215
216 }
217 if (event.key.keysym.sym==SDLK_DOWN) {
218 rate=5;
219 }
220 if (event.key.keysym.sym==SDLK_f) {
221 if(figure<NFIGURE-1) {
222 figure+=1;
223 } else figure=0;
224 }
225 break;
226 case SDL_JOYBUTTONDOWN:
227 printf("button: %i\n", event.jbutton.button);
228 // góa
229 if (event.jbutton.button == 3) {
230 up_direction();
231 }
232 // lewo
233 if (event.jbutton.button == 2) {
234 left_direction();
235 }
236 // prawo
237 if (event.jbutton.button == 1) {
238 right_direction();
239 }
240 // dół
241 if (event.jbutton.button == 0) {
242 rate = 5;
243 }
244 // back
245 if (event.jbutton.button == 6) {
246 if (score > hi_score)
247 {
248 hi_score=score;
249 hiscore.save_hiscore(hi_score);
250 }
251 running = 0;
252 }
253 // lewy przedni
254 if (event.jbutton.button == 4) {
255 if(figure>0) {
256 figure-=1;
257 } else figure=NFIGURE-1;
258 }
259 // prawy przedni
260 if (event.jbutton.button == 5) {
261 if(figure<NFIGURE-1) {
262 figure+=1;
263 } else figure=0;
264 }
265 break;
266 case SDL_JOYAXISMOTION:
267 printf("axis: %i %i\n", event.jaxis.axis, event.jaxis.value);
268 break;
269 case SDL_KEYUP:
270 case SDL_MOUSEBUTTONDOWN:
271 case SDL_MOUSEBUTTONUP:
272 case SDL_MOUSEMOTION:
273 break ;
274 }
275 }
276
277 timeElapsed = (now=SDL_GetTicks()) - past ;
278 if ( timeElapsed >= UPDATE_INTERVAL ) {
279 past = now ;
280
281 if (szlam.addBottom(field.get(figure,n_element), figure, n_element,
282 field.getColor(figure),positionField.x,positionField.y )){
283 printf ("Dodaje na dole\n");
284 positionField.y=0;
285 positionField.x=(rand()%6-1)*80;
286 positionField.h=0;
287 srcField.y=80;
288 srcField.h=0;
289 figure = rand()%7;
290 rate=1;
291
292 score++;
293 // sprawdza czy równa powierzchnia
294 int heightLevel=0, evenLevel = szlam.evenSurface(&heightLevel);
295 if (evenLevel) {
296 szlam.cutSurface(evenLevel, heightLevel);
297 score += 15*evenLevel;
298 }
299 //bottom = 1;
300
301 }
302 else if (szlam.collisionBottom(field.get(figure,n_element), n_element,
303 figure, positionField.x, positionField.y, field.getColor(figure))){
304 if (!end){
305 printf ("góra\n");
306 positionField.y=0;
307 positionField.x=(rand()%6-1)*80;
308 positionField.h=0;
309 srcField.y=80;
310 srcField.h=0;
311 figure = rand()%7;
312 rate=1;
313 score++;
314
315 // sprawdza czy równa powierzchnia
316 int heightLevel=0, evenLevel = szlam.evenSurface(&heightLevel);
317 if (evenLevel) {
318 printf ("b1\n");
319 szlam.cutSurface(evenLevel, heightLevel);
320 score += 15*evenLevel;
321 }
322 }
323
324 }
325
326 if (szlam.highFull()) end = SDL_TRUE;
327
328 draw(&srcField, &positionField, end); // figure -- element
329 if(srcField.y>0 && !end){
330 srcField.y--; srcField.h++;
331 }
332 else if (srcField.y==0 && !end) {
333 positionField.y+=rate;
334 ++fps ;
335 }
336 if ( now - pastFps >= 1000 ) {
337 pastFps = now ;
338 fpsChanged( fps );
339 fps = 0 ;
340 }
341 }
342 // sleep?
343 SDL_Delay( 1 );
344 }
345 //SDL_FreeSurface(background);
346 //SDL_FreeSurface(screenSurface);
347 SDL_JoystickClose(joystick);
348 SDL_DestroyTexture(texture);
349 SDL_DestroyRenderer(renderer);
350 SDL_DestroyWindow(window);
351 SDL_Quit();
352
353 }
354
355 bool Game::loadFromFile( std::string path, SDL_Renderer * renderer)
356 {
357
358 SDL_Texture* backgroundTexture = NULL;
359 if (background) SDL_FreeSurface(background);
360 background = SDL_LoadBMP(path.c_str());
361
362 if( background == NULL )
363 {
364 printf( "Unable to load image %s!\n", path.c_str() );
365 }
366 else
367 {
368 //Color key image
369 //SDL_SetColorKey( background, SDL_TRUE, SDL_MapRGB( background>format, 0, 0xFF, 0xFF ) );
370 backgroundTexture = SDL_CreateTextureFromSurface( renderer, background );
371
372 if( backgroundTexture == NULL )
373 {
374 printf( "Unable to create texture from %s! SDL Error: %s\n", path.c_str(), SDL_GetError() );
375 }
376 }
377 return backgroundTexture != NULL;
378 }
379
380 bool Game::loadWallpaper()
381 {
382 #define SIZEFONT 35
383
384 #if WINDOWS
385 #define FONT "./assets/SpicyRice.ttf"
386 #define BACK "./assets/wallpaper.bmp"
387 #elif LINUX
388 //#define FONT "./assets/SpicyRice.ttf"
389 //#define BACK "./assets/wallpaper.bmp"
390 #define FONT "/usr/share/lamertetris/SpicyRice.ttf"
391 #define BACK "/usr/share/lamertetris/img/wallpaper.bmp"
392 #endif
393 //Loading success flag
394 bool success = true;
395 for (int i = 0; i<1; i++) {
396 //Load dot texture
397 if (!loadFromFile( BACK, renderer))
398 {
399 printf( "Failed to load dot texture!\n" );
400 success = false;
401 }
402 }
403
404 if((gFont = TTF_OpenFont(FONT, SIZEFONT)) == NULL) {
405 printf("TTF_OpenFont: %s\n", TTF_GetError());
406 exit(1);
407 }
408 if((fontScore = TTF_OpenFont(FONT, SIZEFONT)) == NULL) {
409 printf("TTF_OpenFont: %s\n", TTF_GetError());
410 exit(1);
411 }
412
413 return success;
414 }
415
416 SDL_Rect set_rect(int x, int y, int w, int h)
417 {
418 SDL_Rect rect;
419 rect.x = x;
420 rect.y = y;
421 rect.w = w;
422 rect.h = h;
423 return rect;
424 }
425
426 int main(int argc, char** argv){
427
428 Game game;
429 game.start();
430 game.run();
431 return 0;
432 }