 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 18.02.2009, 22:41 Titel: Conway's game of life in OpenGL |
|
|
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 |
|
 |
frebas
Anmeldungsdatum: 20.06.2008 Beiträge: 245
|
Verfasst am: 19.02.2009, 16:21 Titel: |
|
|
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 |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 19.02.2009, 17:07 Titel: |
|
|
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 |
|
 |
|
|
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.
|
|