Nesse post eu vou compartilhar uma versão do jogo Pong com vocês que usa somente 90 linhas de código.
Para executar o jogo, baixe o código abaixo e salve em um arquivo Pong.java e, considerando que você tenha Java 8, rode:
javac Pong.java
Compila o código Java
java Pong
Roda o jogo.
O código funciona com o play 1 (o retângulo do lado esquerdo) seguindo o mouse e o outro tentando se posicionar de acordo com a bolinha. Desenhamos o jogo em um canvas e usamos uma timeline como "engine". Quando a bolinha ultrassa os limites laterais da tela, resetamos o jogo e damos o ponto para quem está do outro lado. Quando a bolinha ultrapassa os limites, mas extamente na posição de um dos players, trocamos a sua direção - mesma coisa quando a bolinha ultrapassa o topo ou a parte de baixo.
Veja o código!
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.util.Random; | |
import javafx.animation.KeyFrame; | |
import javafx.animation.Timeline; | |
import javafx.application.Application; | |
import javafx.scene.Scene; | |
import javafx.scene.canvas.Canvas; | |
import javafx.scene.canvas.GraphicsContext; | |
import javafx.scene.layout.StackPane; | |
import javafx.scene.paint.Color; | |
import javafx.scene.text.Font; | |
import javafx.scene.text.TextAlignment; | |
import javafx.stage.Stage; | |
import javafx.util.Duration; | |
public class Pong extends Application { | |
private static final int width = 800; | |
private static final int height = 600; | |
private static final int PLAYER_HEIGHT = 100; | |
private static final int PLAYER_WIDTH = 15; | |
private static final double BALL_R = 15; | |
private int ballYSpeed = 1; | |
private int ballXSpeed = 1; | |
private double playerOneYPos = height / 2; | |
private double playerTwoYPos = height / 2; | |
private double ballXPos = width / 2; | |
private double ballYPos = height / 2; | |
private int scoreP1 = 0; | |
private int scoreP2 = 0; | |
private boolean gameStarted; | |
private int playerOneXPos = 0; | |
private double playerTwoXPos = width - PLAYER_WIDTH; | |
public void start(Stage stage) throws Exception { | |
Canvas canvas = new Canvas(width, height); | |
GraphicsContext gc = canvas.getGraphicsContext2D(); | |
Timeline tl = new Timeline(new KeyFrame(Duration.millis(10), e -> run(gc))); | |
tl.setCycleCount(Timeline.INDEFINITE); | |
canvas.setOnMouseMoved(e -> playerOneYPos = e.getY()); | |
canvas.setOnMouseClicked(e -> gameStarted = true); | |
stage.setScene(new Scene(new StackPane(canvas))); | |
stage.show(); | |
tl.play(); | |
} | |
private void run(GraphicsContext gc) { | |
gc.setFill(Color.BLACK); | |
gc.fillRect(0, 0, width, height); | |
gc.setFill(Color.WHITE); | |
gc.setFont(Font.font(25)); | |
if(gameStarted) { | |
ballXPos+=ballXSpeed; | |
ballYPos+=ballYSpeed; | |
if(ballXPos < width - width / 4) { | |
playerTwoYPos = ballYPos - PLAYER_HEIGHT / 2; | |
} else { | |
playerTwoYPos = ballYPos > playerTwoYPos + PLAYER_HEIGHT / 2 ?playerTwoYPos += 1: playerTwoYPos - 1; | |
} | |
gc.fillOval(ballXPos, ballYPos, BALL_R, BALL_R); | |
} else { | |
gc.setStroke(Color.YELLOW); | |
gc.setTextAlign(TextAlignment.CENTER); | |
gc.strokeText("Click to Start", width / 2, height / 2); | |
ballXPos = width / 2; | |
ballYPos = height / 2; | |
ballXSpeed = new Random().nextInt(2) == 0 ? 1: -1; | |
ballYSpeed = new Random().nextInt(2) == 0 ? 1: -1; | |
} | |
if(ballYPos > height || ballYPos < 0) ballYSpeed *=-1; | |
if(ballXPos < playerOneXPos - PLAYER_WIDTH) { | |
scoreP2++; | |
gameStarted = false; | |
} | |
if(ballXPos > playerTwoXPos + PLAYER_WIDTH) { | |
scoreP1++; | |
gameStarted = false; | |
} | |
if( ((ballXPos + BALL_R > playerTwoXPos) && ballYPos >= playerTwoYPos && ballYPos <= playerTwoYPos + PLAYER_HEIGHT) || | |
((ballXPos < playerOneXPos + PLAYER_WIDTH) && ballYPos >= playerOneYPos && ballYPos <= playerOneYPos + PLAYER_HEIGHT)) { | |
ballYSpeed += 1 * Math.signum(ballYSpeed); | |
ballXSpeed += 1 * Math.signum(ballXSpeed); | |
ballXSpeed *= -1; | |
ballYSpeed *= -1; | |
} | |
gc.fillText(scoreP1 + "\t\t\t\t\t\t\t\t" + scoreP2, width / 2, 100); | |
gc.fillRect(playerTwoXPos, playerTwoYPos, PLAYER_WIDTH, PLAYER_HEIGHT); | |
gc.fillRect(playerOneXPos, playerOneYPos, PLAYER_WIDTH, PLAYER_HEIGHT); | |
} | |
} |
Nenhum comentário:
Postar um comentário