circle - circle collision
chaseC

Hi, I am making an air hockey game and I need some help with puck to the thing you use to hit the puck collision. The collision isn't the real problem, the problem is that if I move the puck hitting thing to fast it goes through the puck and sends it in the wrong direction. I need some advise???

BAF

What, one account and thread wasn't enough to get people to program your game for you?

Ceagon Xylas

Line collision. Begin the line at the puck, end it at the puck's coordinates plus it's velocity. Check to see if that line collides with any of the walls (other lines)

chaseC

What I mean is that if the paddle (I don't know if it is actually called a paddle) moves to fast when it is in the path of the puck, it changes position so many pixels at a time that it moves into the puck and sends it in the wrong direction. Also I am not zavirx, my code doen't look anything like his ->

 1 #include 2 3 #define BALL_SPEED_MOD 12 4 5 struct comp{ 6 float x; 7 float y; 8 9 float x_speed; 10 float y_speed; 11 12 int h; 13 int w; 14 15 int time; 16 }; 17 18 struct player{ 19 float x; 20 float y; 21 22 float x_speed; 23 float y_speed; 24 25 int h; 26 int w; 27 }; 28 29 comp p2; 30 comp puck; 31 32 player p1; 33 34 BITMAP *buffer; 35 BITMAP *Player; 36 BITMAP *Comp; 37 BITMAP *Puck; 38 39 int GameSpeed; 40 41 void SpeedCounter(){ 42 GameSpeed++; 43 } END_OF_FUNCTION(SpeedCounter); 44 45 void SetUp(); 46 void HandlePuck(); 47 void Bounce(); 48 void Bounce2(); 49 void MovePlayer(); 50 void DrawStuff(); 51 52 void SetUp(){ 53 54 p1.x = 260; 55 p1.y = 240; 56 p1.w = 28; 57 p1.h = 28; 58 59 p2.x = 380; 60 p2.y = 240; 61 p2.w = 28; 62 p2.h = 28; 63 64 puck.x = 320; 65 puck.y = 140; 66 puck.w = 23; 67 puck.h = 23; 68 puck.y_speed = 0; 69 puck.x_speed = -1; 70 } 71 72 void HandlePuck(){ 73 74 Bounce(); 75 Bounce2(); 76 77 puck.x += puck.x_speed; 78 puck.y += puck.y_speed; 79 80 if(puck.y_speed < 0 && puck.y - puck.w <= 60 || puck.y_speed > 0 && puck.y + puck.w >= 420){ 81 puck.y_speed = -puck.y_speed; 82 }if(puck.x_speed < 0 && puck.x - puck.w <= 20 && puck.y < 180 || puck.x_speed < 0 && puck.x - 83 puck.w <= 20 && puck.y + puck.w > 280|| puck.x_speed > 0 && puck.x + puck.w >= 619&& puck.y - 84 puck.w < 180 || puck.x_speed > 0 && puck.x + puck.w >= 619 && puck.y - puck.w > 280){ 85 puck.x_speed = -puck.x_speed; 86 } 87 puck.x_speed *= 0.996; 88 puck.y_speed *= 0.996; 89 } 90 91 void Bounce(){ 92 93 static int puck_bounce = 0; 94 const float dx = p1.x - puck.x; 95 const float dy = p1.y - puck.y; 96 const float dist = p1.w + puck.w; 97 98 if(((dx * dx) + (dy * dy)) < (dist * dist) && puck_bounce == 0){ 99 puck.x_speed = -(((p1.x + p1.w) - (puck.x + puck.w))/BALL_SPEED_MOD) + (p1.x_speed/BALL_SPEED_MOD) - (puck.x_speed/BALL_SPEED_MOD); 100 puck.y_speed = -(((p1.y + p1.w) - (puck.y + puck.w))/BALL_SPEED_MOD) + (p1.y_speed/BALL_SPEED_MOD) - (puck.y_speed/BALL_SPEED_MOD); 101 puck_bounce = 1; 102 } 103 if(((dx * dx) + (dy * dy)) > (dist * dist)){ 104 puck_bounce = 0; 105 } 106 } 107 108 void Bounce2(){ 109 110 const float dx = p2.x - puck.x; 111 const float dy = p2.y - puck.y; 112 const float dist = p2.w + puck.w; 113 114 if(((dx * dx) + (dy * dy)) < (dist * dist)){ 115 puck.x_speed = -(((p2.x + p2.w) - (puck.x + puck.w))/BALL_SPEED_MOD) + p2.x_speed; 116 puck.y_speed = -(((p2.y + p2.w) - (puck.y + puck.w))/BALL_SPEED_MOD) + p2.y_speed; 117 } 118 } 119 120 void MovePlayer(){ 121 122 int mickeyx; 123 int mickeyy; 124 125 get_mouse_mickeys(&mickeyx, &mickeyy); 126 127 if(!(mouse_b & 1) && !(mouse_b & 2)){ 128 p1.x_speed = mickeyx/8; 129 p1.y_speed = mickeyy/8; 130 }else if(mouse_b & 1){ 131 p1.y_speed = 0; 132 if(mickeyx <= 1 && mickeyx >= -1){ 133 p1.x_speed *= 0.99; 134 }else{ 135 p1.x_speed = mickeyx/8; 136 } 137 }else if(mouse_b & 2){ 138 p1.x_speed = 0; 139 if(mickeyy <= 1 && mickeyy >= -1){ 140 p1.y_speed *= 0.99; 141 }else{ 142 p1.y_speed = mickeyy/8; 143 } 144 } 145 p1.x += p1.x_speed; 146 p1.y += p1.y_speed; 147 } 148 149 void DrawStuff(){ 150 151 clear_to_color(buffer, makecol(255, 255, 255)); 152 153 rect( buffer, 20, 60, 619, 420, makecol(255, 0, 0)); 154 rect( buffer, 0, 180, 20, 280, makecol( 0, 0, 0)); 155 rect( buffer, 619, 180, 639, 280, makecol(0, 0, 0)); 156 line( buffer, 320, 60, 320, 420, makecol( 255, 0, 0)); 157 circle( buffer, 320, 240, 80, makecol(0, 128, 255)); 158 draw_sprite(buffer, Puck, puck.x - puck.w, puck.y - puck.w); 159 draw_sprite(buffer, Comp, p2.x - p2.w, p2.y - p2.h); 160 draw_sprite(buffer, Player, p1.x - p1.w, p1.y - p1.h); 161 162 draw_sprite(screen, buffer, 0, 0); 163 } 164 165 int main(int argc, char *argv[]){ 166 167 allegro_init(); 168 install_timer(); 169 install_keyboard(); 170 install_mouse(); 171 set_color_depth(32); 172 set_gfx_mode( GFX_AUTODETECT, 640, 480, 0, 0); 173 174 LOCK_FUNCTION(speed_counter); 175 LOCK_VARIABLE(GameSpeed); 176 install_int_ex(SpeedCounter, BPS_TO_TIMER(90)); 177 178 set_mouse_range(20, 60, 320, 420); 179 set_mouse_speed(32, 32); 180 181 buffer = create_bitmap( 640, 480); 182 Player = load_bitmap("hockey_paddle.bmp", NULL); 183 Comp = load_bitmap("hockey_paddle2.bmp", NULL); 184 Puck = load_bitmap("hockey_puck.bmp", NULL); 185 set_window_title("Air Hockey"); 186 187 SetUp(); 188 while( !key[KEY_ESC]){ 189 while(GameSpeed > 1){ 190 MovePlayer(); 191 HandlePuck(); 192 GameSpeed--; 193 } 194 DrawStuff(); 195 } 196 197 return 0; 198 199 } 200 END_OF_MAIN();

Also, I actually know how to add code tags;D

Ceagon Xylas

My suggestion will solve this. Just replace the word 'walls' with 'paddles.'

Andrei Ellman

Are the puck and the paddle both circular? The subject of the post is "circle - circle collision", but in the code you posted the puck has a width and a height which means it can be a rectangle. I'll assume you meant a circle-circle collision.

A circle is the set of points that is at an exact distance (the radius) from the circle centre point. This means that any point who'se closest distance to the centre is is less than the radius is colliding with the circle. For two moving circles, you just need to find if the closest distance between the two line segments (each line segment is from the initial position of the puck to the position of the puck with the distance traveled during the iteration (velocity * length_of_iteration)) is less than the combined radii of the two circles. Don't forget to take into account that if the puck rebounds off a wall, the line-segment is broken.

AE.

zavirax

haha, ill be coming here when mines done because mines just square at the moment...finally, someone with a similar problem.

And yeah your code is much more confusing and i guess advance than mine but mine kinda works so i dont mind because i know what im doing just dont know how to do it.