GLBasic forum

Codesnippets => Code Snippets => Topic started by: Quentin on 2007-Jun-15

Title: Schneegestöber in 3D
Post by: Quentin on 2007-Jun-15
Neuauflage: Die meisten Beiträge sind leider leer :(
Title: Schneegestöber - ein erster zaghafter Versuch
Post by: BumbleBee on 2007-Jun-16
Cool.
Let it snow, let it snow...Tralala :D
Ich würde das auch bei Code Snippets reintun und den Code mit englischen Kommentaren versehen.  
Sieht auf jeden Fall wirklich gut aus.

Cheers
Title: Schneegestöber - ein erster zaghafter Versuch
Post by: Antidote on 2007-Jun-16
Schade,
bei mir wird folgendes ausgegeben:
Quote"Grafikanzeige.gbas"(97) error : wrong argument type : INC, arg no: 1
TYPE  is not declared
Title: Schneegestöber - ein erster zaghafter Versuch
Post by: Quentin on 2007-Jun-16
Auweia, übersetzen, na mal sehen.

@Antidote
seltsam, hast das neueste Update gezogen? Ansonsten versuch vielleicht mal in der Funktion Update_Snow() statt
Code (glbasic) Select
LOCAL lsnow

LOCAL lsnow AS tSnowFlake
zu schreiben, vielleicht hilfts
Title: Schneegestöber - ein erster zaghafter Versuch
Post by: Antidote on 2007-Jun-16
@Quentin
Ahhh, ich war nicht up2date ;)
Geht aber auch schneller als man gucken kann mit diesen Updates :))


Schöne Schneeflocken, einfach nur gecodet...toll
Title: Schneegestöber - ein erster zaghafter Versuch
Post by: mannybass on 2007-Jun-16
Sieht toll aus!
Sauber gecodet, gut dokumentiert.
Title: Schneegestöber - ein erster zaghafter Versuch
Post by: Schranz0r on 2007-Jun-17
jopp ganz nett, aber noch paar schönheitsfehler drin:

Code (glbasic) Select
 // Schneeflocke zeichnen
  FILLRECT 0,0,10,10, RGB(0xff, 0x00, 0x80)
  DRAWLINE 0, 5, 10, 5, RGB(RND(255), 255, 255)
  DRAWLINE 5, 0, 5, 10, RGB(RND(255), 255, 255)
  DRAWLINE 1, 1, 9, 9, RGB(RND(255), 255, 255)
  DRAWLINE 9, 1, 1, 9, RGB(RND(255), 255, 255)
Damit sind die Zwischenräume durchsichtig!

und ich häts wohl mit  DIM gemacht anstat mit Types.
Types sind in GLB schau schnell, darum gehts mit deinem Code auch gut, aber versuchs mal in Blitz3D oder so, da haste 0 Chance .....
Title: Schneegestöber - ein erster zaghafter Versuch
Post by: Quentin on 2007-Jun-17
sitmmt auf Transparenz hab ich hierbei gar nicht geachtet, ist mir aber bei dem Gewimmel auch nicht aufgefallen. Thx für den Hinweis.

Wieso DIM statt TYPEs? Sind die Geschwindigkeitsunterschiede wirklich so enorm? Hier war mir aber auch die bessere Lesbarkeit wichtiger als das letzte Quentchen Performance.
In BlitzMax hatte ich aber auch schon etliche hundert Ojbkete gleichzeitig über den Bildschirm bewegt (mit TYPEs). Konnte keine Geschwindigkeitsprobleme sehen, wobei ich zugeben muss, daß ich auch keine genauen Messungen vorgenommen habe.
Title: Schneegestöber - ein erster zaghafter Versuch
Post by: Schranz0r on 2007-Jun-17
In Blitz haste gleich mal paar laggs, schmieren die FPS gleich ab...

DIM ist die resourcensparende variante,
Types beanspruchen mehr .....


Aber schön haste es Programmiert, schön eingerückt & Kommentiert
Title: Schneegestöber - ein erster zaghafter Versuch
Post by: WPShadow on 2007-Jun-17
Gefällt mir gut! Gibt's das auch in 3D? hehehe

War bloß ein Scherz. Ist wirklich super Arbeit! =)
Title: Schneegestöber - ein erster zaghafter Versuch
Post by: Quentin on 2007-Jun-17
Quote from: WPShadowGefällt mir gut! Gibt's das auch in 3D? hehehe
yep, sobald ich einen Schimmer von 3D in GLBasic hab ;-)
Title: Schneegestöber - ein erster zaghafter Versuch
Post by: Schranz0r on 2007-Jun-17
ist doch wirklich einfach :D
3D mein ich jetzt , da musste gernet viel ändern am Code
Title: Schneegestöber - ein erster zaghafter Versuch
Post by: Quentin on 2008-Apr-25
so, muss den alten Wirsing hier noch mal ausgraben, denn endlich gibt es jetzt 3D-Schnee, worauf die ganze GL-Community nicht gewartet hat ;)

Code (glbasic) Select
// --------------------------------- //
// Project: 3D-Schnee
// Start: Monday, April 14, 2008
// IDE Version: 5.204

GLOBAL KEY_LEFT = 203
GLOBAL KEY_RIGHT = 205
GLOBAL KEY_UP = 200
GLOBAL KEY_DOWN = 208
GLOBAL MAX_SNOW = 5000

TYPE t_snow
  x; y; z
  speed
  angx
  angz
ENDTYPE
LOCAL snow[] AS t_snow
DIM snow[MAX_SNOW]

// init snow
FOR i = 0 TO MAX_SNOW - 1
  snow[i].x = RAND(-1000, 1000)
  snow[i].y = RND(1000)
  snow[i].z = RAND(-1000, 1000)
  snow[i].speed = RND(10) / 10 + 1
  snow[i].angx = RND(360)
  snow[i].angz = RND(360)
NEXT


//DRAWRECT 0, 0, 255, 255, RGB(80, 80, 80)
//GRABSPRITE 0, 0, 0, 255, 255

// ground
X_OBJSTART 0
  X_OBJADDVERTEX -1000, 0, -1000, 0, 0, RGB(80, 80, 80)
  X_OBJADDVERTEX -000, 0, -1000, 0, 0, RGB(80, 80, 80)
  X_OBJADDVERTEX 1000, 0, 1000, 0, 0, RGB(80, 80, 80)
  X_OBJADDVERTEX -1000, 0, 1000, 0,0, RGB(80, 80, 80)
X_OBJEND

// snowflake
X_OBJSTART 1
  FOR i = 0 TO 360 STEP 45
    X_OBJNEWGROUP
      X_OBJADDVERTEX 0, 1, 0, 0, 0, RGB(255, 255, 255)
      X_OBJADDVERTEX SIN(i)*2, 0, COS(i)*2, 0, 0, RGB(255, 255, 255)
      X_OBJADDVERTEX 0, -1, 0, 0, 0, RGB(255, 255, 255)
      X_OBJADDVERTEX -SIN(i)*2, 0, -COS(i)*2, 0, 0, RGB(255, 255, 255)
  NEXT
X_OBJEND


LOCAL phi, psi    // angles for camera x-z and y-z
phi = 90

WHILE TRUE

  // for camera movement
  IF KEY(KEY_LEFT) THEN INC phi, 1
  IF KEY(KEY_RIGHT) THEN DEC phi, 1
  IF KEY(KEY_UP) THEN INC psi, 1
  IF KEY(KEY_DOWN) THEN DEC psi, 1
  IF phi > 359 THEN phi = 0
  IF phi < 0 THEN phi = 359
  IF psi > 45 THEN psi = 45
  IF psi < 0 THEN psi = 0
 
  dx = COS(phi) * COS(psi)
  dy = SIN(psi)
  dz = -SIN(phi) * COS(psi)  
 
  X_MAKE3D 1, 1000, 45
  X_CAMERA 0, 1, 0, dx, dy+1, dz
 
  // draw the ground
  X_DRAWOBJ 0, 0
 
  // draw the snowflakes
  FOR i = 0 TO MAX_SNOW - 1
    X_MOVEMENT snow[i].x, snow[i].y, snow[i].z
    X_ROTATION angle, 1, 0, 1
    X_DRAWOBJ 1, 0
    INC snow[i].angx, 2
    IF snow[i].angx > 359 THEN snow[i].angx = 0
    INC snow[i].angz, 2
    IF snow[i].angz > 356 THEN snow[i].angz = 0
    INC snow[i].x, SIN(snow[i].angx)/2
    INC snow[i].z, SIN(snow[i].angz)/2
    DEC snow[i].y, snow[i].speed
    IF snow[i].y < 0
      snow[i].x = RAND(-1000, 1000)
      snow[i].y = 1000
      snow[i].z = RAND(-1000, 1000)
      snow[i].speed = RND(10) / 10 + 1
      snow[i].angx = RND(360)
      snow[i].angz = RND(360)
    ENDIF
  NEXT
  INC angle, 1
  IF angle > 359 THEN angle = 0
 
  SHOWSCREEN
 
WEND

// ------------------------------------------------------------- //
// ---  RAND  ---
// ------------------------------------------------------------- //
FUNCTION RAND: minimum, maximum
  RETURN minimum + RND(-minimum + maximum)
ENDFUNCTION // RAND
Title: Schneegestöber - ein erster zaghafter Versuch
Post by: Schranz0r on 2008-Apr-26
Wirklich erste Sahne!
Finds auch cool das du mein RAND auch immer schön benutzt :)
Title: Schneegestöber - ein erster zaghafter Versuch
Post by: WPShadow on 2008-Apr-26
Gefällt mir!

Geht das auch mit Seitenwind?
Title: Schneegestöber - ein erster zaghafter Versuch
Post by: Quentin on 2008-Apr-26
*ggg* ja Schranzor, dein RAND ist fester Bestandteil aller Spielereien, die ich mit GL so verunstalte äh veranstalte. Gernot sollte das als festen Befehl mit einbauen ;)

ja WP, das wäre vielleicht ein weitere nette Spielerei. Wie soll mans umsetzen? Per Zufall? Newton raff ich noch nicht.
Title: Schneegestöber - ein erster zaghafter Versuch
Post by: WPShadow on 2008-Apr-26
Einfach einen Wind von Richtung x oder so, dachte ich.

Also

Windrichtung_x = 0.15
Windrichtung_y = 0.80

oder so. Da es ja nach unten fällt, kann der Wind von vorne/hinten oder links/rechts kommen. Dann könnte man es ja total cool in ein Spiel einbauen. :D
Title: Schneegestöber - ein erster zaghafter Versuch
Post by: Schranz0r on 2008-Apr-26
Kannste auch so schon
Title: Schneegestöber - ein erster zaghafter Versuch
Post by: WPShadow on 2008-Apr-26
Muss mir mal das ganze Programm ansehen. Wird wohl eher morgen werden... :)
Title: Re: Schneegestöber - ein erster zaghafter Versuch
Post by: Tenorm on 2008-May-18
Hi Quentin,

da mein Schnee in einer meiner Projekte stark angezweifelt wurde =D , wollt ich mal fragen, ob man deinen Schnee in ein Projekt einbauen darf (einfach nehmen wär irgendwie fies...).

Gruß

Tenorm
Title: Re: Schneegestöber - ein erster zaghafter Versuch
Post by: Schranz0r on 2008-May-18
Codeschnippel sind frei verfügbar!
Alles was unter dieser Rubrik zu finden ist, ist opensource ;) daher auch für jeden der es brauch einsetztbar.  =)
Title: Re: Schneegestöber - ein erster zaghafter Versuch
Post by: Quentin on 2008-May-18
hab ich dir schon in deinem Thread zu Helix Bugs beantwortet. Selbstverständlich darfst du, daür stehen die Dinger doch hier  =)
hab nur nicht gedacht, daß mein Schneetreiben zu irgendetwas nütze wäre

Genau Schranzor, das wollte ich damit sagen  :booze:
Title: Re: Schneegestöber - ein erster zaghafter Versuch
Post by: WPShadow on 2008-May-18
Kannst du vielleicht wirklich einen Wind oder so einbauen? Oder mir zumindest sagen, wo ich den einsetzen muß? Ich blick da nämlich ehrlich gesagt nicht ganz durch...  :nw:
Title: Re: Schneegestöber - ein erster zaghafter Versuch
Post by: Tenorm on 2008-May-21
Wenn du nicht zu anspruchsvoll bist kannst du ja so tun als wäre KEY(203) oder KEY(205) immer TRUE, dann bewegt sich das ganze immer schön in eine Richtung (links oder rechts, jenachdem) :lol:
Title: Re: Schneegestöber - ein erster zaghafter Versuch
Post by: Schranz0r on 2008-May-21
Wind ist total simpel, doch der Code an sich erlaubt das nicht ganz ;)
Sonnst zieht der Schnee vorbei, und du stehst im trocken :P
Title: Re: Schneegestöber - ein erster zaghafter Versuch
Post by: Quentin on 2008-Aug-02
und bitteschön, 3D-Schnee mit Wind.

Die Kamera blickt beim Programstart nach Norden. Mit den Tasten N, S, W, E kann man den Wind aus verschiedenen Himmelsrichtungen wehen lassen. Solange man eine der Tasten gedrückt hält, wird der Wind beständig stärker bis zu seiner Maximalgeschwindigkeit (hier 3). Lässt man die Taste los, flaut der Wind langsam wieder ab. Durch gleichzeitiges Drücken verschiedener Tasten kannman die Zwischenhimmelsrichtungen wie Nord-Ost oder Südwest simulieren.

Damit man, wie Schranzor so schön sagte, bei starkem Wind nicht auf einmal im trockenen steht, werden die Schneeflocken ab einer bestimmten Entfernung auf der gegenüberliegenden Seite wieder gezeigt.

Code (glbasic) Select

// --------------------------------- //
// Project: 3D-Schnee
// Start: Monday, April 14, 2008
// IDE Version: 5.204

GLOBAL KEY_LEFT = 203     // turn camera left
GLOBAL KEY_RIGHT = 205    // turn camera right
GLOBAL KEY_UP = 200       // turn camera up
GLOBAL KEY_DOWN = 208     // turn camera down
GLOBAL KEY_SPACE = 57     // make wind
GLOBAL MAX_SNOW = 5000

GLOBAL KEY_N = 49         // wind from north
GLOBAL KEY_S = 31         // wind form south
GLOBAL KEY_W = 17         // wind from west
GLOBAL KEY_E = 18         // wind from east
GLOBAL MAX_WIND = 3       // maximum speed of wind
GLOBAL MAX_RANGE = 1000   // max range of snowflakes from camera position
                         
// the current speed of the wind from all directions
GLOBAL cur_wind_north, cur_wind_south, cur_wind_west, cur_wind_east


TYPE t_snow
  x; y; z
  speed
  angx
  angz
ENDTYPE
LOCAL snow[] AS t_snow
DIM snow[MAX_SNOW]

// init snow
FOREACH s IN snow[]
  s.x = RAND(-1000, 1000)
  s.y = RND(1000)
  s.z = RAND(-1000, 1000)
  s.speed = RND(10) / 10 + 1
  s.angx = RND(360)
  s.angz = RND(360)
NEXT


// ground
X_OBJSTART 0
  X_OBJADDVERTEX -1000, 0, -1000, 0, 0, RGB(80, 80, 80)
  X_OBJADDVERTEX -000, 0, -1000, 0, 0, RGB(80, 80, 80)
  X_OBJADDVERTEX 1000, 0, 1000, 0, 0, RGB(80, 80, 80)
  X_OBJADDVERTEX -1000, 0, 1000, 0,0, RGB(80, 80, 80)
X_OBJEND

// snowflake
X_OBJSTART 1
  FOR i = 0 TO 360 STEP 45
    X_OBJNEWGROUP
      X_OBJADDVERTEX 0, 1, 0, 0, 0, RGB(255, 255, 255)
      X_OBJADDVERTEX SIN(i)*2, 0, COS(i)*2, 0, 0, RGB(255, 255, 255)
      X_OBJADDVERTEX 0, -1, 0, 0, 0, RGB(255, 255, 255)
      X_OBJADDVERTEX -SIN(i)*2, 0, -COS(i)*2, 0, 0, RGB(255, 255, 255)
  NEXT
X_OBJEND


LOCAL phi, psi    // angles for camera x-z and y-z
phi = 90

WHILE TRUE

  // for camera movement
  IF KEY(KEY_LEFT) THEN INC phi, 1
  IF KEY(KEY_RIGHT) THEN DEC phi, 1
  IF KEY(KEY_UP) THEN INC psi, 1
  IF KEY(KEY_DOWN) THEN DEC psi, 1
  IF phi > 359 THEN phi = 0
  IF phi < 0 THEN phi = 359
  IF psi > 45 THEN psi = 45
  IF psi < 0 THEN psi = 0

  // make wind with keys N, S, W, E
  IF KEY(KEY_N)
    IF cur_wind_north < MAX_WIND THEN INC cur_wind_north, .01
  ELSE
    IF cur_wind_north > 0 THEN DEC cur_wind_north, .01
  ENDIF
  IF KEY(KEY_S)
  IF cur_wind_south < MAX_WIND THEN INC cur_wind_south, .01
  ELSE
  IF cur_wind_south > 0 THEN DEC cur_wind_south, .01
  ENDIF
  IF KEY(KEY_W)
  IF cur_wind_west < MAX_WIND THEN INC cur_wind_west, .01
  ELSE
    IF cur_wind_west > 0 THEN DEC cur_wind_west, .01
  ENDIF
  IF KEY(KEY_E)
    IF cur_wind_east < MAX_WIND THEN INC cur_wind_east, .01
  ELSE
    IF cur_wind_east > 0 THEN DEC cur_wind_east, .01
  ENDIF

  // calculate new camera position
  dx = COS(phi) * COS(psi)
  dy = SIN(psi)
  dz = -SIN(phi) * COS(psi)

  X_MAKE3D 1, 1000, 45
  X_CAMERA 0, 1, 0, dx, dy+1, dz

  // draw the ground
  X_DRAWOBJ 0, 0

  // draw the snowflakes
  FOREACH s IN snow[]
    X_MOVEMENT s.x, s.y, s.z
    X_ROTATION angle, 1, 0, 1
    X_DRAWOBJ 1, 0
    INC s.angx, 2
    IF s.angx > 359 THEN s.angx = 0
    INC s.angz, 2
    IF s.angz > 359 THEN s.angz = 0
    // add the wind to the x and z coordinates
    // if a snowflake is out of range, set it to the opposite site
    s.x = s.x + SIN(s.angx) / 2 + cur_wind_west - cur_wind_east
    s.z = s.z + SIN(s.angz) / 2 + cur_wind_north - cur_wind_south
    IF s.x < -MAX_RANGE THEN s.x = MAX_RANGE
    IF s.x > MAX_RANGE THEN s.x = -MAX_RANGE
    IF s.z < -MAX_RANGE THEN s.z = MAX_RANGE
    IF s.z > MAX_RANGE THEN s.z = -MAX_RANGE
    DEC s.y, s.speed
    // if a snowflake reaches the groud, create a new one
    IF s.y < 0
      s.x = RAND(-1000, 1000)
      s.y = 1000
      s.z = RAND(-1000, 1000)
      s.speed = RND(10) / 10 + 1
      s.angx = RND(360)
      s.angz = RND(360)
    ENDIF
  NEXT

  INC angle, 1
  IF angle > 359 THEN angle = 0

  X_MAKE2D
  PRINT "Wind from north:  " + FORMAT$(4, 2, cur_wind_north), 0, 0
  PRINT "Wind from south:  " + FORMAT$(4, 2, cur_wind_south), 0, 20
  PRINT "Wind from west:   " + FORMAT$(4, 2, cur_wind_west), 0, 40
  PRINT "Wind from east:   " + FORMAT$(4, 2, cur_wind_east), 0, 60

  SHOWSCREEN

WEND

// ------------------------------------------------------------- //
// ---  RAND  ---
// ------------------------------------------------------------- //
FUNCTION RAND: minimum, maximum
  RETURN minimum + RND(-minimum + maximum)
ENDFUNCTION // RAND
Title: Re: Schneegestöber - ein erster zaghafter Versuch
Post by: WPShadow on 2008-Aug-04
Sieht super aus! Das baue ich gleich ein, wenn ich soweit mal alles hingekommen habe...  :good: