| Autor |
Beitrag |
Calyptus
      
Beiträge: 386
Win Xp Prof
D3, D6 Pers, D7 Ent
|
Verfasst: Mo 13.12.04 18:14
Ich möchte ein Programm schreiben, welches es auf meinem desktop schneien läst. Aber ich weiß nicht so genau wie ich den Fall der flocken berechnen soll. hat schonmal jmd eine funktion o. ä. dazu geschrieben
oder kann mit jmd ein tipp geben?
Danke schonmal
_________________ Luft- und Raumfahrtechnik an der Uni Stuttgart
|
|
StefanH
      
Beiträge: 1144
Win XP
D5 Standard, D7 Pers, D2005 Pers
|
Verfasst: Mo 13.12.04 20:14
ich hab von irgendwo her sowas in JavaScript, wenns dir hilft, kann ich es ja posten... 
_________________ "Als es noch keine Computer gab, war das Programmieren noch relativ einfach."(Edsger W. Dijkstra)
"Ich bin nicht von Sinnen, sondern ich rede wahre und vernünftige Worte." (Paulus)
|
|
MartinPb
      
Beiträge: 698
|
Verfasst: Mo 13.12.04 20:37
Suchst du etwas in der Art?
ezshare.de/files-de/...58/snowtest.zip.html
Der Quellcode ist nicht dabei, da er nicht besonders sauber programmiert ist. Ich hab damals ein wenig experimentiert. Der Schnee alleine ist nicht das Problem. Hier im Beispielprogramm hat der Schnee Hindernisse die ihn aufhalten. Aber ich hab eine Bremse in die Demo eingebaut. Du kannst den Fall auf eine Sekunde verlangsamen. Wenn das die Richtung ist die du willst, dann kann ich dir in etwa beschreiben wie du es programmieren kannst. Aber nur den Schneefall. Den Rest, also der Part wo der Schnee auf dem Hindernis bleibt, ist noch nicht fertig. Da müßte ich mich erst paar Stunden an den Code setzten. Deshalb auch der fehlende Quellcode.
Also sag ob das die Richtung ist, dann mache ich eine Beschreibung.
_________________ Gruß
Martin
|
|
Calyptus 
      
Beiträge: 386
Win Xp Prof
D3, D6 Pers, D7 Ent
|
Verfasst: Mo 13.12.04 23:55
Erst mal danke an euch beide
@StefanH: Wäre net.
@MartinPb: Goil. Genau nach sowas hab ich gesucht. Wäre cool wenn du mir sagen würdest wie du das gemacht hast. 2 Fragen noch: 1.Was ist an dem Teil mit dem Hindernis noch nicht fertig? 2. Hast du da bei der Clonk Engine abgeschaut? Da verhält sich der Schnee genau so.
//edit: Noch ne Frage: Glaubst du das es möglich ist, die Symbole auf dem Desktop und vllt sogar den Mauszeiger als solche Hindernisse zu verwenden?
_________________ Luft- und Raumfahrtechnik an der Uni Stuttgart
|
|
MartinPb
      
Beiträge: 698
|
Verfasst: Di 14.12.04 11:09
Abgeschaut ist da nichts, denn es gibt nur eine Möglichkeit es zu tun. Das ganze ist relativ einfach zu machen. Mein Code ist deswegen nicht perfekt, weil ich es z.B. ohne ScanLine geschrieben habe. Mein Code wird somit auf langsamen Rechnern auch langsam. Mir ging es damals mehr um das Prinzip als um ein Programm. Wenn du dir den Schnee genauer anguckst, dann wirst du sehen, daß er nicht nur durchläuft, sondern an Hindernissen runter rollt. Ich wollte das ganze zuerst mal so testen und dan später optimieren. Das Optimieren kamm aber nie. Für das einfach Schneien reicht aber auch ein einfacher Code. Grob funktioniert das so:
1. du erstellst ein Record mit x, y Koordinaten und Ebenentiefe.
2. du erstellst ein Array von Record
3. du berechnest den Anfangswert mit Zufalszahl: x, y und 1 bis 4 für die Ebenentiefe.
Das mit der Ebenentiefe hat follgenden Sinn: der ganze Schnee soll 3-Dimensional wirken. Das machen wir mit 4 Ebenen. Ebene 4 ist die am weitesten hinten. Pro Schleife bewegt sie sich die Schneeflocke nur ein Pixel nach unten. Die Farbe ist nicht weiß, sondern mittelgrau. Die Schneeflocke flackert nicht weil sie weit entfernt ist und man auf diese Entfernung es nicht sieht. Diese drei Punkte lassen die Schneeflocke weit weg erscheinen. Die Ebene 3 Flocke bewegt sich etwas schneller, also 2 Pixel und die Farbe ist etwas heller. Sonst ändert sich nichts. Diese Flocke erscheint somit näher. Ebene 2 Flocke bewegt sich 3 Pixel pro Schleife, hat ein helles grau und macht eine einfache zickzack Bewegung. Das läst die Flocke flackern. Die Ebene 1 macht dan 4 Pixel pro Schleife, ist weiß und macht eine größere zickzack Bewegung. So erschint der Schnee 3-Dimensional.
Ich hab mal schnell und ohne den anderen Code zu bemühen ein simples Beispiel geschrieben. Es läßt den Schnee einfach durchlaufen. Geschrieben in etwa 20 Minuten. Den Rest mußt du selbst machen:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80:
| type TSnow = record x: Integer; y: Integer; e: Byte; s: Boolean; xold: Integer; yold: Integer; end;
const SnowMax = 999; SnowW = 1024; SnowH = 764;
var Snow: array[0..SnowMax] of TSnow;
procedure SnowFirst; var i: Integer; begin for i := 0 to SnowMax do with Snow[i] do begin x := Random(SnowW); y := Random(SnowH); e := Random(4) + 1; xold := -1; yold := -1; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin Color := clBlack; SnowFirst; Timer1.Enabled := True; end;
procedure TForm1.Timer1Timer(Sender: TObject); var i: Integer; begin for i := 0 to SnowMax do with Snow[i] do begin Canvas.Pixels[xold, yold] := clBlack;
case e of 1: begin if s then Inc(x, 2) else Dec(x, 2); s := not s; y := y + 4; Canvas.Pixels[x, y] := $00FFFFEE; end; 2: begin if s then Inc(x, 1) else Dec(x, 1); s := not s; y := y + 3; Canvas.Pixels[x, y] := $00DDDDDD; end; 3: begin x := x; y := y + 2; Canvas.Pixels[x, y] := $00BBBBBB; end; 4: begin x := x; y := y + 1; Canvas.Pixels[x, y] := $00999999; end; end;
xold := x; yold := y;
if x > SnowW then x := 0; if y > SnowH then y := 0; end; end; |
_________________ Gruß
Martin
|
|
StefanH
      
Beiträge: 1144
Win XP
D5 Standard, D7 Pers, D2005 Pers
|
Verfasst: Di 14.12.04 15:53
ok, es regnet
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123:
| <SCRIPT LANGUAGE="JavaScript"> var no = 50; var speed = 1; var ns4up = (document.layers) ? 1 : 0; var ie4up = (document.all) ? 1 : 0; var s, x, y, sn, cs; var a, r, cx, cy; var i, doc_width = 800, doc_height = 600;
if (ns4up) { doc_width = self.innerWidth; doc_height = self.innerHeight; } else if (ie4up) { doc_width = document.body.clientWidth; doc_height = document.body.clientHeight; }
x = new Array(); y = new Array(); r = new Array(); cx = new Array(); cy = new Array(); s = 8;
for (i = 0; i < no; ++ i) { initRain(); if (ns4up) { if (i == 0) { document.write("<layer name=\"dot"+ i +"\" left=\"1\" "); document.write("top=\"1\" visibility=\"show\"><font color=\"blue\">"); document.write(",</font></layer>");
} else { document.write("<layer name=\"dot"+ i +"\" left=\"1\" "); document.write("top=\"1\" visibility=\"show\"><font color=\"blue\">"); document.write(",</font></layer>"); } } else if (ie4up) { if (i == 0) { document.write("<div id=\"dot"+ i +"\" style=\"POSITION: "); document.write("absolute; Z-INDEX: "+ i +"; VISIBILITY: "); document.write("visible; TOP: 15px; LEFT: 15px;\"><font color=\"blue\">"); document.write(",</font></div>"); } else { document.write("<div id=\"dot"+ i +"\" style=\"POSITION: "); document.write("absolute; Z-INDEX: "+ i +"; VISIBILITY: "); document.write("visible; TOP: 15px; LEFT: 15px;\"><font color=\"blue\">"); document.write(",</font></div>"); } } }
function initRain() { a = 6; r[i] = 1; sn = Math.sin(a); cs = Math.cos(a); cx[i] = Math.random() * doc_width + 1; cy[i] = Math.random() * doc_height + 1; x[i] = r[i] * sn + cx[i]; y[i] = cy[i]; }
function makeRain() { r[i] = 1; cx[i] = Math.random() * doc_width + 1; cy[i] = 1; x[i] = r[i] * sn + cx[i]; y[i] = r[i] * cs + cy[i]; }
function updateRain() { r[i] += s; x[i] = r[i] * sn + cx[i]; y[i] = r[i] * cs + cy[i]; }
function raindropNS() { for (i = 0; i < no; ++ i) { updateRain(); if ((x[i] <= 1) || (x[i] >= (doc_width - 20)) || (y[i] >= (doc_height - 20))) { makeRain(); doc_width = self.innerWidth; doc_height = self.innerHeight; } document.layers["dot"+i].top = y[i]; document.layers["dot"+i].left = x[i]; }
setTimeout("raindropNS()", speed); }
function raindropIE() { for (i = 0; i < no; ++ i) { updateRain(); if ((x[i] <= 1) || (x[i] >= (doc_width - 20)) || (y[i] >= (doc_height - 20))) { makeRain(); doc_width = document.body.clientWidth; doc_height = document.body.clientHeight; }
document.all["dot"+i].style.pixelTop = y[i]; document.all["dot"+i].style.pixelLeft = x[i]; }
setTimeout("raindropIE()", speed); }
if (ns4up) { raindropNS(); } else if (ie4up) { raindropIE(); } </script> |
aber du wirst es ja nicht mehr brauchen, oder?
_________________ "Als es noch keine Computer gab, war das Programmieren noch relativ einfach."(Edsger W. Dijkstra)
"Ich bin nicht von Sinnen, sondern ich rede wahre und vernünftige Worte." (Paulus)
|
|
Calyptus 
      
Beiträge: 386
Win Xp Prof
D3, D6 Pers, D7 Ent
|
Verfasst: Di 14.12.04 18:35
Nochmal: Danke an beide!
@MartinPb: noch eine frage: Kannst du mir sagen wie das mit der kollision funktionier? wenigstens ein ansatz?
_________________ Luft- und Raumfahrtechnik an der Uni Stuttgart
|
|
MartinPb
      
Beiträge: 698
|
Verfasst: Di 14.12.04 19:57
Leider nein. Ich hab das Programm vor paar Jahren geschrieben. Ich kann mich zwar noch grob dran erinnern, aber ich weiß auch, daß ich etliche Varianten hatte, da keine so richtig 100%'ig finktionierte. Zwar sah das Ergebnis in der Regel immer wieder gut aus, aber sonst gab es irgendwo immer Probleme. Am besten versuchst du dein Glück aufs neue. Ich müßte mich wieder dran setzten und ein neues Konzept erstellen.
_________________ Gruß
Martin
|
|
|