Added Pong Demo

This commit is contained in:
Armando Rivera 2013-11-09 00:20:42 -05:00
parent 97dc1c3daf
commit ac1a12ce0b
3 changed files with 220 additions and 0 deletions

7
SDL2/pong/Readme.txt Normal file
View File

@ -0,0 +1,7 @@
Simple PONG Demo
W and S control the left paddle
Arrow Up and Arrow Down control the right paddle
Q quits the game

1
SDL2/pong/compile.txt Normal file
View File

@ -0,0 +1 @@
g++ pong.cpp $(sdl2-config --libs --cflags) -ldl -o pong

212
SDL2/pong/pong.cpp Normal file
View File

@ -0,0 +1,212 @@
#include "../../jade.h"
#include "../sdl2.inc"
#include <SDL.h>
MAIN
/* Variable declarations, SDL2 initialization */
Init(SDL_INIT_VIDEO);
DIM AS PWINDOW window;
DIM AS PRENDERER renderer;
DIM AS BOOL p1_up = false;
DIM AS BOOL p1_down = false;
DIM AS BOOL p2_up = false;
DIM AS BOOL p2_down = false;
DIM AS INT p1_y = 199;
DIM AS INT p2_y = 199;
DIM AS INT p1_vel = 0;
DIM AS INT p2_vel = 0;
DIM AS BOOL quit = false;
DIM AS INT ball_x = 639 / 2;
DIM AS INT ball_y = 479 / 2;
DIM AS INT ball_w = 8;
DIM AS INT ball_h = 8;
DIM AS INT ball_x_vel = 5;
DIM AS INT ball_y_vel = 0;
DIM AS INT delay = 30;
DIM AS INT p1_score = 0;
DIM AS INT p2_score = 0;
DIM AS INT BALL_WIDTH = 10;
DIM AS INT BALL_HEIGHT = 10;
CONSTANT INT Y_MIN = 0;
CONSTANT INT Y_MAX = 399;
CONSTANT INT P1_X = 0;
CONSTANT INT P2_X = 629;
CONSTANT INT VEL_POS = 10;
CONSTANT INT VEL_NEG = 0 - VEL_POS;
window = CreateWindow("Pong",
SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED,
640,
480,
SDL_WINDOW_SHOWN);
renderer = CreateRenderer(window, -1, 0);
PRINT("Press Q to quit.");
/* Main Game Loop */
WHILE (NOT quit) BEGIN
EVENT event;
WHILE (PollEvent(ADDR event)) BEGIN
SELECT (event.type) BEGIN
CASE KEYDOWN:
SELECT (event.key.keysym.sym) BEGIN
CASE SDLK_w:
p1_vel = VEL_NEG;
ENDCASE
CASE SDLK_s:
p1_vel = VEL_POS;
ENDCASE
CASE SDLK_UP:
p2_vel = VEL_NEG;
ENDCASE
CASE SDLK_DOWN:
p2_vel = VEL_POS;
ENDCASE
CASE SDLK_q:
quit = true;
ENDCASE
CASE SDLK_EQUALS:
delay++;
ENDCASE
CASE SDLK_MINUS:
IF (delay > 1) delay--;
ENDCASE
CASE_ELSE:
ENDCASE
ENDSELECT
ENDCASE
CASE KEYUP:
SELECT (event.key.keysym.sym) BEGIN
CASE SDLK_w:
IF (p1_vel == VEL_NEG) p1_vel = 0;
ENDCASE
CASE SDLK_s:
IF (p1_vel == VEL_POS) p1_vel = 0;
ENDCASE
CASE SDLK_UP:
IF (p2_vel == VEL_NEG) p2_vel = 0;
ENDCASE
CASE SDLK_DOWN:
IF (p2_vel == VEL_POS) p2_vel = 0;
ENDCASE
CASE_ELSE:
ENDCASE
ENDSELECT
ENDCASE
CASE_ELSE:
ENDCASE
ENDSELECT
WEND
/* Clears the screen */
SetRenderDrawColor(renderer, 0, 0, 0, 255);
RenderClear(renderer);
DIM AS RECT midline = {640/2-4, 0, 9, 479};
SetRenderDrawColor(renderer, 90, 90, 90, 255);
RenderDrawRect(renderer, &midline);
RenderFillRect(renderer, &midline);
/* Manipulate paddle positions */
p1_y = p1_y + p1_vel;
p2_y = p2_y + p2_vel;
IF (p1_y < Y_MIN) p1_y = Y_MIN;
IF (p1_y > Y_MAX) p1_y = Y_MAX;
IF (p2_y < Y_MIN) p2_y = Y_MIN;
IF (p2_y > Y_MAX) p2_y = Y_MAX;
/* Draw the paddles */
SetRenderDrawColor(renderer, 255, 255, 255, 255);
DIM AS Rect rect1 = {P1_X, p1_y, 10, 80};
DIM AS Rect rect2 = {P2_X, p2_y, 10, 80};
RenderDrawRect(renderer, &rect1);
RenderDrawRect(renderer, &rect2);
RenderFillRect(renderer, &rect1);
RenderFillRect(renderer, &rect2);
/* Manipulate the ball position */
ball_x = ball_x + ball_x_vel;
ball_y = ball_y + ball_y_vel;
IF (ball_x + 4 >= 630 && ball_x <= 639 && ball_y + 4 < p2_y + 80 && ball_y - 4 > p2_y) THEN
ball_x_vel = -ball_x_vel;
ball_y_vel = ball_y_vel + (ball_y - (p2_y + 40)) / 10;
IF (ball_x_vel < 0) ball_x_vel--;
IF (ball_x_vel > 0) ball_x_vel++;
ENDIF
IF (ball_x - 4 <= 9 && ball_x >= 0 && ball_y + 4 < p1_y + 80 && ball_y - 4 > p1_y) THEN
ball_x_vel = -ball_x_vel;
ball_y_vel = ball_y_vel + (ball_y - (p1_y + 40)) / 10;
IF (ball_x_vel < 0 && ball_x_vel > -8) ball_x_vel--;
IF (ball_x_vel > 0 && ball_x_vel < 8) ball_x_vel++;
ENDIF
IF (ball_y - 4 <= 0 OR ball_y + 4 >= 479) THEN
ball_y_vel = -ball_y_vel;
ENDIF
RenderDrawLine(renderer, ball_x, ball_y - 4, ball_x, ball_y + 4);
RenderDrawLine(renderer, ball_x - 4, ball_y, ball_x + 4, ball_y);
IF (ball_x < 0) THEN
p2_score++;
ball_x = 639 / 2;
ball_y = 439 / 2;
ball_x_vel = -6;
ball_y_vel = 0;
p1_y = 199;
p2_y = 199;
ENDIF
IF (ball_x > 639) THEN
p1_score++;
ball_x = 639 / 2;
ball_y = 439 / 2;
ball_x_vel = 6;
ball_y_vel = 0;
p1_y = 199;
p2_y = 199;
ENDIF
/* Draw everything to the screen */
RenderPresent(renderer);
Delay(delay);
}
Quit();
RETURN 0;
ENDMAIN