2013-04-14 3 views
2

Когда он попадает в стену, он просто катится по стене, но я меняю координату y. Кроме того, вы не можете перемещать весла одновременно. Какие-нибудь советы для этого? Должен ли я создать 2 потока?Мяч для понга не отскакивает от стен

Вот функция, где я меняю шнур Y после того, как он попадает в стену.

public void ballMove(){ 
      if(ballStartY+randomBally > jpH){ 
       randomBally -=4; 

      } 
      if(ballStartY+randomBally <0){ 
       randomBally +=4; 
      } 
     } 

Вот полный код

import java.awt.Color; 
import java.awt.Event; 
import java.awt.Graphics; 
import java.util.Random; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyEvent; 
import java.awt.event.KeyListener; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 


public class Pong extends JFrame implements ActionListener{ 

     //implement constants 

     PongPanel pongPanel = new PongPanel(); 

     //JFrame pong x and y coordinates 
     static final int jfpX = 150; 
     static final int jfpY = 20; 

     // JFrame pong width and height 
     static final int jfpW = 800; 
     static final int jfpH = 600; 

     Thread thrd; 

     public static void main(String[] args) { 
       Pong jfp = new Pong(); 
       jfp.setVisible(true); 

     } 

     public Pong(){ 
       setBounds(jfpX,jfpY,jfpW,jfpH); 
       setTitle("Pong"); 
       setResizable(false); 
       setDefaultCloseOperation(EXIT_ON_CLOSE); 
       setBackground(Color.black); 


       add(pongPanel); 
       addKeyListener(pongPanel); 
       thrd = new Thread (pongPanel); 
     thrd.start(); 
     } 

     public void actionPerformed(ActionEvent e) { 

     } 



} 

class PongPanel extends JPanel implements Runnable, KeyListener{ 
     Random random = new Random(); 
     static final int jpW = 800; 
     static final int jpH = 600; 
     int paddleStart = (jpH/2)-35; 
     int paddleStarttwo = (jpH/2)-35; 
     int ballStartX = (jpW/2)-20; 
     int ballStartY = (jpH/2)-20; 
     int ytwo,x,y; 
     int ballD = 30; 
     int paddleW1 = 20; 
     int paddleH1 = 100; 
     int paddleW2 = 20; 
     int paddleH2 = 100; 
     int min = -2; 
     int max = 2; 
     int randomBallx = random.nextInt(max-min+1)+min; 
     int randomBally = random.nextInt(max-min+1)+min; 

     public PongPanel(){ 

     } 

     protected void paintComponent(Graphics g) 
     { 
     super.paintComponent(g); 

     Color ball; 
     Color paddleOne; 
     Color paddleTwo; 
     ball = new Color(255,0,255); 
     paddleOne = new Color(255,0,0); 
     paddleTwo = new Color(0,0,255); 


     g.setColor(ball); 
     g.fillOval(ballStartX+randomBallx,ballStartY+randomBally,ballD,ballD); 

     g.setColor(paddleOne); 
     g.fillRect(20,paddleStart+y,paddleW1,paddleH1); 

     g.setColor(paddleTwo); 
     g.fillRect(760,paddleStarttwo+ytwo,paddleW2,paddleH2); 



     } 
     public void run() { 
       while(true){ 

       randomBall(); 
       ballMove(); 
       repaint(); 
     try {Thread.sleep(75); } catch(Exception e){ 

     }; 

       } 
     } 

     public void randomBall(){ 
      if(randomBallx >=0){ 
       randomBallx=+4; 
      } 
      if(randomBallx<0){ 
       randomBallx-=4; 
      } 
      if(randomBally>=0){ 
       randomBally+=4; 
      } 
      if(randomBally<0){ 
       randomBally-=4; 
      } 
//    randomBallx+=randomBallx; 
//    randomBally+=randomBally; 
     } 
     public void ballMove(){ 
      if(ballStartY+randomBally > jpH){ 
       randomBally -=4; 

      } 
      if(ballStartY+randomBally <0){ 
       randomBally +=4; 
      } 
     } 

     public void keyPressed(KeyEvent e) { 

     if(e.getKeyCode() == KeyEvent.VK_A){ 
       y-=10; 
     } 
     else if(e.getKeyCode() == KeyEvent.VK_S){ 
         y+=10; 
       } 

     if(e.getKeyCode() == KeyEvent.VK_QUOTE){ 
       ytwo-=10; 
     } 
     else if(e.getKeyCode() == KeyEvent.VK_SEMICOLON){ 
         ytwo+=10; 
       } 

     } 



     public void keyTyped(KeyEvent e) { 

     } 

     @Override 
     public void keyReleased(KeyEvent e) { 
       // TODO Auto-generated method stub 

     } 

} 
+1

Эти переменные имена ... о боже, почему ... –

+0

randomY = -случай. Дайте мне знать, если вы хотите получить подробное объяснение, и я приведу вам пример. –

+1

О, я просто посмотрел на ваш код, я считаю, что вы используете неправильного оператора. randomY - = 4 будет читать значение randomY subtract 4, затем сохраняет новое значение в randomY, его то же самое, что и randomY = randomY - 4. Я не думаю, что это то, что вы пытаетесь сделать. Я бы использовал переменные скорости, dx и dy, тогда, когда столкновение происходит в зависимости от стены, либо установите dx = -dx, либо dy = -dy, тогда x + = dx и y + = dy должны всегда держать ваш шар в правильном направлении. –

ответ

0

Вместо того чтобы делать randomBally -=4; и randomBally +=4; вы можете сделать randomBally *=-1. Вместо того, чтобы добавлять к скорости, вы должны умножить скорость на -1, это изменит направление движения.