Autor Beitrag
Calyptus
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 386

Win Xp Prof
D3, D6 Pers, D7 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1144

Win XP
D5 Standard, D7 Pers, D2005 Pers
BeitragVerfasst: Mo 13.12.04 20:14 
ich hab von irgendwo her sowas in JavaScript, wenns dir hilft, kann ich es ja posten... :roll:

_________________
"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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 698



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 386

Win Xp Prof
D3, D6 Pers, D7 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 698



BeitragVerfasst: 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:

ausblenden volle Höhe Delphi-Quelltext
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1144

Win XP
D5 Standard, D7 Pers, D2005 Pers
BeitragVerfasst: Di 14.12.04 15:53 
ok, es regnet :lol:

ausblenden volle Höhe Quelltext
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 Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 386

Win Xp Prof
D3, D6 Pers, D7 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 698



BeitragVerfasst: 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