package projeto;
import static java.lang.Thread.sleep;
//Desenvolvimento do jogo em Java. Data de entrega: 27/09/2019 Nome: Hélder Silva Turma:2171080TIAB Numero do Utilizador: 034832111
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.geom.Rectangle2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
@SuppressWarnings("serial")
public class Projeto extends JFrame {
private class Grafico extends JPanel {
private final Font fonte = new Font("Digiface", Font.BOLD, 70);
@Override // @Override quando utiliza esse comando, ele garante que você não vai sobrescrever o que não herdou.
public void paintComponent(Graphics g) {
final Graphics2D g2d = (Graphics2D) g; // Graphics é a classe fundamental para renderizar formas, textos e imagens.
g2d.setColor(Color.BLACK); // Este codigo faz que o ecrã fica preto ou qualquer cor.
g2d.fillRect(0, 0, getWidth(), getHeight());
g2d.setColor(Color.YELLOW); // Eate codigo é cor do placar.
g2d.setFont(fonte);
g2d.drawString(pontosJogador + " " + pontosAdversario, 310, 100); // Este codigo serve para pontuação do placar
g2d.setColor(Color.LIGHT_GRAY); // Este codigo é a cor da barreira de cima
g2d.fill(new Rectangle2D.Double(40, 20, 700, 20)); // Este codigo serve para coordenado na barreira de cima, tamanho e a forma.
g2d.setColor(Color.LIGHT_GRAY); // Este codigo é a cor da barreira de baixo
g2d.fill(new Rectangle2D.Double(40, 520, 700, 20)); // Este codigo serve para coordenado na barreira de baixo, tamanho e a forma.
g2d.setColor(Color.WHITE); // Este codigo é a cor do meio campo
g2d.fill(new Rectangle2D.Double(400, 40, 5, 480)); // Este codigo serve para coordenado do meio campo, tamanho e a forma.
g2d.setColor(Color.BLUE);
g2d.fillRect(jogador.x, jogador.y, jogador.width, jogador.height); // Este codigo serve para coordenado do teu objeto para jogar, tamanho e a forma.
g2d.setColor(Color.RED);
g2d.fillRect(adversario.x, adversario.y, adversario.width, adversario.height); // Este codigo serve para coordenado do teu adversario para jogar,
// tamanho e a forma.
g2d.setColor(Color.WHITE); // Este codigo é cor da bola.
g2d.fillOval(bola.x, bola.y, bola.width, bola.height); // Este codigo serve para coordenadar a bola e o tamanho da bola.
}
}
public static void main(String[] args) {
Projeto projeto1 = new Projeto();
projeto1.executar();
}
private Point velocidade = new Point(3, 3); // coordenada correspondentes à velocidade dos eixos x e y da bola
private Rectangle bola = new Rectangle(50, 50, 20, 20); // forma da bola
private Rectangle jogador = new Rectangle(40, 100, 20, 100); // forma do jogador
private Rectangle adversario = new Rectangle(720, 100, 20, 100); // forma do adversario
private int pontosJogador = 0;
private int pontosAdversario = 0;
private int vidas = 5;
private int teclaPressionada = 0;
private Grafico grafico;
public void executar() {
criarJanela();
tratarTeclas();
}
private void aguardar() {
try {
sleep(10); // aqui você pode ter que ajustar de acordo com a velocidade de sua máquina
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void criarJanela() { // Este codigo até linha 102 serve para ciar uma Janela para o jogo.
setTitle(" Desenvolvimento do jogo "); // Este codigo serve para dar o nome do titulo.
setSize(800, 600); // Este código é o Tamanho do ecrã. 800 é a largura e 600 é comprimento.
setLocationRelativeTo(null);
setResizable(false);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Este codigo faz que quando fecha o jogo o programa diz que fechou no caso não tiver este codigo faz
// que o programa continua.
setVisible(true); // Este codigo faz que o titulo torna visível.
grafico = new Grafico();
add(grafico);
Timer timer = new Timer(3, event -> jogar()); // Este codigo serve para velocidade da bola.
timer.start();
}
private void jogar() {
moverBola();
verificarJogadaAdversario();
verificarJogadaJogador();
verificarColisaoAdversario();
verificarColisaoJogador();
verificarPontuacao();
grafico.repaint();
aguardar();
}
private void moverBola() {
bola.x += velocidade.x;
bola.y += velocidade.y;
if (bola.y > 500 || bola.y <= 40) {
velocidade.y *= -1;
}
}
private void tratarTeclas() {
addKeyListener(new KeyAdapter() { // Este codigo serve para usar setas cima, baixo, esquerda ou direita para o movimento do objeto ou personagem.
@Override
public void keyPressed(KeyEvent e) {
teclaPressionada = e.getKeyCode();
}
@Override
public void keyReleased(KeyEvent e) {
teclaPressionada = 0;
}
});
}
private void verificarColisaoAdversario() {
if (bola.intersects(adversario)) { // verifica se o adversario bateu na bola
velocidade.x *= -1;
bola.x = adversario.x - bola.width;
}
}
private void verificarColisaoJogador() {
if (bola.intersects(jogador)) { // verifica se o jogador bateu na bola
velocidade.x *= -1;
bola.x = jogador.x + jogador.width;
}
}
private void verificarJogadaAdversario() {
if (bola.x > 400) { // Este codigo serve para o adversario jogar automaticamente. Basicamente é um computador a jogar.
if (bola.y > adversario.y + 50 && adversario.y < 420) {
adversario.y += 3;
}
if (bola.y < adversario.y && adversario.y > 40) {
adversario.y -= 3;
}
}
}
private void verificarJogadaJogador() {
if (teclaPressionada == KeyEvent.VK_UP && jogador.y > 40) {
jogador.y -= 3; // Este codigo serve para mover o tua forma mais rapido nas setas.
} else if (teclaPressionada == KeyEvent.VK_DOWN && jogador.y < 420) {
jogador.y += 3;
}
}
private void verificarPontuacao() {
boolean reposicionarBola = false;
if (bola.x < jogador.x) { // verifica se o jogador deixou a bola passar
pontosAdversario++;
vidas--;
reposicionarBola = true;
}
if (bola.x > (adversario.x + adversario.width)) { // verifica se o adversario deixou a bola passar
pontosJogador++;
reposicionarBola = true;
}
if (reposicionarBola) {
bola.x = 400; // Este codigo serve quando você ou adversário marcam, a bola automaticamente vai para o meio. Basicamente é coordenado do meio campo.
velocidade.x = 5;
}
}
}
Semana passada alguém teve a mesma dúvida.
O autor apagou as mensagens dele, entretanto minha resposta continua lá.
Bons estudos.
Staroski mas pode ajudar me meter obstáculos com esse código por favor. Agredecia imenso e tenha bom dia
Senhor o meu adversário consegue marcar no meu lado e eu não consigo marcar na dele. Mas o senhor podia fazer diferente do que meteu para outro senhor. Um dia deste podia dar aulas de programação para estar preparado mas para frente assim já sei muito conhecimentos. Obrigado
É só ajustar sua lógica.
O adversário vai marcar pontos quando o x
da bola for menor que o x
do jogador.
O jogador vai marcar pontos quando o x
da bola for maior que o (x + largura)
do adversário.
Você também tem que corrigir os erros na implementação do método paintComponents
, pois você está criando várias variáveis diferentes, mas todas apontando para o mesmo objeto g
, está errado.
Senhor tive hoje todo dia a encontrar o erro e nao encontrei podia ajudar me por favor. Senhor gostava saber se o Senhor podia um dia destes dar aulas para ter ja conhecimento mais para frente
senhor vou usar aquele codigo que enviou para outro senhor mas pode ajudar meter o obstaculo por favor