мячик для понга не отскакивает от стен

Когда он ударяется о стену, он просто катится по стене, но я меняю координату 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

        }

}

person Werg Asdfwer    schedule 14.04.2013    source источник
comment
Эти имена переменных... о боже, почему...   -  person Joe Frambach    schedule 14.04.2013
comment
случайныйY = -случайныйY. Дайте мне знать, если вам нужно подробное объяснение, и я напечатаю для вас пример.   -  person Kevin Bigler    schedule 14.04.2013
comment
О, я только что посмотрел на ваш код, я думаю, вы используете не тот оператор. randomY -= 4 собирается прочитать значение randomY, вычесть 4, а затем сохранить новое значение в randomY, это то же самое, что и randomY = randomY - 4. Я не думаю, что это то, что вы пытаетесь сделать. Я бы использовал переменные скорости, dx и dy, тогда, когда происходит столкновение, в зависимости от стены либо установите dx = -dx, либо dy = -dy, тогда x += dx и y += dy всегда должны поддерживать движение вашего мяча в правильном направлении.   -  person Kevin Bigler    schedule 14.04.2013
comment
Я думаю, что randomX и randomY - это дельты. Я не могу сказать. Плохо названные переменные..   -  person Joe Frambach    schedule 14.04.2013
comment
Переместите мяч, чтобы определить, столкнулся ли он со зданием или покинул его. Использование какой-либо дельты для определения объема движения   -  person MadProgrammer    schedule 15.04.2013


Ответы (1)


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

person Varun Munagala    schedule 01.01.2018