Neuauflage: Die meisten Beiträge sind leider leer :(
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
Schade,
bei mir wird folgendes ausgegeben:
Quote"Grafikanzeige.gbas"(97) error : wrong argument type : INC, arg no: 1
TYPE is not declared
Auweia, übersetzen, na mal sehen.
@Antidote
seltsam, hast das neueste Update gezogen? Ansonsten versuch vielleicht mal in der Funktion Update_Snow() statt
LOCAL lsnow
LOCAL lsnow AS tSnowFlake
zu schreiben, vielleicht hilfts
@Quentin
Ahhh, ich war nicht up2date ;)
Geht aber auch schneller als man gucken kann mit diesen Updates :))
Schöne Schneeflocken, einfach nur gecodet...toll
Sieht toll aus!
Sauber gecodet, gut dokumentiert.
jopp ganz nett, aber noch paar schönheitsfehler drin:
// 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 .....
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.
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
Gefällt mir gut! Gibt's das auch in 3D? hehehe
War bloß ein Scherz. Ist wirklich super Arbeit! =)
Quote from: WPShadowGefällt mir gut! Gibt's das auch in 3D? hehehe
yep, sobald ich einen Schimmer von 3D in GLBasic hab ;-)
ist doch wirklich einfach :D
3D mein ich jetzt , da musste gernet viel ändern am Code
so, muss den alten Wirsing hier noch mal ausgraben, denn endlich gibt es jetzt 3D-Schnee, worauf die ganze GL-Community nicht gewartet hat ;)
// --------------------------------- //
// 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
Wirklich erste Sahne!
Finds auch cool das du mein RAND auch immer schön benutzt :)
Gefällt mir!
Geht das auch mit Seitenwind?
*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.
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
Kannste auch so schon
Muss mir mal das ganze Programm ansehen. Wird wohl eher morgen werden... :)
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
Codeschnippel sind frei verfügbar!
Alles was unter dieser Rubrik zu finden ist, ist opensource ;) daher auch für jeden der es brauch einsetztbar. =)
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:
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:
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:
Wind ist total simpel, doch der Code an sich erlaubt das nicht ganz ;)
Sonnst zieht der Schnee vorbei, und du stehst im trocken :P
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.
// --------------------------------- //
// 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
Sieht super aus! Das baue ich gleich ein, wenn ich soweit mal alles hingekommen habe... :good: