Click here to Skip to main content
15,896,118 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
Hi everyone. We have a project which is given by our lecturer and we don't move on this project. Firstly our game : www.miniclip.com/games/fat-slice/tr/
Our primary programming language is C. We codified ball function but there is a some mistakes. We don't fix it and carry out the idea to cutting function. We use alleg.lib and work on Visual C++ 2010
Express.We don't have an idea about ball's moving after cutting the image. Balls move as - no vertical no horizontal - cross. They move on different places
and different way. They pass through each other and they are flicker.Double buffering doesn't work that there is two ball on the screen. Can you help us?

C++
#include <allegro.h>
 
void Baslat();
void Bitir();
void moveBall()
 
int main() {
Baslat();
while (!key[KEY_ESC]) {
 
int width = 220;//width of box
int height = 440;//height of box
int radius = 5;//radius of ball

int x = 110;//initial position of ball
int y = 220;//initial position of ball

int tempX;
int tempY;

//Keep track of direction of motion here.
//0= northwest 1 = southwest, 2 = northeast,
//3 = southeast
int dir;
moveBall();

}
Bitir();
return 0;
}
END_OF_MAIN()
 
void Baslat() {
int depth, res;
allegro_init();
depth = desktop_color_depth();
if (depth == 0) depth = 32;
set_color_depth(depth);
res = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
if (res != 0) {
allegro_message(allegro_error);
exit(-1);
}
install_timer();
install_keyboard();
install_mouse();
 
}
void Bitir() {
clear_keybuf();
 
}
void moveBall(){
  //Save current location of ball.
  tempX = x;
  tempY = y;

  switch(dir){
    case 0:
      //Direction is northwest.
      if((x <= radius) || (y <= radius)){
        //Ball has collided with either the left wall or
        // the top wall.
        //Get a new direction. Note that if the new
        // direction is the same as the old one, control
        // will come back to here to get still another
        // direction the next time the functionis called.
        dir = rand() % 4;
      }else{
        //No collision, set new location for the ball
        --x;
        --y;
      }//end else
    break;
    case 1:
      //Direction is southwest.
      if(((x <= radius) || (y >= (height - radius)))){
        //get a new direction
        dir = rand() % 4;
      }else{
        //set new location for the ball
        --x;
        ++y;
      }//end else
    break;
    case 2:
      //Direction is northeast.
      if(((x >= (width - radius)) || (y <= radius))){
        //get a new direction
        dir = rand() % 4;
      }else{
        //set new location for the ball
        ++x;
        --y;
      }//end else
    break;
    case 3:
      //Direction is southeast
      if((((x >= (width - radius)) ||
                              (y >= (height - radius))))){
        //get a new direction
        dir = rand() % 4;
      }else{
        //set new location for the ball
        ++x;
        ++y;
      }//end else

  }//end switch 



This is not working exactly. We have some problems that cutting shape and bouncing ball. We make bouncing ball but the ball is flicker. Double buffering is not work on it. Our another problem is that two balls ,which are in the shape, through pass each other. How can we fix that?
So our another problem - i think it is a big problem - that we don't cut the shape. What can we do to make it?








We don't have an idea about slicing the shape. Can you help us? And you send the function better than that
We hurry up because we should finish this project in 6 days.

Note : We are using Allegro v4.2.3.

Is there someone who help us with a simple codes?

[edit]Code block added - OriginalGriff[/edit]
Posted
Updated 21-Apr-13 4:40am
v2

There is an interesting tutorial for a simple physics engine[^] that includes moving, colliding balls. Check it out, it comes with great explanations and code.
 
Share this answer
 
For collision between 2 spheres, here's the first link[^] I got from a google search for '2D ball Physics'.

The collision checks you have for the ball with the container checks only for a rectangular container. You should implement the container as a polygon. Maybe a structure which contains a list of lines which make up the edges of the polygon and keeps tab of the winding order[^].

Once you have this set up, you can check for collision with the edges using basic 2D circle - line collision[^].

Finally, the code to handle the collision, takes a random direction if the ball collides with an edge. This seems incorrect. The resultant motion vector should be computed from the circle-line collision algorithm. A couple more links from google are here[^] and here[^].

I hope this helps.
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900