Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Cronicle8

ping pong

Recommended Posts

Bom dia caros amigos!

então é assim eu preciso de fazer um jogo em pascal! que é o ping-pong!

e que dê a dois jugadores 1-player (w-andar com barra para cima !!! s- andar com barra para baixo)2-player(seta UP-andar pra cima!!! seta Down- andar pra baixo)

Gostava que me dessem uma ajuda como fazê-lo toda a ajuda será agradecida!

PS

Ainda não comecei o programa porque preciso de um pequena ajuda para comeca-lo!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ei amigo, há uns tempos atrás consegui na internet um exemplo simples desse tipo de jogo, onde o usuário joga contra o PC (invencível). Utiliza-se Backbuffer, que é uma tela virtual onde você cria as imagens e depois as imprime na tela exibida para o usuário.

O código está logo abaixo e as imagens são todas pegas de arquivos .bmp externos. Dê uma estudada e altere-o como quiser.


type
//objeto que contém as informaçoes sobre a bolinha
TBall = record
//posiçao no plano do jogo
X,Y: Single;
//largura e altura da bolinha
W,H: Integer;
//velocidade vertical e horizontal
//(determina a direção - angulo - da bolinha)
Vx, Vy: Single;
//velocidade da bolinha
Speed: Single;
end;


//objeto que contém as informações da barrinha da AI (PC)
TCPUBar = record
//posiçao da barrinha no plano do jogo
X,Y: Single;
//largura e altura
W,H: Integer;
//velocidade máxima da barrinha
Speed: Single;
end;

//objeto que conté, as informações da barrinha do jogador
TPlayerBar = record
//posiçao da barrinha no plano do jogo
X,Y : Single;
//largura e altura
W,H: Integer;
end;

var
Form1: TForm1;

{variaveis que manipulam dados dos records}
ball: TBall;
bar_cp: TCPUBar;
bar_p1: TPlayerBar;

{indica se o jogo está pausado ou não}
paused: boolean = true;

{pontos do jogador}
score_p1: Integer = 0;

{pontos da AI}
score_cp: Integer = 0;

{buffer de desenho do jogo (backbuffer) }
bbuffer: TBitmap;

{matriz de bitmaps do jogo}
bitmaps: array of TBitmap;
//Declaramos uma matriz de bitmaps para carregar todas as imagens do jogo
//para a memória

implementation

{$R *.dfm}

{funcao que toca sons}
procedure TocaWave(som: String);
begin
SndPlaySound(PChar(som), SND_ASYNC);
//SND_ASYNC indica pro windows que é pra executar som sem interromper
//as aplicacoes rodando, no caso, o jogo. Temos que converter o nome
//do arquivo para PChar porque é isso o que a função entende!
end;

//função que carrega as imagens pra matriz
procedure loadImage(imagem: string);
begin
//aloca um novo espaço na memória para a imagem
//como aqui estamos usando matrizes dinâmicas
//fica bem fácil fazer isso.
SetLength(bitmaps, Length(bitmaps) + 1);
//cria e carrega a imagem
bitmaps[high(bitmaps)]:= TBitmap.Create;
with bitmaps[high(bitmaps)] do
begin
//carrega o arquivo do disco pra memória
LoadFromFile(imagem);
//adiciona a transparência
Transparent:= True;
//modifica a cor de transparência para magenta
TransparentColor:= clFuchsia;
end;
end;

//função que libera todos os bitmaps da matriz
procedure freeBitmaps;
Var
i:integer;
begin
//percorre toda a matriz
for i:=0 to High(bitmaps) do
begin
//libera o bitmap da memória
FreeAndNil(bitmaps[i]);
end;
//libera o espaço alocado para a matriz
bitmaps:= nil;
end;

procedure LoadGameGraphics;
begin
//carrega todas as imagens do jogo
LoadImage('0.bmp');
LoadImage('1.bmp');
LoadImage('2.bmp');
LoadImage('3.bmp');
LoadImage('4.bmp');
LoadImage('5.bmp');
LoadImage('6.bmp');
LoadImage('7.bmp');
LoadImage('8.bmp');
LoadImage('9.bmp');
LoadImage('ball.bmp');
LoadImage('bar.bmp');
LoadImage('cpu.bmp');
LoadImage('cts_text.bmp');
LoadImage('field.bmp');
LoadImage('player.bmp');
end;


{funçao que inicia o jogo e reseta as variáveis}
procedure InitGame();
begin
//pausa o jogo
paused:= True;
//reseta a bosiçao da bolinha
Ball.X:= 37 + ((566 - Ball.W) / 2);
Ball.Y:= 77 + ((366 - Ball.H) / 2);
//reseta a velocidade e direcao da bolinha
Ball.Speed:= 8;
Ball.Vx:= 0.5;
Ball.Vy:= 0.5;
//reseta a posicao da barrinha do jogador
Bar_p1.X:= 57;
Bar_p1.Y:= 77 + ((366 - bar_p1.H) / 2);
//reseta a posiçao da barrinha da AI
Bar_cp.X:= 577;
Bar_cp.Y:= bar_p1.Y;
end;

{funcao que verifica as colisoes da bolinha}
procedure ball_check_collision();
Var
bt: Single;
begin
//distância da bolinha até o topo do cenário
bt:= 77 + ball.H / 2;

//verifica se a bolinha colidiu com o topo do cenário
if ball.Y < bt then
begin
//reflete a bolinha com o mesmo angulo
ball.Vy:= -ball.Vy;
//move um pouco a bolinha para evitar outras colisões
ball.Y:= bt + (bt - ball.Y);
end;

//distância da bolinha até o fundo do cenário
bt:= 77 + 366 - ball.H - 6;

//verifica se colidiu com o fundo do cenário
if ball.Y > bt then
begin
//reflete a bolinha com o mesmo ângulo
ball.Vy:= -ball.Vy;
//move um pouco a bolinha para evitar outras colisões
ball.Y:= bt - (ball.Y - bt);
end;

//distância da bolinha até a barrinha do jogador
bt:= bar_p1.X + bar_p1.W - (ball.W / 2);

//verifica se a bolinha colidiu com a barrinha do jogador
if (ball.X < bt) and ((ball.Y >= bar_p1.Y) and (ball.Y + ball.H < bar_p1.Y + bar_p1.H)) then
begin
//reflete a bolinha com o mesmo angulo
ball.Vx:= -ball.Vx;
//aumenta a velocidade da bolinha
ball.Speed:= ball.Speed + 0.5;
//move um pouco a bolinha para evitar colisões
ball.X:= bt + (bt - ball.X);
end;

//distância da bolinha até a barrinha da AI
bt:= bar_cp.X - ball.w + (ball.w / 2);

//verifica se a bolinha colidiu com a barrinha da AI
if (ball.x > bt) and ((ball.y >= bar_cp.y) and (ball.y + ball.h < bar_cp.Y + bar_cp.h)) then
begin
//reflete a bolinha com o mesmo ângulo
ball.Vx:= -ball.Vx;
//aumenta a velocidade da bolinha
ball.Speed:= ball.Speed + 0.5;
//move um pouco a bolinha para evitar colisões
ball.x:= bt - (ball.x - bt);
end;

//verifica se a bolinha saiu à esquerda
if ball.x < 37 + 6 then
begin
//ponto da AI
Inc(score_cp);
//reinicia o jogo
InitGame();
end;

//verifica se a bolinha saiu à direita
if ball.X + ball.w > 37 + 566 - 6 then
begin
//ponto do jogador
Inc(score_p1);
//reinicia o jogo
InitGame;
end;
end;

{funçao que move a bolinha de acordo com o angulo e velocidade}
procedure ball_move();
begin
//move a bolinha no eixo x (horizontal)
ball.X := ball.X + ball.Vx * ball.Speed;
//move a bolinha no eixo y (vertical)
ball.Y := ball.Y + ball.Vy * ball.Speed;
end;

{funcao que controla a AI}
procedure bar_cp_handle();
begin
//se for possível chegar à bolinha nesse frame
if abs(ball.Y - bar_cp.Y) <= bar_cp.Speed then
//move a barrinha para a posição da bolinha
bar_cp.Y:= ball.Y
else
//do contrario, move a barrinha na direcao da bolinha
//mas apenas o que a velocidade permite neste frame
bar_cp.Y:= bar_cp.Y + (bar_cp.Speed * (ball.Y - bar_cp.Y)) / abs(ball.Y - bar_cp.Y);

//verifica se abarrinha da AI passou dos limites do cenário e coloca de volta
if bar_cp.Y + bar_cp.H > 77 + 366 then
bar_cp.Y:= 77+ 366 - bar_cp.H;
if bar_cp.Y < 77 then
bar_cp.Y:= 77;
end;

{funcao que desenha os pontos dos jogadores usando a imagem dos numeros do jogo}
procedure CreateScore(x, y, Score: Integer);
Var
i,d: Integer; //variaveis de controle do laço
s: string; //string com pontuaçao a ser desenhada
begin
//transforma a pontuação em string (para percorrer os caracteres)
s:= IntToStr(Score);
//o máximo de pontos é 9999 (4 caracteres), se a string com os pontos
//tiver menos de 4 caracteres, preenche os espaços com zero
d:= 4 - Length(s);
for i:=0 to d -1 do
begin
//desenha a imagem do 0 no backbuffer
bbuffer.Canvas.Draw(x, y, bitmaps[0]);
//aumenta a posição x para o próximo caracter
Inc(x, 24);
end;
//desenha os caracteres na string dos pontos
for I:= 1 to Length(s) do
begin
//desenha o caracter no backbuffer
bbuffer.Canvas.Draw(x, y, bitmaps[StrToInt(s[i])]);
//aumenta a posicao x para o próximo caracter
Inc(X, 24);
end;
end;


procedure TForm1.FormClick(Sender: TObject);
begin
paused:= not paused;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
//move a barrinha do jogador para a posição do mouse
bar_p1.Y:= y;

//verifica se a barrinha do jogador passou dos limites do cenário
//e coloca ela de volta nos limites do cenário
if bar_p1.Y + bar_p1.h > 77 + 366 then
bar_p1.y:= 77 + 366 - bar_p1.H;
if bar_p1.Y < 77 then
bar_p1.y:= 77;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
//quando o form for criado carregamos as imagens...
LoadGameGraphics;
//cria e inicializa o backbuffer
bbuffer:= TBitmap.Create;
bbuffer.Width:= 640;
bbuffer.Height:= 480;
bbuffer.Canvas.Brush.Color:= clBlack;
//inicializa algumas variáveis da bolinha
Ball.W:= 15;
Ball.H:= 15;
//inicializa algumas variáveis da barrinha do jogador
Bar_p1.W:= 10;
Bar_p1.H:= 80;
//inicializa algumas variáveis da barrinha da AI
Bar_cp.W:= 10;
Bar_cp.H:= 80;
Bar_cp.Speed:= 15;
//inicia o jogo
InitGame();
//inicia o som de fundo
// MediaPlayer1.FileName:= 'win.wav';
// MediaPlayer1.Open;
// MediaPlayer1.Play;

//habilita o timer do jogo
Timer1.Enabled:= true;
//habilita o timer de controle da música
// Timer2.Enabled:= True;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
//quando o form for destruído liberamos as imagens
freeBitmaps;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
{Aqui é controlado o loop principal do jogo}
{
aqui é analisada as informaçoes do jogo e mover objetos;
verificar as entradas do usuário e processá-las no jogo (mover a barrinha);
verificar colisões com a barrinha ou o cenário;
desenhar os objetos no backbuffer;
desenhar o backbuffer na tela;
}
if not paused then begin
//verifica colisoes da bolinha
ball_check_collision();
//move a bolinha
ball_move();
//controla a AI da barrinha do computador
bar_cp_handle();
end;

//limpa a tela anterior para desenharmos a nova tela
bbuffer.Canvas.FillRect(Rect(0,0,640,480));

//desenha o fundo do jogo
bbuffer.Canvas.Draw(37,77, bitmaps[14]);

//pontuação do jogador (texto)
bbuffer.Canvas.Draw(37,10, bitmaps[15]);
//chama a funçao que cria a imagem da pontuação
CreateScore(191,17, score_p1);
//pontuaçao da AI (texto)
bbuffer.canvas.Draw(424,10, bitmaps[12]);
//chama a funçao que cria a imagem da pontuação
CreateScore(507,17, score_cp);

//Desenha a barrinha do jogador
bbuffer.Canvas.Draw(Round(bar_p1.X), Round(bar_p1.Y), bitmaps[11]);
//Desenha a barrinha da AI
bbuffer.Canvas.Draw(Round(bar_cp.X), Round(bar_cp.Y), bitmaps[11]);
//Desenha a bolinha
bbuffer.Canvas.Draw(Round(ball.X), Round(ball.Y), bitmaps[10]);

//temos uma imagem para indicar que o jogo está
//parado, então, caso esteja desenhamos a imagem
if paused then
bbuffer.Canvas.Draw(156,240, bitmaps[13]);

//finalmente envia tudo isso pra tela
Canvas.Draw(0,0, bbuffer);
end;

procedure TForm1.Timer2Timer(Sender: TObject);
begin
//se nao estiver tocando a musica...
if MediaPlayer1.Mode = mpStopped then
MediaPlayer1.Play;
end;

end.

Qualquer dúvida entre em contato.

post-311052-13884954264171_thumb.jpg

post-311052-1388495426436_thumb.jpg

post-311052-13884954264504_thumb.jpg

post-311052-13884954264548_thumb.jpg

post-311052-13884954264598_thumb.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×