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); } }