Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Schnee: es soll schneien

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
neo



Anmeldungsdatum: 21.12.2006
Beiträge: 4
Wohnort: Thüringen

BeitragVerfasst am: 22.12.2006, 01:00    Titel: Schnee: es soll schneien Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
The real Agent D



Anmeldungsdatum: 24.11.2005
Beiträge: 605
Wohnort: Hall i. T.

BeitragVerfasst am: 22.12.2006, 12:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
neo



Anmeldungsdatum: 21.12.2006
Beiträge: 4
Wohnort: Thüringen

BeitragVerfasst am: 22.12.2006, 13:32    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
The real Agent D



Anmeldungsdatum: 24.11.2005
Beiträge: 605
Wohnort: Hall i. T.

BeitragVerfasst am: 22.12.2006, 13:39    Titel: Antworten mit Zitat

Zitat:

Mh ok, aber der Schnee soll auch liegen bleiben...

Na dann mach doch mehrere Linien, ide immer weiter hinauf steigen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 22.12.2006, 13:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 22.12.2006, 20:40    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
croco97



Anmeldungsdatum: 04.11.2005
Beiträge: 260

BeitragVerfasst am: 22.12.2006, 23:37    Titel: Antworten mit Zitat

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? zwinkern

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
Benutzer-Profile anzeigen Private Nachricht senden
neo



Anmeldungsdatum: 21.12.2006
Beiträge: 4
Wohnort: Thüringen

BeitragVerfasst am: 23.12.2006, 07:00    Titel: Antworten mit Zitat

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 mit den Augen rollen ) 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
Benutzer-Profile anzeigen Private Nachricht senden
Skilltronic



Anmeldungsdatum: 10.09.2004
Beiträge: 1148
Wohnort: Köln

BeitragVerfasst am: 23.12.2006, 15:27    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
neo



Anmeldungsdatum: 21.12.2006
Beiträge: 4
Wohnort: Thüringen

BeitragVerfasst am: 23.12.2006, 17:16    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
Jojo
alter Rang


Anmeldungsdatum: 12.02.2005
Beiträge: 9736
Wohnort: Neben der Festplatte

BeitragVerfasst am: 23.12.2006, 18:23    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu QBasic. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz