Делаю игру пинг-понг на Java по книге Якова Файна. Код состоит из двух классов и интерфейса (интерфейс игры, движок игры и константы). Игра запускается но единственное что в ней можно делать это управлять ракеткой игрока, обнулять счет игры и при нажатии на кнопку S мячик перерисовывается на ракетку игрока. Мячик не выполняет своей основной функции, его не можно подать, он не перемещается по столу, его можно только перерисовать на ракетку игрока о чем было сказано раньше. Помогите пожалуйста разобраться что не так:
1. Класс PingPongTable
package screens;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.WindowConstants;
import java.awt.Dimension;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Color;
import engine.PingPongEngine;
public class PingPongTable extends JPanel implements GameConstants
{
JLabel label;
public int computerRacket_Y = COMPUTER_RACKET_Y_START;
private int kidRacket_Y = KID_RACKET_Y_START;
private int ballX = BALL_START_X;
private int ballY = BALL_START_Y;
Dimension preferredSize = new Dimension(TABLE_WIDTH, TABLE_HEIGHT);
public Dimension getPreferredSize()
{
return preferredSize;
}
PingPongTable()
{
PingPongEngine gameEngine = new PingPongEngine(this);
addKeyListener(gameEngine);
addMouseMotionListener(gameEngine);
}
void addPaneltoFrame(Container container)
{
container.setLayout(new BoxLayout(container, BoxLayout.Y_AXIS));
container.add(this);
label = new JLabel("Press N for a new game, S to serve or Q to quit");
container.add(label);
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.GREEN);
g.fillRect(0,0,TABLE_WIDTH,TABLE_HEIGHT);
g.setColor(Color.yellow);
g.fillRect(KID_RACKET_X, kidRacket_Y, RACKET_WIDTH, RACKET_LENGTH);
g.setColor(Color.blue);
g.fillRect(COMPUTER_RACKET_X, computerRacket_Y, RACKET_WIDTH, RACKET_LENGTH);
g.setColor(Color.red);
g.fillOval(ballX, ballY, 10, 10);
g.setColor(Color.white);
g.drawRect(10, 10, 300, 200);
g.drawLine(160, 10, 160, 210);
requestFocus();
}
public void setKidRacket_Y(int yCoordinate)
{
this.kidRacket_Y = yCoordinate;
repaint();
}
public int getKidRacket_Y()
{
return kidRacket_Y;
}
public void setComputerRacket_Y(int yCoordinate)
{
this.computerRacket_Y = yCoordinate;
repaint();
}
public void setMessageText(String text)
{
label.setText(text);
repaint();
}
public void setBallPosition(int xPos, int yPos)
{
ballX = xPos;
ballY = yPos;
repaint();
}
public static void main(String[] args)
{
JFrame f = new JFrame("Ping Pong Green Table");
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
PingPongTable table = new PingPongTable();
table.addPaneltoFrame(f.getContentPane());
f.setBounds(0, 0, TABLE_WIDTH+5, TABLE_HEIGHT+40);
f.setVisible(true);
}
}
2. Интерфейс GameConstants
package screens;
public interface GameConstants
{
public final int TABLE_WIDTH = 320;
public final int TABLE_HEIGHT = 220;
public final int KID_RACKET_Y_START = 100;
public final int KID_RACKET_X = 300;
public final int TABLE_TOP = 12;
public final int TABLE_BOTTOM = 180;
public final int RACKET_INCREMENT = 2;
public final int COMPUTER_RACKET_X = 15;
public final int COMPUTER_RACKET_Y_START = 100;
public final int BALL_START_X = TABLE_WIDTH/2;
public final int BALL_START_Y = TABLE_HEIGHT/2;
public final int BALL_INCREMENT = 4;
public final int BALL_MIN_X = 1 + BALL_INCREMENT;
public final int BALL_MIN_Y = 1 + BALL_INCREMENT;
public final int BALL_MAX_X = TABLE_WIDTH - BALL_INCREMENT;
public final int BALL_MAX_Y = TABLE_HEIGHT - BALL_INCREMENT;
public final int RACKET_LENGTH = 30;
public final int RACKET_WIDTH = 5;
public final int SLEEP_TIME = 10;
public final int WINNING_SCORE = 21;
}
3. Класс PingPongEngine
package engine;
import java.awt.event.MouseEvent;
import java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseMotionListener;
import screens.*;
public class PingPongEngine implements Runnable, KeyListener, MouseMotionListener, GameConstants
{
private PingPongTable table;
private int kidRacket_Y = KID_RACKET_Y_START;
private int computerRacket_Y = COMPUTER_RACKET_Y_START;
private int kidScore;
private int computerScore;
private int ballX;
private int ballY;
private boolean movingLeft = true;
private boolean ballServed = false;
public int verticalSlide;
public PingPongEngine(PingPongTable greenTable)
{
table = greenTable;
Thread worker = new Thread(this);
worker.start();
}
public void mouseDragged(MouseEvent e) {}
public void mouseMoved(MouseEvent e) {
int mouse_Y = e.getY();
if (mouse_Y < kidRacket_Y && kidRacket_Y > TABLE_TOP)
{
kidRacket_Y -= RACKET_INCREMENT;
}
else if (kidRacket_Y < TABLE_BOTTOM)
{
kidRacket_Y += RACKET_INCREMENT;
}
table.setKidRacket_Y(kidRacket_Y);
}
public void keyPressed(KeyEvent e)
{
char key = e.getKeyChar();
if('n'==key || 'N'==key)
{
startNewGame();
}
else if('q'==key || 'Q'==key)
{
endGame();
}
else if('s'==key || 'S'==key)
{
kidServe();
}
}
public void keyReleased(KeyEvent e) {}
public void keyTyped(KeyEvent e) {}
public void startNewGame()
{
computerScore = 0;
kidScore = 0;
table.setMessageText("Score Computer: 0 Kid Score: 0");
kidServe();
}
public void endGame()
{
System.exit(0);
}
public void run()
{
boolean canBounce = false;
while(true)
{
if(ballServed)
{
if(movingLeft && ballX > BALL_MIN_X)
{
canBounce = (ballY >= computerRacket_Y && ballY < (computerRacket_Y + RACKET_LENGTH)?true: false);
ballX -= BALL_INCREMENT;
ballY -= verticalSlide;
table.setBallPosition(ballX, ballY);
if(ballX <= COMPUTER_RACKET_X && canBounce)
{
movingLeft = false;
}
}
if(!movingLeft && ballX <= BALL_MAX_X)
{
canBounce = (ballY >= kidRacket_Y && ballY < (kidRacket_Y + RACKET_LENGTH)?true: false);
ballX += BALL_INCREMENT;
table.setBallPosition(ballX, ballY);
if(ballX > KID_RACKET_X && canBounce)
{
movingLeft = true;
}
}
if(computerRacket_Y < ballY && computerRacket_Y < TABLE_BOTTOM)
{
computerRacket_Y += RACKET_INCREMENT;
}
else if(computerRacket_Y > TABLE_TOP)
{
computerRacket_Y -= RACKET_INCREMENT;
}
table.setComputerRacket_Y(computerRacket_Y);
try
{
Thread.sleep(SLEEP_TIME);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
if(isBallOnTheTable())
{
if(ballX > BALL_MAX_X)
{
computerScore++;
displayScore();
}
else if(ballX < BALL_MIN_X)
{
kidScore++;
displayScore();
}
}
}
}
}
private void kidServe()
{
ballServed = true;
ballX = KID_RACKET_X - 1;
ballY = kidRacket_Y;
if(ballY > TABLE_HEIGHT/2)
{
verticalSlide = -1;
}
else
{
verticalSlide = 1;
}
table.setBallPosition(ballX, ballY);
table.setKidRacket_Y(kidRacket_Y);
}
private void displayScore()
{
ballServed = false;
if(computerScore == WINNING_SCORE)
{
table.setMessageText("Computer won! "+computerScore + ":" + kidScore);
}
else if(kidScore == WINNING_SCORE)
{
table.setMessageText("You won! "+kidScore + ":" + computerScore);
}
else
{
table.setMessageText("Computer: "+computerScore + " Your Score: "+ kidScore);
}
}
private boolean isBallOnTheTable()
{
if(ballY >= BALL_MIN_Y && ballY <= BALL_MAX_Y)
{
return true;
}
else {return false;}
}
}
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Уважаемые товарищи, у меня просто ужас, а не ситуацияНе могу понять битый час в чём проблема, больше напоминает проблемы с софтом и/или компьютером
Пытаюсь сделать это следующим образом:
Скачал package "Script" для Atom, но при запуске Java кода в консоли выдает это: https://prntsc/gtyl2i Подскажите, как исправить?
Как правильно перенести значения от 1 до 8 с массива A в массив С через массив B? Переносить по одному значению так, чтобы минимальное значение...