Hello y'all,
I'm making a Pinball game but I got one problem, I don't know how I can let the Ball bounce back from the paddle.
Ball.class:
And a part of the world:
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.awt.Color;
public class Ball extends Actor
{
double x,y,a=0,b=0,ang,angN,mag,angx,angy,magG;
int numAng=0;
protected void addedToWorld(World world){
x=getX();
y=getY();
if(x>890 || x<10 || y>600 || y<10){
getWorld().removeObject(this);
return;
}
for(int f=0;f<360;f=f+5){
if(!isColor(getX(),getY())){
numAng++;
angx=angx+getX();
angy=angy+getY();
}
}
if(numAng!=0)getWorld().removeObject(this);
}
public void act()
{
x=x+a;
y=y+b;
if(y>595){
getWorld().removeObject(this);
return;
}
numAng=0;
angx=0;
angy=0;
for(int f=0;f<360;f=f+10){
if(!isColor((int)(x+5*Math.cos((f/180.0)*Math.PI)),(int)(y+5*Math.sin((f/180.0)*Math.PI)))){
numAng++;
angx=angx+Math.cos((f/180.0)*Math.PI);
angy=angy+Math.sin((f/180.0)*Math.PI);
}
}
for(int f=0;f<360;f=f+10){
Actor actor = getOneIntersectingObject(Versnelling.class);
if(actor != null){
numAng++;
angx=angx+Math.cos((f/180.0)*Math.PI);
angy=angy+Math.sin((f/180.0)*Math.PI);
}
}
if(numAng>3){
while(numAng>20 && !Greenfoot.isKeyDown("c")){
numAng=0;
x=x-.1*angx;
y=y-.1*angy;
angx=0;
angy=0;
for(int f=0;f<360;f=f+10){
if(!isColor((int)(x+5*Math.cos((f/180.0)*Math.PI)),(int)(y+5*Math.sin((f/180.0)*Math.PI)))){
numAng++;
angx=angx+Math.cos((f/180.0)*Math.PI);
angy=angy+Math.sin((f/180.0)*Math.PI);
}
}
}
while(numAng!=0 && !Greenfoot.isKeyDown("c")){
numAng=0;
y=y-.1*angy;
x=x-.1*angx;
for(int f=0;f<360;f=f+5){
if(!isColor((int)(x+5*Math.cos((f/180.0)*Math.PI)),(int)(y+5*Math.sin((f/180.0)*Math.PI)))){
numAng++;
}
}
}
x=x-.1*a;
y=y-.1*b;
angN = Math.PI/2.0 + Math.atan2(angy,angx);
mag = Math.sqrt(a*a + b*b);
if(mag>.7)mag=mag-.5;
ang = Math.atan2(b,a);
if(Math.abs(angN-ang)<.7){
angN = angN-.05;
if(angN<ang)angN=angN+.1;
}
ang = -(ang-angN)+angN;
a = mag*Math.cos(ang)*(.3 + .7*Math.abs(Math.cos(angN)));
b = mag*Math.sin(ang)*(.3 + .7*Math.abs(Math.sin(angN)));
magG = Math.sin(angN);
if(angN>Math.PI/2.0 && angN<3*Math.PI/2.0){
a = a + magG*Math.cos(angN);
b = b + magG*Math.sin(angN);
}
a= (int)(a*40)/40.0;
b= (int)(b*40)/40.0;
if(Math.abs(a)<.01)a=Math.random()/10.0-.05;
}else {
if(Math.sqrt(a*a + (b+.1)*(b+.1)) < 8)b=b+.1;
}
setLocation((int)x,(int)y);
}
public boolean isColor(int X,int Y){
return ((Kast)getWorld()).isColor(X,Y);
}
}
import greenfoot.*;
import java.awt.Color;
/**
* The BrickWorld
*/
public class Kast extends World {
private static int SizeX = 900;
private static int SizeY = 600;
GreenfootImage background = getBackground();
/**
* Nieuwe Kast
*/
public Kast() {
super(SizeX, SizeY, 1);
GreenfootImage background = getBackground();
background.setColor(Color.BLACK);
background.fill();
createStars(500);
createOvals(15);
drawLine();
addObject(new Start(), 225, 120);
addObject(new Ball(), 225, 100);
addObject(new Links(), 360, 520);
addObject(new Rechts(), 550, 520);
addObject(new Versnelling(), 450, 300);
}
/**
* sets the background color
*/
public void setColor (Color color) {
GreenfootImage background = new GreenfootImage(20,20);
background.setColor(color);
background.fill();
setBackground(background);
}
private void createStars(int number)
{
GreenfootImage background = getBackground();
for (int i = 0; i < number; i++)
{
int x = Greenfoot.getRandomNumber( getWidth() );
int y = Greenfoot.getRandomNumber( getHeight() );
background.setColor(new Color(
Greenfoot.getRandomNumber(255),
Greenfoot.getRandomNumber(255),
Greenfoot.getRandomNumber(255)
));
background.fillOval(x, y, 2, 2);
}
}
/**
* Crete a given number of stars in space.
*/
private void createOvals(int number)
{
GreenfootImage background = getBackground();
for (int i = 0; i < number; i++)
{
int x = Greenfoot.getRandomNumber( getWidth() );
int y = Greenfoot.getRandomNumber( getHeight() );
background.setColor(new Color(255,255,255));
background.fillOval(x, y, 25, 10);
}
}
//some code
public boolean isColor(int a,int b){
return background.getColorAt(a,b).equals(Color.BLACK);
}
}

