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 FATFileSystem
Diff: Ball/Ball.cpp
- Revision:
- 4:035448357749
- Parent:
- 3:a8960004d261
- Child:
- 5:0b31909caf7f
--- a/Ball/Ball.cpp Fri Mar 29 18:45:40 2019 +0000
+++ b/Ball/Ball.cpp Mon Apr 08 15:10:28 2019 +0000
@@ -20,8 +20,9 @@
{
_x_pos = x;
_y_pos = y;
- _x_vel = 0;
- _y_vel = 0;
+ _x_vel = 0.0f;
+ _y_vel = 0.0f;
+ _shot_count = 0;
}
@@ -30,72 +31,101 @@
lcd.drawRect(_x_pos,_y_pos,3,3,FILL_BLACK); //draws ball
}
-void Ball::draw_aim(N5110 &lcd)
+void Ball::draw_aim(N5110 &lcd, Gamepad &pad)
{
- lcd.drawLine((_x_pos+1.0f),(_y_pos+1.0f),(_x_pos+1.0f)-(_joy.x*16.0f),(_y_pos+1.0f)-(-_joy.y*16.0f),2); //draws ball
+ read_joy(pad);
+ lcd.drawLine((_x_pos+1.0f),(_y_pos+1.0f),(_x_pos+1.0f)+(_joystick.x*16.0f),(_y_pos+1.0f)-(_joystick.y*16.0f),1); //draws ball
+}
+
+void Ball::draw_course(N5110 &lcd)
+{
+ lcd.drawRect(0,16,83,32,FILL_TRANSPARENT);
}
-void Ball::draw_screen(N5110 &lcd)
-{
- lcd.drawRect(16,8,51,31,FILL_TRANSPARENT);
+void Ball::draw_screen(N5110 &lcd, Gamepad &pad) {
+
+ draw_course(lcd);
+ draw_ball(lcd);
+ draw_aim(lcd, pad);
+ print_shot_count(lcd);
}
-void Ball::move_ball()
+void Ball::move_ball(int frame_rate, N5110 &lcd)
{
- _x_pos = _x_pos + _x_vel;
- _y_pos = _y_pos + _y_vel;
- _x_vel = _x_vel*0.9f; //ball slows down 10% each loop
- _y_vel = _y_vel*0.9f;
- check_hit_wall();
+ check_bounce(lcd);
+ _x_pos = _x_pos + _x_vel*10.0f/frame_rate; //frame_rate used to scale ball movement so that it is the same for any fps
+ _y_pos = _y_pos + _y_vel*10.0f/frame_rate;
+ _x_vel = _x_vel*(1.0f-(0.8f/frame_rate)); //ball slows down 10% each loop (scaled by time between frames)
+ _y_vel = _y_vel*(1.0f-(0.8f/frame_rate));
+ check_bounce(lcd);
}
+Vector2D Ball::get_ball_pos()
+{
+ Vector2D pos = {_x_pos, _y_pos};
+ return pos;
+}
+
void Ball::shoot_ball(Gamepad &pad)
{
- if(pad.check_event(Gamepad::A_PRESSED) == true && _x_vel < 0.1f && _y_vel < 0.1f){ //if ball stationary and a pressed then shoot
- _x_vel = 8.0f * _joy.x; //scale x velocity by joystick direction and magnitude
- _y_vel = 8.0f * -_joy.y; //scale y velocity by joystick direction and magnitude
+ if(pad.check_event(Gamepad::A_PRESSED) == true && abs(_x_vel) < 0.05f && abs(_y_vel) < 0.05f){ //if ball stationary and a pressed then shoot
+ _x_vel = 8.0f * _joystick.x; //scale x velocity by joystick direction and magnitude
+ _y_vel = 8.0f * -_joystick.y; //scale y velocity by joystick direction and magnitude
+ _shot_count ++; //increment shot count
+
}
}
+int Ball::get_shot_count()
+{
+ int shot_count = _shot_count;
+ return shot_count;
+}
+
+void Ball::print_shot_count(N5110 &lcd)
+{
+ char buffer[14];
+ sprintf(buffer,"Shot Count = %i",_shot_count);
+ lcd.printString(buffer,0,0);
+}
+
void Ball::set_vel(float x_vel, float y_vel)
{
_x_vel = x_vel;
_y_vel = y_vel;
}
-void Ball::check_hit_wall()
+void Ball::check_bounce(N5110 &lcd)
{
- if(_x_pos <= 16) {
- _x_pos = 17;
+ if(_x_pos - 1 < 0 ) { //
+ _x_pos = 1;
_x_vel = -_x_vel;
}
-
- else if(_x_pos >= (WIDTH - 18)) {
- _x_pos = (WIDTH - 20);
- _x_vel = -_x_vel;
- }
- else if(_y_pos <= 8) {
- _y_pos = 9;
- _y_vel = -_y_vel;
- }
-
- else if(_y_pos >= (HEIGHT - 11)) {
- _y_pos = (HEIGHT - 13);
+ else if(_y_pos + 3 > 48) {
+ _y_pos = 45;
_y_vel = -_y_vel;
}
+ else if(_x_pos + 3 > 83 ) {
+ _x_pos = 80;
+ _x_vel = -_x_vel;
+ }
+ else if(_y_pos - 1 < 16) {
+ _y_pos = 17;
+ _y_vel = -_y_vel;
+ }
+
+
}
void Ball::read_joy(Gamepad &pad)
{
- _coords = pad.get_mapped_coord();
- _joy.mag = pad.get_mag();
- _joy.x = _coords.x;
- _joy.y = _coords.y;
+ _joystick = pad.get_mapped_coord(); //x and y coordinates from joystick assigned
+
}
//private methods