ELEC2645 (2019/20) / Mbed 2 deprecated ELEC2645_Project_el18zc_

Dependencies:   mbed

Committer:
ChenZirui
Date:
Fri May 29 02:55:37 2020 +0000
Revision:
7:f61ac963eb07
Parent:
6:b393cfe4e0a7
Child:
8:5f0190b282f7
not final

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ChenZirui 5:7207c9b70108 1 #include "Touch.h"
ChenZirui 5:7207c9b70108 2
ChenZirui 5:7207c9b70108 3
ChenZirui 7:f61ac963eb07 4 //initialisation part
ChenZirui 7:f61ac963eb07 5 void Touch::init(int Board_width,int Board_length,int bullet_size,int speed,N5110 &lcd)
ChenZirui 5:7207c9b70108 6 {
ChenZirui 5:7207c9b70108 7 // initialise the game parameters
ChenZirui 7:f61ac963eb07 8 _Board_width = Board_width; //width of board
ChenZirui 7:f61ac963eb07 9 _Board_length = Board_length; //length of board
ChenZirui 7:f61ac963eb07 10 _bullet_size = bullet_size; //bullet size
ChenZirui 7:f61ac963eb07 11 _speed = speed; //speed
ChenZirui 7:f61ac963eb07 12 _leds=0;//led number
ChenZirui 7:f61ac963eb07 13
ChenZirui 7:f61ac963eb07 14 _board.init(_board_x,_board_y,_Board_length,_Board_width); // draw board
ChenZirui 7:f61ac963eb07 15 _bullet.init(_board_x,Board_length,_speed,_Board_length); //draw bullet
ChenZirui 7:f61ac963eb07 16
ChenZirui 5:7207c9b70108 17 }
ChenZirui 5:7207c9b70108 18
ChenZirui 7:f61ac963eb07 19 void Touch::reading(Gamepad &pad)
ChenZirui 5:7207c9b70108 20 {
ChenZirui 7:f61ac963eb07 21 _d = pad.get_direction(); // joystick direction
ChenZirui 7:f61ac963eb07 22 _mag = pad.get_mag(); // joystick direction movement parameter
ChenZirui 5:7207c9b70108 23 }
ChenZirui 5:7207c9b70108 24
ChenZirui 5:7207c9b70108 25 void Touch::draw(N5110 &lcd)
ChenZirui 5:7207c9b70108 26 {
ChenZirui 7:f61ac963eb07 27
ChenZirui 7:f61ac963eb07 28 Vector2D bullet_pos = _bullet.get_pos(); //bullet position
ChenZirui 7:f61ac963eb07 29 /* s=0;
ChenZirui 7:f61ac963eb07 30 if((bullet_pos.y >= 0)&&(bullet_pos.y <= 24))
ChenZirui 7:f61ac963eb07 31 {
ChenZirui 7:f61ac963eb07 32 //s++;
ChenZirui 7:f61ac963eb07 33 Y[s]= bullet_pos.y ;
ChenZirui 7:f61ac963eb07 34 X[s]= bullet_pos.x;
ChenZirui 7:f61ac963eb07 35 s++;
ChenZirui 7:f61ac963eb07 36 }*/
ChenZirui 7:f61ac963eb07 37 for(int r=1;r<84;r++)
ChenZirui 7:f61ac963eb07 38 for(int c=1;c<24;c++)
ChenZirui 7:f61ac963eb07 39 {
ChenZirui 7:f61ac963eb07 40 lcd.setPixel(r,c);
ChenZirui 7:f61ac963eb07 41 if((bullet_pos.y >= 0)&&(bullet_pos.y <= 24))
ChenZirui 7:f61ac963eb07 42 {
ChenZirui 7:f61ac963eb07 43
ChenZirui 7:f61ac963eb07 44 Y= bullet_pos.y;
ChenZirui 7:f61ac963eb07 45 X= bullet_pos.x;
ChenZirui 7:f61ac963eb07 46 lcd.clearPixel(X,Y-1);
ChenZirui 7:f61ac963eb07 47 /* for(int i=0;i<s;i++)
ChenZirui 7:f61ac963eb07 48 lcd.clearPixel(X[i],Y[i]-1);*/
ChenZirui 7:f61ac963eb07 49 }
ChenZirui 7:f61ac963eb07 50 }
ChenZirui 7:f61ac963eb07 51 lcd.drawRect(0,0,WIDTH,HEIGHT,FILL_TRANSPARENT); // draw a platform for game
ChenZirui 5:7207c9b70108 52 print_scores(lcd);
ChenZirui 7:f61ac963eb07 53 _board.draw(lcd);
ChenZirui 5:7207c9b70108 54 _bullet.draw(lcd);
ChenZirui 5:7207c9b70108 55 }
ChenZirui 5:7207c9b70108 56
ChenZirui 7:f61ac963eb07 57 void Touch::update(Gamepad &pad,N5110 &lcd)
ChenZirui 5:7207c9b70108 58 {
ChenZirui 5:7207c9b70108 59 check_goal(pad);
ChenZirui 7:f61ac963eb07 60 // important to update Boards and ball before checking collisions so can
ChenZirui 5:7207c9b70108 61 // correct for it before updating the display
ChenZirui 7:f61ac963eb07 62 _board.update(_d,_mag);
ChenZirui 5:7207c9b70108 63 //_p2.update(_d,_mag);
ChenZirui 7:f61ac963eb07 64 _bullet.update(lcd);
ChenZirui 5:7207c9b70108 65
ChenZirui 5:7207c9b70108 66 check_wall_collision(pad);
ChenZirui 7:f61ac963eb07 67 check_Board_collisions(pad,lcd);
ChenZirui 5:7207c9b70108 68 }
ChenZirui 5:7207c9b70108 69
ChenZirui 5:7207c9b70108 70 void Touch::check_wall_collision(Gamepad &pad)
ChenZirui 5:7207c9b70108 71 {
ChenZirui 5:7207c9b70108 72 // read current ball attributes
ChenZirui 5:7207c9b70108 73 Vector2D bullet_pos = _bullet.get_pos();
ChenZirui 5:7207c9b70108 74 Vector2D bullet_velocity = _bullet.get_velocity();
ChenZirui 5:7207c9b70108 75
ChenZirui 5:7207c9b70108 76 // check if hit top wall
ChenZirui 5:7207c9b70108 77 if (bullet_pos.y <= 1) { // 1 due to 1 pixel boundary
ChenZirui 5:7207c9b70108 78 bullet_pos.y = 1; // bounce off ceiling without going off screen
ChenZirui 5:7207c9b70108 79 bullet_velocity.y = -bullet_velocity.y;
ChenZirui 5:7207c9b70108 80 // audio feedback
ChenZirui 5:7207c9b70108 81 pad.tone(750.0,0.1);
ChenZirui 5:7207c9b70108 82 }
ChenZirui 7:f61ac963eb07 83 // check if hit right wall
ChenZirui 7:f61ac963eb07 84 else if (bullet_pos.x+_bullet_size >= 83 ) { // right wall is 83
ChenZirui 5:7207c9b70108 85 // hit bottom
ChenZirui 7:f61ac963eb07 86 bullet_pos.x = (WIDTH-1) - _bullet_size; // stops ball going off screen
ChenZirui 7:f61ac963eb07 87 bullet_velocity.x = -bullet_velocity.x;
ChenZirui 7:f61ac963eb07 88 // audio feedback
ChenZirui 7:f61ac963eb07 89 pad.tone(750.0,0.1);
ChenZirui 7:f61ac963eb07 90 }// check if hit left wall
ChenZirui 7:f61ac963eb07 91 else if (bullet_pos.x <= 1 ) { // left wall pixel is 1
ChenZirui 7:f61ac963eb07 92 // hit bottom
ChenZirui 7:f61ac963eb07 93 bullet_pos.x = 1; // stops ball going off screen
ChenZirui 7:f61ac963eb07 94 bullet_velocity.x = -bullet_velocity.x;
ChenZirui 5:7207c9b70108 95 // audio feedback
ChenZirui 5:7207c9b70108 96 pad.tone(750.0,0.1);
ChenZirui 5:7207c9b70108 97 }
ChenZirui 5:7207c9b70108 98 // update ball parameters
ChenZirui 5:7207c9b70108 99 _bullet.set_velocity(bullet_velocity);
ChenZirui 5:7207c9b70108 100 _bullet.set_pos(bullet_pos);
ChenZirui 5:7207c9b70108 101 }
ChenZirui 5:7207c9b70108 102
ChenZirui 7:f61ac963eb07 103 void Touch::check_Board_collisions(Gamepad &pad,N5110 &lcd)
ChenZirui 5:7207c9b70108 104 {
ChenZirui 5:7207c9b70108 105 Vector2D bullet_pos = _bullet.get_pos();
ChenZirui 5:7207c9b70108 106 Vector2D bullet_velocity = _bullet.get_velocity();
ChenZirui 7:f61ac963eb07 107 Vector2D p1_pos = _board.get_pos();
ChenZirui 5:7207c9b70108 108 if (
ChenZirui 7:f61ac963eb07 109 (bullet_pos.x >= p1_pos.x) && //top
ChenZirui 7:f61ac963eb07 110 (bullet_pos.x <= p1_pos.x + _Board_length) && //bottom
ChenZirui 7:f61ac963eb07 111 (bullet_pos.y+_bullet_size >=p1_pos.y) //left
ChenZirui 7:f61ac963eb07 112 //right
ChenZirui 5:7207c9b70108 113 ){
ChenZirui 5:7207c9b70108 114
ChenZirui 5:7207c9b70108 115 // if it has, fix position and reflect x velocity
ChenZirui 7:f61ac963eb07 116 // bullet_pos.y = _boardy - _bullet_size;
ChenZirui 7:f61ac963eb07 117 bullet_velocity.y = -bullet_velocity.y;
ChenZirui 5:7207c9b70108 118 // audio feedback
ChenZirui 5:7207c9b70108 119 pad.tone(1000.0,0.1);
ChenZirui 5:7207c9b70108 120
ChenZirui 5:7207c9b70108 121 }
ChenZirui 5:7207c9b70108 122 if((bullet_pos.y >= 0)&&(bullet_pos.y <= 24))
ChenZirui 5:7207c9b70108 123 {
ChenZirui 7:f61ac963eb07 124 // Y= bullet_pos.y ;
ChenZirui 7:f61ac963eb07 125 // X= bullet_pos.x;
ChenZirui 7:f61ac963eb07 126 // lcd.clearPixel(X,_Y-1);
ChenZirui 5:7207c9b70108 127 bullet_pos.y = bullet_pos.y + _Board_width;
ChenZirui 5:7207c9b70108 128 bullet_velocity.y = -bullet_velocity.y;
ChenZirui 7:f61ac963eb07 129 // lcd.clearPixel(_x,_y-1);
ChenZirui 7:f61ac963eb07 130 }
ChenZirui 7:f61ac963eb07 131 // lcd.clearPixel(X,Y-1);*/
ChenZirui 5:7207c9b70108 132 // write new attributes
ChenZirui 5:7207c9b70108 133 _bullet.set_velocity(bullet_velocity);
ChenZirui 5:7207c9b70108 134 _bullet.set_pos(bullet_pos);
ChenZirui 5:7207c9b70108 135 }
ChenZirui 5:7207c9b70108 136
ChenZirui 5:7207c9b70108 137 void Touch::check_goal(Gamepad &pad)
ChenZirui 5:7207c9b70108 138 {
ChenZirui 5:7207c9b70108 139 Vector2D bullet_pos = _bullet.get_pos();
ChenZirui 7:f61ac963eb07 140
ChenZirui 7:f61ac963eb07 141
ChenZirui 5:7207c9b70108 142
ChenZirui 5:7207c9b70108 143 // P1 has scored
ChenZirui 7:f61ac963eb07 144 if (bullet_pos.y + _bullet_size> 47) {
ChenZirui 7:f61ac963eb07 145 _board.add_score();
ChenZirui 7:f61ac963eb07 146 _bullet.init(_board_x,_bullet_size,_speed,_Board_length);
ChenZirui 7:f61ac963eb07 147 _leds++;
ChenZirui 7:f61ac963eb07 148 if(_leds>6)
ChenZirui 7:f61ac963eb07 149 {
ChenZirui 7:f61ac963eb07 150 _leds=6;
ChenZirui 7:f61ac963eb07 151 }
ChenZirui 7:f61ac963eb07 152 pad.led(_leds,0);
ChenZirui 5:7207c9b70108 153 pad.tone(1500.0,0.5);
ChenZirui 7:f61ac963eb07 154 // pad.leds_on();
ChenZirui 5:7207c9b70108 155 wait(0.5);
ChenZirui 7:f61ac963eb07 156 // pad.leds_off();
ChenZirui 5:7207c9b70108 157 }
ChenZirui 5:7207c9b70108 158 }
ChenZirui 5:7207c9b70108 159
ChenZirui 5:7207c9b70108 160 void Touch::print_scores(N5110 &lcd)
ChenZirui 5:7207c9b70108 161 {
ChenZirui 7:f61ac963eb07 162 // get scores from Boards
ChenZirui 7:f61ac963eb07 163 int p1_score = _board.get_score();
ChenZirui 5:7207c9b70108 164
ChenZirui 5:7207c9b70108 165 // print to LCD i
ChenZirui 5:7207c9b70108 166 char buffer1[14];
ChenZirui 5:7207c9b70108 167 sprintf(buffer1,"%2d",p1_score);
ChenZirui 5:7207c9b70108 168 lcd.printString(buffer1,WIDTH/2 - 20,1); // font is 8 wide, so leave 4 pixel gape from middle assuming two digits
ChenZirui 5:7207c9b70108 169 char buffer2[14];
ChenZirui 5:7207c9b70108 170 sprintf(buffer2,"%2d",p2_score);
ChenZirui 5:7207c9b70108 171 lcd.printString(buffer2,WIDTH/2 + 4,1);
ChenZirui 5:7207c9b70108 172 }