Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Conway's game of life in OpenGL

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 18.02.2009, 22:41    Titel: Conway's game of life in OpenGL Antworten mit Zitat

Das OpenGL tutorial von Eastler_dart hat mich inspiriert mal einen zellularen automaten in 3d zu programmieren.
(http://www.freebasic-portal.de/index.php?s=tutorials&id=46&seite=1)

Rausgekommen ist ein mehr oder weniger "vergewaltigter" tutorial-quelltext. Aber es klappt schon ganz gut.
Irgendwie siehts noch nicht 100% so aus, wie es ausschauen soll, aber so genau finde ich da nicht die fehler.

Vielleicht kann der eine oder andere was damit anfangen:

Code:

'-------------------------
'DIMs
'-------------------------
DIM SHARED AS STRING Tastendruck

'-------------------------
'Includes
'-------------------------
#include "fbgfx.bi"
#include once "GL/gl.bi"
#include once "GL/glu.bi"

'-------------------------
'Declarationen
'-------------------------
DECLARE SUB Objekt1()

'-------------------------
' das Fenster öffnen
'-------------------------
screen 20, 32, , 2

'-------------------------
' Open-GL Init
'-------------------------
glViewport 0, 0, 1024, 768                      ' den Current Viewport auf eine Ausgangsposition setzen
glMatrixMode GL_PROJECTION                     ' Den Matrix-Modus Projection wählen
glLoadIdentity                                 ' Diesen Modus auf Anfangswerte setzen
gluPerspective 45.0, 1024.0/768.0, 0.1, 500.0   ' Grundeinstellungen des Anezeigefensters festlegen
glMatrixMode GL_MODELVIEW                      ' Auf den Matrix-Modus Modelview schalten
glLoadIdentity                                 ' und auch diesen auf Anfangswerte setzen
glClearColor 0.0, 0.0, 0.00, 0.0               ' Setze Farbe für löschen auf Mittelgrau
glClearDepth 1.0                               ' Depth-Buffer Löschen erlauben
glEnable GL_DEPTH_TEST                         ' den Tiefentest GL_DEPTH_TEST einschalten
glClear GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT  'Tiefen- und Farbpufferbits löschen
'---------------------------
'HAUPTTEIL
'---------------------------
dim as integer x,y,z
dim as double dx,dy
dim as integer mx,my
dim as integer smx,smy
dim as integer sx,sy,bt
screeninfo sx,sy
setmouse sx/2,sy/2
getmouse smx,smy
const maxx = 32
const maxy = 32
const maxz = 32
dim shared f(1 to 2, 0 to maxx+1,0 to maxy+1, 0 to maxz+1) as ubyte
dim shared a as ubyte = 1
dim shared b as ubyte = 2
dim c as integer

function count(s as ubyte,x1 as integer,y1 as integer, z1 as integer) as integer
    dim c as integer
    for x as integer = 1 to 3
        for y as integer = 1 to 3
            for z as integer = 1 to 3
                if x <> x1 and y <> y1 and z <> z1 and f(s,x1-2+x,y1-2+y,z1-2+z) <> 0 then c = c +1
            next
        next
    next
    return c
end function

sub mirror(s as ubyte)
    dim as integer x, y ,z
    for y = 0 to maxy +1
        for z = 0 to maxz +1
            f(s,0,y,z) = f(s,maxx,y,z)
            f(s,maxx +1,y,z) = f(s,1,y,z)
        next
    next

    for x = 0 to maxx +1
        for y = 0 to maxy +1
            f(s,x,y,0) = f(s,x,y,maxz)
            f(s,x,y,maxz+1) = f(s,x,y,1)
        next
    next

    for x = 0 to maxx +1
        for z = 0 to maxz +1
            f(s,x,0,z) = f(s,x,maxy,z)
            f(s,x,maxy+1,z) = f(s,x,1,z)
        next
    next

end sub

mirror b

open cons for output as #1
DO UNTIL Tastendruck = CHR(27) :'die Schleife solange immer wiederholen, bis in der Variablen Tastendruck die Esc-Taste (chr(27) steht
    'glPushMatrix                                       
    getmouse mx,my
    'if smx <> mx or smy <> my then
        dx = (mx - smx ) / 2
        dy = (my - smy ) / 2
   
   '---------------------------
   'ProgrammSchleife
   '---------------------------
   Tastendruck = INKEY   'Jeder Tastendruck wird sofort in die Variable Tastendruck gespeichert
   if tastendruck = "+" then
       glrotatef 1,0,0,1
   end if
   if tastendruck = "-" then
       glrotatef -1,0,0,1
   end if
    glClear GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT  'Tiefen- und Farbpufferbits löschen
   if tastendruck = "w" then gltranslatef 0,0,1.0
   if tastendruck = "s" then gltranslatef 0,0,-1.0
   if tastendruck = "a" then gltranslatef 1.0,0,0
   if tastendruck = "d" then gltranslatef -1.0,0,0
   
    if tastendruck = " " then
        for i as integer = 1 to 110
            f(a,int(rnd * (maxx-1)) +1,int(rnd * (maxy-1)) +1,int(rnd * (maxz-1)) +1) = 1
        next
    end if

    'if tastendruck = "/" then
        c = 0

            mirror a
            for x as integer = 1 to maxx
                for y as integer = 1 to maxy
                    for z as integer = 1 to maxz
                        f(b,x,y,z) = f(a,x,y,z)
                        c = count(a,x,y,z)
                        'if c >= 1 then f(b,x,y,z) = 1
                        if c >=3 and c <=4  then f(b,x,y,z) = 1
                        if c > 4 or c < 3 then f(b,x,y,z) = 0
                    next
                next
            next
            mirror b
        if a = 1 then
            a = 2
            b = 1
        else
            a = 1
            b = 2
        end if
    'end if
    glpushmatrix
            gltranslatef -1 * (maxx / 2), -1 * (maxy / 2), -1 * 2 * maxz
            glrotatef dx,0,1,0
            glrotatef dy,1,0,0
            Objekt1              '<<<<<<<<<<<<<<<<hier die neue Programmzeile rein
    glpopmatrix
   flip                  'liebes OpenGL, zeig alles, was in der Schleife für dich vornedran steht, auf Monitor an
   sleep 1
LOOP

END

'-------------------------
SUB Objekt1 ()
   dim t as ubyte =1
      for x as integer = 0 to maxx -1
        if t = 1 then t = 0 else t = 1
          for y as integer = 0 to maxy -1
                if t = 1 then t = 0 else t = 1
              for z as integer = 0 to  maxz -1
                if t = 1 then t = 0 else t = 1
                if f(a,x+1,y+1,z+1) <> 0 then
                glBegin GL_QUADS
                    if t = 1 then
                        glColor3f 1.0,1.0,1.0       :' Zeichenfarbe auf gelb
                    else
                        glColor3f 0.5,0.5,0.5       :' Zeichenfarbe auf gelb
                    end if
                    glVertex3f  x+0.0, y+0.0, z +0.0  :' der erste Punkt
                    glVertex3f  x+1.0, y+0.0, z +0.0  :' der erste Punkt
                    glVertex3f  x+1.0, y+1.0, z +0.0  :' der erste Punkt
                    glVertex3f  x+0.0, y+1.0, z +0.0  :' der erste Punkt
                glEnd
               
                glBegin GL_QUADS
                    glVertex3f  x+0.0, y+0.0, z +1.0  :' der erste Punkt
                    glVertex3f  x+1.0, y+0.0, z +1.0  :' der erste Punkt
                    glVertex3f  x+1.0, y+1.0, z +1.0  :' der erste Punkt
                    glVertex3f  x+0.0, y+1.0, z +1.0  :' der erste Punkt
                glEnd


                glBegin GL_QUADS
                    glVertex3f  x+0.0, y+0.0, z +0.0  :' der erste Punkt
                    glVertex3f  x+0.0, y+1.0, z +0.0  :' der erste Punkt
                    glVertex3f  x+0.0, y+1.0, z +1.0  :' der erste Punkt
                    glVertex3f  x+0.0, y+0.0, z +1.0  :' der erste Punkt
                glEnd


                glBegin GL_QUADS
                    glVertex3f  x+1.0, y+0.0, z +0.0  :' der erste Punkt
                    glVertex3f  x+1.0, y+1.0, z +0.0  :' der erste Punkt
                    glVertex3f  x+1.0, y+1.0, z +1.0  :' der erste Punkt
                    glVertex3f  x+1.0, y+0.0, z +1.0  :' der erste Punkt
                glEnd

                glBegin GL_QUADS
                    glVertex3f  x+0.0, y+0.0, z +0.0  :' der erste Punkt
                    glVertex3f  x+1.0, y+0.0, z +0.0  :' der erste Punkt
                    glVertex3f  x+1.0, y+0.0, z +1.0  :' der erste Punkt
                    glVertex3f  x+0.0, y+0.0, z +1.0  :' der erste Punkt
                glEnd


                glBegin GL_QUADS
                    glVertex3f  x+0.0, y+1.0, z +0.0  :' der erste Punkt
                    glVertex3f  x+1.0, y+1.0, z +0.0  :' der erste Punkt
                    glVertex3f  x+1.0, y+1.0, z +1.0  :' der erste Punkt
                    glVertex3f  x+0.0, y+1.0, z +1.0  :' der erste Punkt
                glEnd
            end if


            next
        next
    next
END SUB


Bitte einfach mal lange die leertaste drücken.. irgendwann fängts an zu wachsen!
ESC für abbrechen und die maus bewegen um den würfel zu bewegen.
a - w - s - d für verschieben der kamera.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
frebas



Anmeldungsdatum: 20.06.2008
Beiträge: 245

BeitragVerfasst am: 19.02.2009, 16:21    Titel: Antworten mit Zitat

Wie soll es denn aussehen?
Wenn ich die Leertaste etwas länger gedrückt halte sehe ich kurz 2 Objekte die größer werden und sich dann verbinden, dann bewegt sich das nurnoch so seltsam.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 19.02.2009, 17:07    Titel: Antworten mit Zitat

es sollte irgendwie so ausschauen:
http://www.ibiblio.org/e-notes/Life/Game.htm

nur irgendwie schauts noch nicht so aus wie es soll.. vielleicht hat einer eine idee... die regeln im quelltext schauen so aus:
Code:

...
if c >=3 and c <=4  then f(b,x,y,z) = 1
if c > 4 or c < 3 then f(b,x,y,z) = 0
...


wobei c die anzahl der nachbarn um den pixel auf seite "a" des 3d-feldes "f" darstellt.
Irgendwie hab ich das gefühl, das es mit dem spiegeln, der seiten auch noch irgendwo hapert. aber einen fehler in der funktion mirror sehe ich nicht.. er spiegelt erst x-fläche, dann z, dann y.. die reihenfolge sollte ja nicht ausschlaggebend sein...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz