Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: C: Pong-klooni

aWW [21.04.2005 20:51:05]

#

Kuten otsikossa mainitsin, kyseessä on pong-klooni

# Pong v0.1 Makefile

CC = gcc -Wall -ansi -pedantic
CFLAGS = -g `sdl-config --cflags --libs` -Wall -ansi
SRC = main.c
TARGET = Pong

all: $(TARGET)

$(TARGET): $(SRC)
$(CC) $(CFLAGS) -o $(TARGET) $(SRC)

clean:
rm -f pong
rm -f core

# Aleksander Tervanotko
# 21.04.2005 <stWasm1.0@gmail.com>
/***************************************************************************
main.c  -  pong-clone
-------------------
begin                : 21.04.2005
copyright            : (C) 2005 by Aleksander "stWasm1.0" Tervanotko
email                : <stWasm1.0@gmal.com>
***************************************************************************/

/***************************************************************************
*                                                                         *
*   This program is free software; you can redistribute it and/or modify  *
*   it under the terms of the GNU General Public License as published by  *
*   the Free Software Foundation; either version 2 of the License, or     *
*   (at your option) any later version.                                   *
*                                                                         *
***************************************************************************/

/* sisällytettävät kirjastot */
#include <SDL/SDL.h>

/*/ VAKTIOT ///////////////////////////////////////////////////////////////////*/
#define NAYTON_KORKEUS			768
#define NAYTON_LEVEYS			1024

/* mailojen sijainti y-akselilla */
#define MAILA1_Y			         30
#define MAILA2_Y			         728

/* mailojen korkeus ja leveys */
#define MAILAN_KORKEUS			30
#define MAILAN_LEVEYS			100

/* pallon korkeus ja leveys  */
#define PALLON_LEVEYS			10
#define PALLON_KORKEUS			10

/*/ MUUTTUJAT ////////////////////////////////////////////////////////////////*/
/* pinnat */
SDL_Surface *naytto = NULL;

int lopetus = 0;
SDL_Event tapahtuma;
Uint8 *nappi;

/* mailojen sijainti x-akselilla (y on vakio) */
int maila1_x = 462;
int maila2_x = 462;

/* pallon tiedot */
int pallo_x = 500;
int pallo_y = 70;
int pallo_xv = 4;
int pallo_yv = 4;

SDL_Rect alue;
/*/ FUNKTIOT /////////////////////////////////////////////////////////////////*/
/* --- Suoritetaan kaikki alustustoimenpiteet täällä ***************************/
void Alustus( void )
{
        /* alustetaan SDL */
        SDL_Init( SDL_INIT_VIDEO );

        /* asetetaan näyttötila */
        naytto = SDL_SetVideoMode(1024, 768, 32, SDL_HWSURFACE|SDL_FULLSCREEN|SDL_DOUBLEBUF);

        /*
        * tässä minä tavallisesti lataan kaikki tarvittavat bittikartat ja tulostan logon,
        * mutta nyt vältän käyttämästä bittikarttoja
        */
}

/* --- Haetaan pelaajan syöte ********************************************/
void Hae_Pelaajan_Syote( void )
{
        SDL_PollEvent( &tapahtuma );
        if( tapahtuma.type == SDL_QUIT )
        lopetus = 1;
        if( tapahtuma.type == SDL_KEYDOWN )
        {
                if( tapahtuma.key.keysym.sym == SDLK_ESCAPE)
                lopetus = 1;
        }

        nappi = SDL_GetKeyState( NULL );
        if( nappi[SDLK_LEFT] )
        {
                /* siirretään maila 1 */
                maila1_x -= 7;

                /* testataan mennäänkö rajojen ulkopuolelle */
                if( maila1_x < 2 )
                maila1_x = 2;

        }

        if( nappi[SDLK_RIGHT] )
        {
                /* siirretään maila 1 */
                maila1_x += 7;

                /* testataan mennäänkö rajojen ulkopuolelle */
                if( maila1_x > 922 )
                maila1_x = 922;
        }

        if( nappi[SDLK_a] )
        {
                /* siirretään maila 2 */
                maila2_x -= 7;

                /* testataan mennäänkö rajojen ulkopuolelle */
                if( maila2_x < 2 )
                maila2_x = 2;
        }

        if( nappi[SDLK_d] )
        {
                /* siirretään maila 2 */
                maila2_x += 7;

                /* testataan mennäänkö rajojen ulkopuolelle */
                if( maila2_x > 922 )
                maila2_x = 922;
        }
}

/* --- Tarkistetaan kaikki törmäykset ********************************************/
void Tarkista_Tormaukset( void )
{
        /* tarkistetaan vasen ja oikea reuna */
        if( ( pallo_x < 2 ) || ( pallo_x > 1012 ) )
        pallo_xv = -pallo_xv;

        /* tarkistetaan ylä- ja alareunat */
        if( ( pallo_y < 2 ) || ( pallo_y > 756 ) )
        pallo_yv = -pallo_yv;

        /* tarkistetaan ensimmäinen maila */
        if( ( pallo_x > maila1_x ) && ( pallo_x < (maila1_x+100) ) &&
        ( pallo_y > MAILA1_Y ) && ( pallo_y < (MAILA1_Y+30) ) )
        pallo_yv = -pallo_yv;

        /* tarkistetaan toinen maila */
        if( ( pallo_x > maila2_x ) && ( pallo_x < (maila2_x+100) ) &&
        ( pallo_y > MAILA2_Y ) && ( pallo_y < (MAILA2_Y+30) ) )
        pallo_yv = -pallo_yv;

        /* tarkistetaan voitto */
        if ( ( pallo_y < 2 ) || ( pallo_y > 756 ) )
        lopetus = 1;
}

/* --- Piirretään molemmat mailat ***********************************************/
void Piirra_Mailat( void )
{
        /* piirretään ensmmäinen maila */
        alue.x = maila1_x;
        alue.y = MAILA1_Y;
        alue.h = MAILAN_KORKEUS;
        alue.w = MAILAN_LEVEYS;
        SDL_FillRect( naytto, &alue, SDL_MapRGB(naytto->format, 100, 100, 100) );

        /* ja nyt toinen maila */
        alue.x = maila2_x;
        alue.y = MAILA2_Y;
        SDL_FillRect( naytto, &alue, SDL_MapRGB(naytto->format, 200, 200, 200) );
}

/* --- Päivitetään pallon paikka ************************************************/
void Paivita_Pallo( void )
{
        pallo_x += pallo_xv;
        pallo_y += pallo_yv;
}

/* --- Tyhjennetään puskuri ******************************************************/
void Tyhjenna_Puskuri( void )
{
        alue.x = 0;
        alue.y = 0;
        alue.h = NAYTON_KORKEUS;
        alue.w = NAYTON_LEVEYS;
        SDL_FillRect( naytto, &alue, SDL_MapRGB(naytto->format, 0, 0, 0) );
}

/* --- Piirretään pallo *********************************************************/
void Piirra_Pallo( void )
{

        alue.x = pallo_x;
        alue.y = pallo_y;
        alue.h = PALLON_KORKEUS;
        alue.w = PALLON_LEVEYS;
        SDL_FillRect( naytto, &alue, SDL_MapRGB(naytto->format, 20, 68, 87) );
}
/* --- Jokaisen ohjelman keskus *************************************************/
int main( int argc, char *argv[] )
{
        /* suoritetaan kaikki alustustoimenpiteet täällä */
        Alustus();

        while( lopetus == 0 )
        {
                /* tyhjennetään puskuri */
                Tyhjenna_Puskuri();

                /* haetaan pelaajan syöte */
                Hae_Pelaajan_Syote();

                /* päivitetään pallon paikka */
                Paivita_Pallo();

                /* tarkistetaan mahdolliset virheet */
                Tarkista_Tormaukset();

                /* piirretään mailat */
                Piirra_Mailat();

                /* piirretään pallo */
                Piirra_Pallo();

                /* Pyöräytetään pinnat */
                SDL_Flip( naytto );
        }

        /* suljetaan SDL */
        SDL_Quit();
        return 0;
}

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta