Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed ll16j23s_test_docs
SnakeEngine/SnakeEngine.cpp
- Committer:
- JoeShotton
- Date:
- 2020-05-25
- Revision:
- 8:bcc3403d7e79
- Parent:
- 7:dd84e0fab346
- Child:
- 9:0571880085cc
File content as of revision 8:bcc3403d7e79:
#include "SnakeEngine.h" SnakeEngine::SnakeEngine() { //constructor score = 0; _menu_select = 1; _map = 1; _game_state = 1; _pot2 = 0.5; } SnakeEngine::~SnakeEngine() { //destructor } void SnakeEngine::game_init(Gamepad &pad, N5110 &lcd, FXOS8700CQ &mag){ _food.init(mag); _body.init(); _food.rand_pos(pad, lcd); transition_black(lcd); transition_white(lcd); } void SnakeEngine::game_run(Gamepad &pad, N5110 &lcd){ //input??? map_run(lcd); move_body(pad, lcd); snake_food_collision(pad, lcd, _body._length); if (_body.snake_snake_collision(pad) == true) { //death_init(lcd); //_game_state = 4; } //snake-wall collision } void SnakeEngine::move_body(Gamepad &pad, N5110 &lcd){ _body.snake_movement(pad); _body.draw_body(lcd); //printf("Moving!"); _food.do_food(lcd); snake_food_collision(pad, lcd, _body._length); } void SnakeEngine::snake_food_collision(Gamepad &pad, N5110 &lcd, int &_length) { if (_food._x == _body._x_head && _food._y == _body._y_head){ //printf("FOOD!"); while (_food.rand_pos(pad, lcd) == false){ _food.rand_pos(pad, lcd); printf("Reselected food position\n"); } pad.led(3,0.9); _length += 5; score++; } } void SnakeEngine::map_run(N5110 &lcd) { switch(_map) { case 2: map2_draw(lcd); snake_map2_collision(); break; case 3: map3_draw(lcd); snake_map3_collision(); break; case 4: map4_draw(lcd); snake_map4_collision(); break; } } bool SnakeEngine::snake_map2_collision() { if (_body._x_head == 0 || _body._x_head == 82 || _body._y_head == 0 || _body._y_head == 46){ //if snakehead coords exceed the ring coords return true; } } bool SnakeEngine::snake_map3_collision() { /* if (_body._x_head == 0 || _body._x_head == 82 || _body._y_head == 0 || _body._y_head == 46){ return true; } */ } bool SnakeEngine::snake_map4_collision() { /* for(int i = 0; i < 48; i++){ if(_body._x_head == MAP 4 COORDS && _body._y_head == MAP 4 COORDS) { return true; } */ } void SnakeEngine::map2_draw(N5110 &lcd){ lcd.drawRect(0, 0, 84, 48,FILL_TRANSPARENT); lcd.drawRect(1, 1, 82, 46,FILL_TRANSPARENT); } void SnakeEngine::map3_draw(N5110 &lcd){ lcd.drawRect(40, 0, 4, 16,FILL_BLACK); //N wall lcd.drawRect(68, 22, 16, 4,FILL_BLACK);//E wall lcd.drawRect(40, 32, 4, 16,FILL_BLACK);//S wall lcd.drawRect(0, 22, 16, 4,FILL_BLACK); //W wall } void SnakeEngine::map4_draw(N5110 &lcd){ lcd.drawRect(12, 8, 4, 4,FILL_BLACK); //NW square lcd.drawRect(12, 36, 4, 4,FILL_BLACK);//SW square lcd.drawRect(68, 8, 4, 4,FILL_BLACK); //NE square lcd.drawRect(68, 36, 4, 4,FILL_BLACK);//SE square lcd.drawRect(40, 6, 4, 8,FILL_BLACK); //N spot, vertical lcd.drawRect(38, 8, 8, 4,FILL_BLACK); //N spot, horizontal lcd.drawRect(26, 20, 4, 8,FILL_BLACK);//E spot, vertical lcd.drawRect(24, 22, 8, 4,FILL_BLACK);//E spot, horizontal lcd.drawRect(40, 34, 4, 8,FILL_BLACK);//S spot, vertical lcd.drawRect(38, 36, 8, 4,FILL_BLACK);//S spot, horizontal lcd.drawRect(54, 20, 4, 8,FILL_BLACK);//W spot, vertical lcd.drawRect(52, 22, 8, 4,FILL_BLACK);//W spot, horizontal } void SnakeEngine::transition_black(N5110 &lcd) { //lcd.clear(); for (int j = 0; j < 21; j += 4) { //j iterator controls the size and location of current loop //printf("j: %d\n", j); for (int i = 1; i < 84 - (2*j); i += 2) { //i iterator controls length of rectangles lcd.drawRect(j, j, i + 1, 4, FILL_BLACK); //top horizontal rectangle lcd.drawRect(83 - j - i, 44 - j, i + 1, 4, FILL_BLACK); //bottom horizontal rectangle wait_ms(5); lcd.refresh(); //refreshes screen without clearing it to maintain previous loops } for (int i = 1; i < 43 - (2*j); i += 2) { //i iterator controls length of rectangles lcd.drawRect(80 - j, 4 + j, 4, i,FILL_BLACK); //right vertical rectangle lcd.drawRect(j, 44 - i - j, 4, i,FILL_BLACK); //left vertical rectangle wait_ms(5); lcd.refresh(); //refreshes screen without clearing it to maintain previous loops } } //wait_ms(500); } void SnakeEngine::transition_white(N5110 &lcd) { //lcd.clear(); for (int j = 0; j < 21; j += 4) { //printf("j: %d\n", j); for (int i = 1; i < 84 - (2*j); i += 2) { lcd.drawRect(j, j, i + 1, 4, FILL_WHITE); lcd.drawRect(83 - j - i, 44 - j, i + 1, 4, FILL_WHITE); wait_ms(5); lcd.refresh(); } for (int i = 1; i < 43 - (2*j); i += 2) { lcd.drawRect(80 - j, 4 + j, 4, i,FILL_WHITE); lcd.drawRect(j, 44 - i - j, 4, i,FILL_WHITE); wait_ms(5); lcd.refresh(); } } //wait_ms(500); } void SnakeEngine::menu1_init(N5110 &lcd){ transition_black(lcd); transition_white(lcd); lcd.clear(); lcd.refresh(); //printf("Menu 2\n"); lcd.printString(" SNAKE",3,0); lcd.printString("Play",30,2); lcd.drawCircle(24,19,3,FILL_TRANSPARENT); lcd.printString("Maps",30,3); lcd.drawCircle(24,27,3,FILL_TRANSPARENT); lcd.refresh(); } void SnakeEngine::menu1_select(N5110 &lcd, Gamepad &pad){ //printf("Menu 1\n"); if (pad.X_pressed() == true){ //detect if 'up' selection _menu_select--; } else if (pad.B_pressed() == true){ //detect if 'down' selection _menu_select++; } //printf("Option: %d\n", _menu_select); if (pad.A_pressed() == true && _menu_select == 1){ //if option 1 selected and 'A' pressed //game_init(); //Initialise game _game_state = 3; //switch state } else if (pad.A_pressed() == true && _menu_select == 2){ //if option 2 selected and 'A' pressed menu2_init(lcd); //Initialise map menu _game_state = 2; //switch state } if (_menu_select > 2) { //bottom - top wrap around _menu_select = 1; } else if (_menu_select < 1) { ////top - bottom wrap around _menu_select = 2; } select_circles(lcd, _menu_select); //draw black circle in selected option } void SnakeEngine::menu2_init(N5110 &lcd){ //transition_black(lcd); //transition_white(lcd); //printf("Menu 1\n"); lcd.clear(); lcd.printString(" MAPS",0,0); lcd.printString("Empty",30,2); lcd.drawCircle(24,19,3,FILL_TRANSPARENT); lcd.printString("Ring",30,3); lcd.drawCircle(24,27,3,FILL_TRANSPARENT); lcd.printString("Cross",30,4); lcd.drawCircle(24,35,3,FILL_TRANSPARENT); lcd.printString("Spots",30,5); lcd.drawCircle(24,43,3,FILL_TRANSPARENT); lcd.refresh(); } void SnakeEngine::menu2_select(N5110 &lcd, Gamepad &pad){ //printf("Menu 2\n"); if (pad.X_pressed() == true){ _map--; } else if (pad.B_pressed() == true){ _map++; } else if (pad.Y_pressed() == true){ preview(lcd, _map); } else if (pad.A_pressed() == true){ //game_init(); _game_state = 3; } //printf("Map: %d\n", _map); if (_map > 4) { _map = 1; } else if (_map < 1) { _map = 4; } select_circles(lcd, _map); } void SnakeEngine::death_init(N5110 &lcd){ wait_ms(500); transition_black(lcd); transition_white(lcd); //printf("Game over\n"); lcd.printString(" GAME OVER ",0,0); lcd.printString(" Score =",3,1); char buffer[14]; if (score < 10){ sprintf(buffer," 0%2d",score); } else { sprintf(buffer," %2d",score); } lcd.printString(buffer,0,2); lcd.printString("Again!",24,4); lcd.drawCircle(24,35,3,FILL_TRANSPARENT); lcd.printString("Menu",24,5); lcd.drawCircle(24,44,3,FILL_TRANSPARENT); lcd.refresh(); } void SnakeEngine::death_select(N5110 &lcd, Gamepad &pad){ } void SnakeEngine::select_circles(N5110 &lcd, int line) { for(int i = 19; i < 52; i +=8) { lcd.drawCircle(24,i,2,FILL_WHITE); } lcd.drawCircle(24,11+line*8,2,FILL_BLACK); lcd.refresh(); wait_ms(200); //snake_select1.render(lcd, 0, 8); //wait_ms(200); //snake_select2.render(lcd, 0, 8); //wait_ms(200); //snake_select3.render(lcd, 0, 8); //wait_ms(200); } void SnakeEngine::preview(N5110 &lcd, int _map){ lcd.clear(); switch(_map) { case 1: lcd.clear(); lcd.printString("(Empty)",21,2); break; case 2: map2_draw(lcd); //lcd.printString("Ring",30,2); break; case 3: map3_draw(lcd); //lcd.printString("Cross",27,2); break; case 4: map4_draw(lcd); //lcd.printString("Spots",27,2); break; } lcd.refresh(); wait_ms(1000); lcd.clear(); menu2_init(lcd); } void SnakeEngine::contrast(Gamepad &pad, N5110 &lcd){ _pot2 = pad.read_pot2(); lcd.setContrast(0.25 + _pot2 * 0.5); //printf("Contrast: %f\n", 0.25 + _pot2 * 0.5); }