Programmering V.2

PONG!!

// main.cpp

// includes
#include
#include
#include
// Pro+: disable warning(s) that are annoying
#pragma warning(disable:4098)

// pragma directives (can also be linked through project settings)
#pragma comment(lib, ”SDL2.lib”)
#pragma comment(lib, ”SDL2main.lib”)

// structs

struct Paddle
{
float x, y;
bool input[2];
};
struct Ball
{
float x, y, xA,yA;
};
enum EGameState
{
GAME_STATE_PAUSE,
GAME_STATE_PLAY,
};

struct Game
{
SDL_Window* window;
SDL_Renderer* renderer;
int width, height;
unsigned int tick;
EGameState state;
Ball boll;
unsigned int score0, score1;
Paddle left;
Paddle right;
bool start;

};
void initialize_boll(Ball* boll, float x, float y)
{
boll->x = x;// = 502;
boll->y = y;// = 310;
boll->xA = 0.0f; //= 50;
boll->yA = 0.0f; //= -50;
}
void initialize_paddle(Paddle* paddle, float x, float y)
{

paddle->input[0] = false;
paddle->input[1] = false;
paddle->x = x;
paddle->y = y;

}
// functions
bool initialize(Game* game, int width, int height) {
SDL_Log(”initialize()”);
SDL_Init(SDL_INIT_EVERYTHING);
game->window = nullptr;
game->renderer = nullptr;
game->width = width;
game->height = height;
game->tick = SDL_GetTicks();
game->state = GAME_STATE_PAUSE;
game->start = false;
game->score0 = 0;
game->score1 = 0;
//Skapa bollen
initialize_boll(&game->boll, game->width /2 – 10.0f, game->height / 2 – 10.0f);
//Skapa vänster ”paddel”
initialize_paddle(&game->left, 50, game->height / 2 – 50);
//Skapa höger ”paddel”
initialize_paddle(&game->right,game->width -70, game->height / 2 – 50);

/* game.right.input[0] = false;
game.right.input[1] = false;
game.right.x = width – 70;
game.right.y = game.height / 2 – 50;

game.left.input[0] = false;
game.left.input[1] = false;
game.left.x = 50;
game.left.y = game.height / 2 – 50;
*/
// creating a window
game->window = SDL_CreateWindow(”Pong”,
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
game->width,
game->height,
SDL_WINDOW_OPENGL);

// error checking window
if (game->window == nullptr) {
return false;
}

// creating a renderer that we use to draw stuff with
game->renderer = SDL_CreateRenderer(game->window,
-1, SDL_RENDERER_ACCELERATED);

// error checking renderer
if (game->renderer == nullptr) {
return false;
}

// everything went ok!
return true;
}

void shutdown(Game* game) {
// clean up resources
SDL_Log(”shutdown()”);

// check if we have a valid renderer
if (game->renderer != nullptr) {
SDL_DestroyRenderer(game->renderer);
}
game->renderer = nullptr;

// check if we have a valid window
if (game->window != nullptr) {
SDL_DestroyWindow(game->window);
}
game->window = nullptr;

// shut down SDL
SDL_Quit();
}

bool update_input(Game* game) {
// check events for user input
SDL_Event event;
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_KEYDOWN:
switch (event.key.keysym.sym) {
// player 1 keys
case SDLK_w:
game->left.input[0] = true;
break;
case SDLK_s:
game->left.input[1] = true;
break;

// player 2 keys
case SDLK_o:
game->right.input[0] = true;
break;
case SDLK_l:
game->right.input[1] = true;
break;

// space-key
case SDLK_SPACE:
game->start = true;
break;
}
break;

case SDL_KEYUP:
switch (event.key.keysym.sym) {
// player 1 keys
case SDLK_w:
game->left.input[0] = false;
break;
case SDLK_s:
game->left.input[1] = false;
break;

// player 2 keys
case SDLK_o:
game->right.input[0] = false;
break;
case SDLK_l:
game->right.input[1] = false;
break;

// space-key
case SDLK_SPACE:
game->start = false;
break;

// quit-key
case SDLK_ESCAPE:
return false;
break;
}
break;

case SDL_QUIT:
return false;
break;
}
}

return true;
}
bool check(Paddle* paddle, Ball* boll)
{
if (paddle->x + 20.0f x || paddle->x > boll->x + 20.0f )
{
return false;
}
if (paddle->y + 100.0f y || paddle->y > boll->y + 20 )
{
return false;
}
return true;
}
bool update(Game* game) {
if (!update_input(game)) {
SDL_Log(”Quit.”);
return false;
}
unsigned int now = SDL_GetTicks();
unsigned int delta = now – game->tick;
game->tick = now;

float deltatime = static_cast(delta)* 0.001f;

switch (game->state)
{
case GAME_STATE_PAUSE:
if (game->start)
{
game->state = GAME_STATE_PLAY;
if (now % 2 == 0)
{
game->boll.xA = 1.0f;
game->boll.yA = 1.0f;
}
else
{
game->boll.xA = -1.0f;
game->boll.yA = – 1.0f;

}
float len = sqrtf(game->boll.xA * game->boll.xA + game->boll.yA * game->boll.yA);

game->boll.xA /= len;
game->boll.yA /= len;

}
break;
case GAME_STATE_PLAY:
float speed = 1000.0f;
if (game->left.input[0])
{
game->left.y -= speed * deltatime;
if (game->left.y < 0)
{
game->left.y = 0;
}
}
if (game->left.input[1])
{
game->left.y += speed * deltatime;
if (game->left.y > 500)
{
game->left.y = 500;
}
}
if (game->right.input[0])
{
game->right.y -= speed * deltatime;
if (game->right.y < 0)
{
game->right.y = 0;
}
}
if (game->right.input[1])
{
game->right.y += speed * deltatime;
if (game->right.y > 500)
{
game->right.y = 500;
}
}
game->boll.x += game->boll.xA * deltatime * 300;
game->boll.y += game->boll.yA * deltatime * 300;
if (game->boll.y >= 580 || game->boll.y <= 0)
{
game->boll.yA *= -1;

}
if (game->boll.x >= 1024)
{
game->score0++;
initialize_paddle(&game->left, 50.0f, game->height / 2 – 50.0f);
initialize_paddle(&game->right, game->width – 70.0f, game->height / 2 – 50.0f);
initialize_boll(&game->boll, game->width / 2 – 10.0f, game->height / 2 – 10.0f);
game->state = GAME_STATE_PAUSE;
SDL_Log(”Player1: %d Player2: %d”, game->score0, game->score1);
}
if (game->boll.x <= 0)
{
game->score1++;
initialize_paddle(&game->left, 50.0f, game->height / 2 – 50.0f);
initialize_paddle(&game->right, game->width – 70.0f, game->height / 2 – 50.0f);
initialize_boll(&game->boll, game->width/2 – 10.0f, game->height / 2 – 10.0f);
game->state = GAME_STATE_PAUSE;
SDL_Log(”Player1: %d Player2: %d”, game->score0, game->score1);
}
if (check(&game->left, &game->boll))
{
game->boll.xA *= -1;
game->boll.xA += 0.25;
}
else if (check(&game->right, &game->boll))
{
game->boll.xA *= -1;
game->boll.xA -= 0.25;
}

/*else if (game->boll.y >= game->left.y && game->boll.x left.x + 20 && game->boll.y left.y + 100)
{
game->boll.xA *= -1;
game->boll.xA = game->boll.xA + 0.5;

}
else if (game->boll.y >= game->right.y && game->boll.x >= game->right.x – 20 && game->boll.y right.y + 100)
{
game->boll.xA *= -1;
game->boll.xA = game->boll.xA – 0.5;

}
*/
break;
}

// here we will be game mechanics

SDL_Delay(10);
return true;
}
void draw(Game* game) {
// alla till fem nollor = svart
SDL_SetRenderDrawColor(game->renderer,
0x00000, 0x00000, 0x00000, 0x00000); //<—
SDL_RenderClear(game->renderer);

// here will be drawing of game Röd/Grön/Blå
SDL_SetRenderDrawColor(game->renderer,
0xfffff, 0x00000, 0xfffff, 0xfffff);
// below an example of drawing left paddle
{
SDL_Rect rect = { game->left.x, game->left.y, 20, 100 };
SDL_RenderFillRect(game->renderer, &rect);
}

// below an example of drawing right paddle
{
SDL_Rect rect = { game->right.x, game->right.y, 20, 100 };
SDL_RenderFillRect(game->renderer, &rect);
}

// below an example of drawing the ball
{
SDL_Rect rect = { game->boll.x, game->boll.y, 20, 20 };
SDL_RenderFillRect(game->renderer, &rect);
}

SDL_RenderPresent(game->renderer);
}
// ,————–.
// | main function |
// `————–´
int main(int argc, char* argv[])
{
// game instance
Game game;

// initialize game
if (initialize(&game, 1024, 600)) {
// game loop
while (update(&game)) {
draw(&game);
}
}
shutdown(&game);

return 0;
}

About Folke Stövring Nielsen

2014  Programming