OpenGL ile Pong oyunu

Başlatan travego0403, 06 Haziran 2011 - 19:53:20

« önceki - sonraki »

0 Üyeler ve 1 Ziyaretçi konuyu incelemekte.

travego0403

Sonunda oynanabilecek bir hale geldi.Hala bazı buglar var başka bir işe girişmezsem düzeltmeye çalışırım ama bu haliylede oynanabilir. :D Bilgisayarda oyun oynamak zevkli ama kendi yazdığın oyunu oynamak daha da zevkli oluyor. :D

Çarpışma algoritması(Bir çember ile bir dikdörtgen çarpışması) için @Erdem
Platformun daha akıcı hareketi için @Hatti ye teşekkürler. :)

Daha nice oyunlarda görüşmek üzere, bildiğiniz yapılması basit ya da beraber yazabileceğimiz oyunlar içinde önerilerinizi bekliyorum. :)

#include <stdlib.h>
#include <GL/glut.h>
#include <iostream>
#include <math.h>
using namespace std;
double sol=-0.94;
double sag=0.94;
double alt=-1;
double ust=1;
class Top{
private:
    double hizx;               //Hizi
    double hizy;
    double kx;                 //Konum
    double ky;
    double r;
public:
    Top(){       
        srand(time(NULL));
        kx=(double)(rand()%60)/80;   // X-Konum
        ky=0;
        hizx=0.01;                 //Hiz
        hizy=0.01;
        r=0.03;
        if(rand()%1000>500){
                hizx=-hizx;
        }
        if(rand()%1000>500){
                hizy=-hizy;
        }
   
    }
   
    Top(double a,double b,double c,double d,double e):hizx(a),hizy(b),kx(c),ky(d),r(e)
    {  }
    double getr(){
        return r;
    }
    double getkx(){
        return kx;
    }
    double getky(){
        return ky;
    }
    double degisHizx(){
        hizx=-hizx;
    }
    double degisHizy(){
        hizy=-hizy;
    }
    void topKonumAyarla(double a,double b,double hy){
        kx=a;   
        ky=b;
        hizy=-hy;
        if(rand()%1000>500){
                hizx=-hizx;
        }
       
    }
    void topCiz(){
        int i=0;
        double x;
        double y;
        glBegin(GL_POLYGON);
        while(i<=360){           
                x=r*cos(i*M_PI/180)+kx;
                y=r*sin(i*M_PI/180)+ky;
                glVertex2f(x,y);
                i++;       
        }
        glEnd();   
    }
    double getHizy(){
        return hizy;
    }
    void operator ++ (){
        if(kx>=sag-r||kx<=sol+r){            //Duvardan çarpma şartları
                hizx=-hizx;
        }
        kx+=hizx;
        ky+=hizy;
    }
};
class Platform{
private:
    double merkezx,merkezy;
    double genislik;
    double yukseklik;
    double x,y;        //sol ust kosenin koordinatlari
   
public:
    Platform():merkezx(0),merkezy(-0.5),genislik(0.5),yukseklik(0.06)
    {  }
    Platform(double a,double b,double c,double d):merkezx(a),merkezy(b),genislik(c),yukseklik(d){
       
    }
    void platformCiz(){
        y=merkezy+yukseklik/2;   //sol ust kose y degeri
        x=merkezx-genislik/2;    //sol ust kose x degeri
        glColor3f(1,1,1);
        glBegin(GL_POLYGON);
        glVertex2d(x,y);
        glVertex2d(x+genislik,y);
        glVertex2d(x+genislik,y-yukseklik);
        glVertex2d(x,y-yukseklik);
        glVertex2d(x,y);
        glEnd();
    }
    double getMerkezx(){
        x=merkezx-genislik/2;    //sol ust kose x degeri
        return merkezx;
    }
    double getMerkezy(){
        y=merkezy+yukseklik/2;   //sol ust kose y degeri
        return merkezy;
    }
    double getYukseklik(){
        return yukseklik;
    }
    double getGenislik(){
        return genislik;
    }
    double getx(){
        return x;
    }
    double gety(){
        return y;
    }
    void operator ++ (){
        if(merkezx+genislik/2<=sag){         
                merkezx+=0.03;
        }               //Platform kaydirma hizi
    }
    void operator -- (){
        if(merkezx-genislik/2>=sol){         
                merkezx-=0.03;
        }
    }
   
};
void sahne();
void klavye(int);
void skorKontrol(Top*);
void carpismaKontrol(Top* , Platform*);
static void klavye_basildi(unsigned char, int, int);
static void klavye_birakildi(unsigned char, int, int);
char tus_durumu[256] = {false};
Top t1;
Platform p1(0,-0.8,0.5,0.06);
Platform p2(0,0.8,0.5,0.06);
int skor1=0,skor2=0;         // Oyuncularin skorlari
//int sayac=0;


int main(int argc, char** argv) {
    cout<<"Oyunu kodlayan: Sinan Ates"<<endl;
    cout<<"Alttaki platformu 'a' ve 'd' tuslari ile hareket ettirebilirsiniz... \n";
    cout<<"Ustteki platformu 'j' ve 'l' tuslari ile hareket ettirebilirsiniz... \n";
    cout<<"Skorlar\nOyuncu 1\tOyuncu2\n";
    cout<<"**************************************************\n";
    glutInit(&argc,argv);
    glutInitDisplayMode(GLUT_DOUBLE);
    glutInitWindowSize(600,600);
    glutCreateWindow("Oyun");   
    glutDisplayFunc(sahne);   
    glutKeyboardFunc(klavye_basildi);
    glutKeyboardUpFunc(klavye_birakildi);
    glutTimerFunc(0, klavye, 0);
    glutMainLoop(); 
    return 0;   
}
void sahne(){   
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glColor3f(0,1,0); 
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_LINES);
    glVertex2f(-0.94,1);               //Kutuyu çiz
    glVertex2f(-0.94,-1);
    glVertex2f(0.94,-1);
    glVertex2f(0.94,1);
    glColor3f(1,0,1);
    glVertex2f(sol,0);
    glVertex2f(sag,0);
    glEnd();
    glColor3f(0,1,0);
    t1.topCiz();   
    p1.platformCiz();
    p2.platformCiz();
    carpismaKontrol(&t1,&p1);
    carpismaKontrol(&t1,&p2);
    skorKontrol(&t1);
    glutSwapBuffers();
    ++t1;
}
static void klavye_basildi(unsigned char tus,int x,int y){
tus_durumu[tus] = true;
}

static void klavye_birakildi(unsigned char tus,int x,int y){
tus_durumu[tus] = false;
}
void klavye(int x){
    if(tus_durumu['a']==true){
        --p1;
    }
    if(tus_durumu['d']==true){
        ++p1;
    }
    if(tus_durumu['j']==true){
        --p2;
    }
    if(tus_durumu['l']==true){
        ++p2;
    }
    if(tus_durumu[27]==true){
        exit (0);
    }
    glutTimerFunc(10, klavye, 0 );
    glutPostRedisplay ();
    //sahne(1);
}
void carpismaKontrol(Top *top, Platform *platform){
   
    double topx,topy,r;
    topx=top->getkx();
    topy=top->getky();
    r=top->getr();
       
    double platformx,platformy,platformGenislik,platformYukseklik;
    platformx=platform->getx();
    platformy=platform->gety();
    platformYukseklik=platform->getYukseklik();
    platformGenislik=platform->getGenislik();
   
    double platformSol,platformSag,platformUst,platformAlt;
    platformUst=platformy;
    platformAlt=platformy-platformYukseklik;
    platformSol=platformx;
    platformSag=platformx+platformGenislik;
   
    /*          //İki dikdortgenin carpisma algilama algoritmasi
    if(topx-r>=platformSol&&topx+r<=platformSag&&topy-r<=platformUst&&topy+r>=platformAlt){
        cout<<"Gummmmmm :)) Top sektirme sayiniz:"<<++sayac<<endl;       
        if(topx<platformSol||topx>platformSag){
            top->degisHizx();
        }else{
            top->degisHizy();
        }
    }    */
   
    double enYakinx,enYakiny;
    if (topx <= platformSol) {           //Topa en yakin noktanin x degeri
        enYakinx = platformSol;
    }else if(topx >= platformSag){
        enYakinx = platformSag;
    }else {
        enYakinx = topx;
    }
   
    if (topy >= platformUst) {           //Topa en yakin noktanin y degeri
        enYakiny = platformUst;
    }else if(topy <= platformAlt){
        enYakiny = platformAlt;
    }else {
        enYakiny = topy;
    }
    double mesafe;              //Topun merkezi ile en yakin nokta arasindaki uzaklik   
    mesafe=sqrt(pow(enYakinx-topx,2)+pow(enYakiny-topy,2));
    if(mesafe<=r){
        if(topx>platformSol&&topx<platformSag){
            top->degisHizy();
        }else{
            top->degisHizx();
        }       
        //cout<<"Gummmmmm :)) Top sektirme sayiniz:"<<++sayac<<endl;
    }
}
void skorKontrol(Top *t1){
    double topy=t1->getky();
    double r=t1->getr();
    if(topy-r<alt){
        skor2++;               
        cout<<skor1<<"\t\t"<<skor2<<endl;
        t1->topKonumAyarla(0,-0.7,t1->getHizy());
    }
    if(topy+r>ust){
        skor1++;       
        cout<<skor1<<"\t\t"<<skor2<<endl;   
        t1->topKonumAyarla(0,0.7,t1->getHizy());
    }
}
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

krwlng

#include <GL/glut.h> yok bende.
http://twitter.com/yusuFBrn

Ali İsmail Korkmaz, FENERBAHÇE Yıkılmaz!

sem

".NET çemberinden geçen lirisist etkisi bir 'Volcano', bir yüzüm Java bir yüzüm Badalamenti Don Tano"
----------------------------------------------------------------------------------------------------------------------
"Her yer ölüm yine, burası dünya
Derken ölüm bile bu nasıl dünya?
Benden ölüm dile, batıyor gün yine
Burası dünya?

krwlng

http://twitter.com/yusuFBrn

Ali İsmail Korkmaz, FENERBAHÇE Yıkılmaz!

Erdem

Alıntı yapılan: travego0403 - 06 Haziran 2011 - 19:53:20
Bilgisayarda oyun oynamak zevkli ama kendi yazdığın oyunu oynamak daha da zevkli oluyor. :D

Evet gerçekten öyle  :D

Henüz oyunu deneyemedim. Ama fikir olarak örneğin top platforma çarptığında hep aynı yöne değil de başka yönlere farklı hızlarla gidebilir. Ya da platforma her çarptığında hızı bir miktar artabilir.

Yeni proje olarak ızgara tabanlı oyunlar düşünebilirsin. (tile based games) Ben kendi yazdığım oyun için çarpışma algılamasını henüz hazırladım. Bunun nedeni SDL direkt olarak temel şekiller çizemiyor. Bu yüzden şimdilik Bresenham'ın çizgi çizme algoritmasını kullanarak çizgi

http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm

ve diğer temel şekillerin çizilmesiyle uğraşıyorum.

İlk bahsettiğim topun hızının rastgele değişmesinin vektörler yardımıyla nasıl basitçe yapıldığını görmek istersen projeyi indirdikten sonra:

http://bit.ly/jVayzs

pong.d'yi bununla değiştirebilirsin. Projeyi derlemek için

$ make pong

demen yeterli. Topun da duvardan nasıl basitçe vektör yapısının yansıt işlevi ile yansıdığını görebilirsin.
Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

travego0403

Şu an bir vektör sınıfı yazmak üzerinde çalışıyorum. Daha sonra bunu dahil edilerek topun yönü daha gerçekçi bir hale getirilebilir.
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

Erdem

Şimdi baktım. Kişisel tavsiyem bu basit gibi görünen  8) örneklerdeki hataları gidermeden daha başka oyunlara geçme.
Çünkü örneğin daha sonra geçeceğin oyunlar Tetris, Breakout vs.. daha zorlayıcı olacaktır.

Sınıfların tasarımına gelince örneğin en basitinden bir temel oyun nesnesi olabilir. Top ve platform bu sınıfın çiz, güncelle yordamlarının üzerine yazabilir. Ayrıca sınıfın kurucu işlevi çok fazla parametre almamış olur.

struct Vector2
{
    float x, y;
};

class OyunNesnesi
{

public:

    OyunNesnesi (Vector2 konum)
        : konum_ (konum)
    {
    }

    virtual ~OyunNesnesi ()
    {}

    OyunNesnesi (OyunNesnesi const &);
    OyunNesnesi & operator= (OyunNesnesi const &);

    virtual void ciz () {}
    virtual void guncelle () {}   

protected:
    Vector2 konum_;
};


class HareketliOyunNesnesi : public OyunNesnesi
{
    Vector2 hiz_;
   
public:
    HareketliOyunNesnesi(Vector2 konum, Vector2 hiz)
        : OyunNesnesi(konum), hiz_(hiz)
    {}

    void ciz()
    {
    }
};

int main()
{}
Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

travego0403

Önerilerini dikkate almaya çalışacağım. Nesneye yönelik programlamaya zamanla alışmaya çalışıyorum. ;)
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman

Erdem

Çarpışma algılaması olmasa da bu pong oyunun vektörler kullanarak nasıl hazırlandığını anlattım. Vektörlerle işlerin nasıl basit hale geldiğini göreceksiniz  :)

http://ddili.org/ders/sdl/hareket.html
Eğer Arch Linux tabanlı bir dağıtıma geçmek isterseniz Arcolinux D sürümünü buradan indirebilirsiniz.

Elektronik

travego0403

Vektörler candır, canandır :D

Üniversiteye başladığım ilk derste karşımda 3 boyutlu vektörleri, birim vektörleri( i , j , k ) , skaler, vektörel çarpımları görünce şaşırmıştım.Sonraları ise vektörlerle neler yapmadık ki.
"Matematik bir dildir ve bu dilde şairlere fizikçi denir." Richard Feynman