 |
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 |
neo

Anmeldungsdatum: 21.12.2006 Beiträge: 4 Wohnort: Thüringen
|
Verfasst am: 22.12.2006, 01:00 Titel: Schnee: es soll schneien |
|
|
Hallo, ich benutze QuickBASIC 4.5 dt. und schätze mich als fortgeschrittenen BASIC-Programmierer ein.
Dennoch habe ich das Problem, dass ich nicht weiss, wie ich mehrere Schneeflocken zu unterschiedlichen Zeitpunkten darstellen kann.
Ich habe schon im Forum gesucht und auch die QB-Monster-FAQ durchforstet, aber keine Hinweise gefunden.
Code: | RANDOMIZE TIMER
SCREEN 13
CLS
COLOR 4
LOCATE 11, 6:PRINT "Frohe Weihnachten - Merry X-Mas!"
LINE (1, 199) - (319, 199), 15 'weiße Linie unten (Boden)
'Baum1
LINE (50, 130) - (58, 198), 6, BF
ta = 54
t = 54
FOR tanne = 1 TO 50 STEP 2
LINE (54, 100 + tanne)-(ta, 125 + tanne), 2
LINE (54, 100 + tanne)-(t, 125 + tanne), 2
ta = ta + 1.5
t = t - 1.5
NEXT
'Baum2
LINE (250, 150) - (258, 198), 6, BF
ta = 254
t = 254
FOR tanne = 1 TO 40 STEP 2
LINE (254, 120 + tanne)-(ta, 145 + tanne), 2
LINE (254,120 + tanne)-(t, 145 + tanne), 2
ta = ta + 1
t = t - 1
NEXT
'Schnee
DO
x = 160
x = RND * 319
y = 2
flockenfarbe:
ff% = RND * 31
IF ff% < 28 THEN GOTO flockenfarbe
FOR f = 1 TO 200
nochmal:
lr% = RND * 2
IF lr% = 0 THEN x = x - 1 'Flocke nach links
IF lr% = 2 THEN x = x + 1 'Flocke nach rechts
IF x = 0 THEN x = 1 'Flocke soll nicht links aus dem Bildschirm
IF x = 320 THEN x = 319 'Flocke soll nicht rechts aus dem Bildschirm
'Kontrolle was sich unter und links/rechts unter der Flocke befindet
IF POINT(x, y) <> 0 AND POINT(x - 1, y) <> 0 AND POINT(x + 1, y) <> 0 THEN GOTO flocke
IF POINT(x, y) <> 0 AND POINT(x - 1, y) = 0 AND POINT(x + 1, y) = 0 THEN GOTO nochmal
IF POINT(x, y) <> 0 AND POINT(x - 1, y) <> 0 AND POINT(x + 1, y) = 0 THEN x = x + 1
IF POINT(x, y) <> 0 AND POINT(x - 1, y) = 0 AND POINT(x + 1, y) <> 0 THEN x = x - 1
PSET (x, y), ff% 'Flocke wird gezeichnet
'WAIT &H3DA, 8 'Pause
PSET (x, y), 0 'Flocke wird gelöscht
y = y + 1 'Flocke eins tiefer
NEXT
flocke:
PSET (x, y - 1), ff% 'FLocke bleibt liegen
LOOP UNTIL INKEY$ <> ""
COLOR 15
END |
Kann mir jemand helfen?
Gruß neo
ps: Kommentare, Kritik oder Verbesserungsvorschläge zum ganzen Programm könnt ihr auch zum Besten geben! |
|
Nach oben |
|
 |
The real Agent D

Anmeldungsdatum: 24.11.2005 Beiträge: 605 Wohnort: Hall i. T.
|
Verfasst am: 22.12.2006, 12:35 Titel: |
|
|
Erstmal willkommen im Forum.
Zum Problem: Wie wäre es, wenn du ein Zweidimensionales Array erstellst, das du nach zufall füllst. Das Array zauberst du mit PUT auf den Bildschirm. Dann lässt du es einfach nach unten sinken und "schiebst" es immer wieder von oben nach.
mfg
The real Agent D |
|
Nach oben |
|
 |
neo

Anmeldungsdatum: 21.12.2006 Beiträge: 4 Wohnort: Thüringen
|
Verfasst am: 22.12.2006, 13:32 Titel: |
|
|
Mh ok, aber der Schnee soll zum einen auch liegen bleiben und sich so verhalten, wie ich's bereits programmiert habe...
Hier nochmal das Programm zum runterladen, damit du/ihr ein besseres Bild davon bekommt, wie ich mir das vorstelle.
Ihr könnt es natürlich für den Eigenbedarf verwenden und damit machen, was ihr wollt...
schnee01.bas _________________ Hobby-Programmierer mit QuickBASIC 4.5dt
Zuletzt bearbeitet von neo am 22.12.2006, 13:41, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
The real Agent D

Anmeldungsdatum: 24.11.2005 Beiträge: 605 Wohnort: Hall i. T.
|
Verfasst am: 22.12.2006, 13:39 Titel: |
|
|
Zitat: |
Mh ok, aber der Schnee soll auch liegen bleiben...
|
Na dann mach doch mehrere Linien, ide immer weiter hinauf steigen. |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 22.12.2006, 13:44 Titel: |
|
|
Hallo
Du könntest es vielleicht irgendwie so machen:
Code: | SCREEN 13
CLS
maxflocken = 200 'Anzahl gleichzeitig angezeigter Flocken
DIM y(1 TO maxflocken)
DIM x(1 TO maxflocken)
DIM v(1 TO maxflocken)
RANDOMIZE TIMER
k = .1 'Konstante f?uer die Fallgeschwindigkeit
FOR flocke = 1 TO maxflocken
GOSUB neueflocke
y(flocke) = RND * 200 'Zu Beginn Flocken ue?berall verteilen
NEXT
DO
FOR flocke = 1 TO maxflocken
PSET (x(flocke), y(flocke)), 0
y(flocke) = y(flocke) + v(flocke)
IF y(flocke) > 199 THEN GOSUB neueflocke
PSET (x(flocke), y(flocke)), 15
NEXT
LOOP
END
neueflocke:
y(flocke) = 0
x(flocke) = FIX(RND * 320)
v(flocke) = RND * k + k
RETURN |
Für jede Flocke werden nicht nur x- und y-Position gespeichert, sondern auch die Fallgeschwindigkeit. Dadurch, dass letztere unterschiedlich gross ist, entsteht noch sowas wie ein Eindruck von räumlicher Tiefe, die schnelleren Flocken scheinen näher als die langsamen. Das Liegenbleiben ist so allerdings etwas tricky, weil schnelle Flocken beim überholen einer langsameren in der gleichen Spalte hängenbleiben können. Da könnte man vielleicht noch einbauen, das in einer Spalte erst wieder eine neue Flocke erzeugt wird, wenn dort keine mehr unterwegs ist.
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 22.12.2006, 20:40 Titel: |
|
|
dann klönnte man noch das attribut "liegtschon" einbauen. wenn dieses gesetzt ist, können auch andere flocken auf der aktuellen flocke liegen bleiben.
noch ein tipp zur Tiefe: wie schon erwähnt, kann durch unterschiedlich schenelle flocken tiefe erzeugt werden. wenn du das programm im screen 13 ablaufen lässt, kannst du deine Flocken mit den Farben 16 bis 31 auch noch in unterschiedlichen grautönen (passend zur geschwindigkeit: hellere farbe = schneller) darstellen. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
croco97

Anmeldungsdatum: 04.11.2005 Beiträge: 260
|
Verfasst am: 22.12.2006, 23:37 Titel: |
|
|
Kann es sein, dass der Aufbau deines Proggis etwas Probleme macht? Da bewegt sich immer nur eine Flocke auf einmal von ganz oben nach ganz unten. "Ein-Flocken-Schneien" sozusahen. Folge das Klimawandels?
Du bräuchtest für jede Schneeflocke Koordinaten, also:
Code: |
const nflocke=100
Dim x(nflocke) as integer
Dim y(nflocke) as integer
'Initialisiere alle x und y
while (inkey$="")
FOR i=0 to nflocke-1
'Hier bewegst du x(i) und y(i) nach unten, ziemlich genauso, wie
'du's schon gemacht hast.
NEXT i
wend
|
Schau dir mal fallingwater von Jojo an. Das liegt ganz nahe an deinem Problem.
Viel Erfolg und schöne Weihnachten!
Croco |
|
Nach oben |
|
 |
neo

Anmeldungsdatum: 21.12.2006 Beiträge: 4 Wohnort: Thüringen
|
Verfasst am: 23.12.2006, 07:00 Titel: |
|
|
Moin! Wow, ihr seid echt klasse Leute!
Danke an Alle, für die vielen Vorschläge! Es können natürlich noch weitere gemacht werden, aber ich habe auf jeden Fall schon mal wieder was neues gelernt und neue Anregungen von euch bekommen, um weiter zu basteln.
Mit dem DIM-Befehl habe ich mich bisher leider noch nicht genau beschäftigt bzw. angefreundet. (Asche auf mein Haupt ) Sollte ich wohl mal (eingehend) tun... (Monster-FAQ usw...)
Skilltronic, deine Version funktioniert soweit super! Ich werde Jojo's Anregungen noch mit einfliessen lassen und jetzt gleich noch croro's Version probieren...
Ich wünsche Euch allen ebenfalls frohe Weihnachten!
Gruß
neo
ps: ich schau mal, ob ich kurz vor Weihnachten oder zwischen den Festen noch eine überarbeitete oder neue Version meines Schnee-Programmes online stellen kann _________________ Hobby-Programmierer mit QuickBASIC 4.5dt |
|
Nach oben |
|
 |
Skilltronic

Anmeldungsdatum: 10.09.2004 Beiträge: 1148 Wohnort: Köln
|
Verfasst am: 23.12.2006, 15:27 Titel: |
|
|
Hallo
Ich habe mir mal erlaubt, meinen Schnee in dein Programm einzubauen:
Code: | RANDOMIZE TIMER
SCREEN 13
CLS
maxflocken = 200
DIM y(1 TO maxflocken)
DIM x(1 TO maxflocken)
DIM v(1 TO maxflocken)
DIM ff%(1 TO maxflocken)
DIM belegt(319)
k = .05 'Zeitkonstante fuer die Fallgeschwindigkeit
COLOR 4
LOCATE 11, 6: PRINT "Frohe Weihnachten - Merry X-Mas!"
LINE (1, 199)-(319, 199), 15 'weiße Linie unten (Boden)
'Baum1
LINE (50, 130)-(58, 198), 6, BF
ta = 54
t = 54
FOR tanne = 1 TO 50 STEP 2
LINE (54, 100 + tanne)-(ta, 125 + tanne), 2
LINE (54, 100 + tanne)-(t, 125 + tanne), 2
ta = ta + 1.5
t = t - 1.5
NEXT
'Baum2
LINE (250, 150)-(258, 198), 6, BF
ta = 254
t = 254
FOR tanne = 1 TO 40 STEP 2
LINE (254, 120 + tanne)-(ta, 145 + tanne), 2
LINE (254, 120 + tanne)-(t, 145 + tanne), 2
ta = ta + 1
t = t - 1
NEXT
'Schnee
FOR flocke = 1 TO maxflocken
GOSUB neueflocke
DO
y(flocke) = RND * 200
LOOP UNTIL POINT(x(flocke), y(flocke)) = 0
NEXT
DO
FOR flocke = 1 TO maxflocken
PSET (x(flocke), y(flocke)), 0
y(flocke) = y(flocke) + v(flocke)
IF POINT(x(flocke), y(flocke) + 1) <> 0 THEN
PSET (x(flocke), y(flocke)), ff%(flocke)
GOSUB neueflocke
ELSE
PSET (x(flocke), y(flocke)), ff%(flocke)
END IF
NEXT
LOOP 'UNTIL INKEY$ <> ""
COLOR 15
END
neueflocke:
y(flocke) = 0
ff%(flocke) = FIX(RND * 4) + 28
belegt(x(flocke)) = 0
DO
x(flocke) = FIX(RND * 320)
LOOP WHILE belegt(x(flocke)) = 1
belegt(x(flocke)) = 1
v(flocke) = RND * k + k
RETURN
|
Gruss
Skilltronic _________________ Elektronik und QB? www.skilltronics.de ! |
|
Nach oben |
|
 |
neo

Anmeldungsdatum: 21.12.2006 Beiträge: 4 Wohnort: Thüringen
|
Verfasst am: 23.12.2006, 17:16 Titel: |
|
|
Geil! Da merkt man sofort, das man es mit eingefleischten Profis zu tun hat!
Jetz fehlt noch z.B. dass die Flocken gelegentlich (zu ca. 50/60%) zur Seite fallen und nicht "Säulen" bauen und auch schon beim herunterrieseln sich im Wind wiegen. Und noch ein paar andere kleine Details. Aber ich denke das krieg ich selber hin.
Danke Skilltronic, du bist spitze! _________________ Hobby-Programmierer mit QuickBASIC 4.5dt |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 23.12.2006, 18:23 Titel: |
|
|
da könnte unteranderem helfen, dass jede flocke sich noch zufällig zur seite bewegt:
zum flocken-x wert zählst du jedes mal (int(3*rnd)-1) dazu. das egebnis dieser rechnung: die flocke bleibt auf ihrerm x-wert, geht eins nach links oder 1 nach rechts _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
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.
|
|