 |
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 |
hi 2x verwarnt
Anmeldungsdatum: 12.01.2005 Beiträge: 30
|
Verfasst am: 19.01.2005, 14:25 Titel: hüpfen |
|
|
ich habe eine frage:
wie kann ich einen gegenstand oder menschen springen lassen? |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
SpionAtom
Anmeldungsdatum: 10.01.2005 Beiträge: 395
|
Verfasst am: 19.01.2005, 15:20 Titel: |
|
|
Hallo!
Drück dich mal konkreter aus.
Aber generell simuliert man Sprünge, indem man eine "Schwerkraft einbaut. Ein Wert, der alle Positonen stets um einen gewissen Betrag nach unten setzt. Will man nun springen, so muss man noch eine Sprungkraft einbauen, der alle Positionen um einen gewissen Betrag nach oben verschiebt.
Aber schreib mal, was du genau willst.
Danke |
|
Nach oben |
|
 |
hi 2x verwarnt
Anmeldungsdatum: 12.01.2005 Beiträge: 30
|
Verfasst am: 19.01.2005, 16:49 Titel: also |
|
|
also ich will genau:
ich habe einen schneemann mit ungefär 20 befehlen und der soll einfach ein paar cm auf und ab springen(ich will bitte die syntax wie das springen geht)!
Durch Moderator bearbeitet: Weniger Ausrufezeichen tuen's auch... |
|
Nach oben |
|
 |
Bernd

Anmeldungsdatum: 14.09.2004 Beiträge: 498 Wohnort: Kulmbach
|
Verfasst am: 19.01.2005, 17:20 Titel: |
|
|
Code: |
if inkey$ = "beliebige taste" then
y-koordinate = y koordinate - 10 'nur zum Beispiel 10, kann auch varieren...
end if
|
so, jetzt müsstes du ihn nur wieder runter fallen lassen, aber dazu bin ich gerade zu faul *g* _________________ Neue Homepage: http://www.glubb.rockt.de
UND
Der Wahnsinn hat seine eigene Homepage: http://pulmollwand.rulz.de |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
hi 2x verwarnt
Anmeldungsdatum: 12.01.2005 Beiträge: 30
|
Verfasst am: 19.01.2005, 17:49 Titel: |
|
|
Irgendwie schaff ichs trotzdem net kann mir bitte wer den ganze code aufschreiben?
Durch Moderator bearbeitet: Komplette Großschreibung und Ausrufezeichen entfernt! |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 19.01.2005, 18:05 Titel: |
|
|
erstens hör auf so rumzubrüllen
zweitens hör mit den Ausrufezeichen auf!
dritten Code: | schwerkraft = 1
y=400
DO
if v = 0 and inkey$<>"" then v = 300
v = v-schwerkraft
y = y+v
if y > 400 then y = 400 : v=0
'schneemann wegmachen, neu zeichnen, Koordinaten irgendwas für x und variable y
LOOP |
könnte funktionieren.. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
Dusky_Joe

Anmeldungsdatum: 07.01.2005 Beiträge: 1007 Wohnort: Regensburg/Oberpfalz
|
Verfasst am: 19.01.2005, 18:53 Titel: |
|
|
Hi!
So wie ich das sehe, liegt das Problem daran, dass deine Grafik-Figur aus so vielen Befehlen besteht.
Nun gibt es zwei möglichkeiten, so eine Animation darzustellen:
Methode 1: Zeichnen und löschen.
Eine Ani ist nichts anderes als eine folge von Einzelbildern kurz hintereinander.
Du musst also nichts weiter tun, als eine ganze Menge einzelbilder zu zeichnen, und sie dann wieder zu löschen.
Das könnte so aussehen, um einen Punkt zu bewegen:
Code: |
PSET (100, 100)
CLS
PSET (100, 101)
CLS
PSET (100, 102)
CLS
PSET (100, 103)
...
|
Aber frag irgend einen Programmierer, was er von dieser Methode hält - er wird dir sagen, dass das unglaublich aufwändig ist, und nix bringt, außer einem riesen quelltext.
Aber: Wer sagt denn, dass man jede Koordinate einzeln angeben muss?
Man könnte doch ganz einfach die sich bewegenden Punkte durch eine Variable austauschen....
Code: |
FOR y = 100 TO 150
PSET (100, y)
CLS
NEXT
|
So sieht das schon mal ganz gut aus.
Was uns aber noch stört: CLS löscht den ganzen Bildschirm!
Wenn du aber noch ein wenig Grafik nebenher laufen lässt, dann müsstest du die auch jedes mal in der FOR-NEXT-Schleife neu Zeichnen. Das ist noch immer etwas umständlich.
Also, löschen wir doch einfach nur den einzelnen Punkt!
Code: |
FOR Y = 100 TO 150
PSET (100, y), 15
PSET (100, y), 0
NEXT
|
Jetzt wird einfach über den schon gezeichneten Punkt ein schwarzer "drübergelegt". Wenn du jetzt einen... sagen wir mal roten Hintergrund hast, müsste die zweite Zeile natürlich
PSET (100, y), 4
heißen. Aber das ist ja eh logisch, oder
Also kurz:
Du machst eine Zeichnung, und wenn die fertig ist, Legst du wieder die selbe Zeichnung in Hintergrundfarbe drüber.
Das könnte für deinen Schneemann so aussehen:
Code: |
SCREEN 12
FOR y = 100 TO 150
'Zuerst zeichnen wir den Schneemann...
CIRCLE (320, y), 50, 15
CIRCLE (320, y + 50), 30, 15
CIRLCE (320, y + 80), 10, 15
'... und dann löschen wir ihn wieder!
CIRCLE (320, y), 50, 0
CIRCLE (320, y + 50), 30, 0
CIRLCE (320, y + 80), 10, 0
NEXT
|
Dabei kann es dir aber passieren, dass alles so schnell abläuft, dass du nichts mehr von der Animation siehst!
Was nun?
Ein Anfänger, der sich nur so zum Spaß einen "Film" für den eigenen PC basteln möchte, kann ruhig so eine Zeile zum verlangsamen benutzen:
FOR warten = 1 TO 5000: NEXT
Das hat verschiedene Nachteile, z.B., dass das Prog nicht auf jedem PC gleich schnell abläuft, aber ich denke, dass du als anfänger erst mal lernen willst, wie man überhaupt animierte grafik proggt.
Wenn du mehr über fortschrittlichere Methoden wissen willst, können wir dir sicher auch helfen *g*
Diese Methode funktioniert relativ gut. Aber der Code wird schnell unübersichtlich.
Deswegen wird für Animationen oft anderer Code verwendet:
Methode 2: GET und PUT
GET und PUT sind zwei QB-Befehle, die am ehesten zu vergleichen sind mit kopieren und einfügen aus MSPaint. Oder jedem anderen Grafik-bearbeitungsprog *g*
Sehen wir uns einmal die Syntax an:
GET (x1, y1)-(x2, y2), Array
PUT (x, y), Array, AKTIONSTYP
(Damit du die Zeilen ab hier verstehst, solltest du dich mit dem DIM-Befehl auskennen, bzw wissen, was ein Array ist. Ansonsten mach dich erst mal in den QB-Monster-FAQ schlau! )
Bei GET gibst du also zwei Koordinaten an. Alles innerhalb dieser Koordianten wird in das Array kopiert.
Und PUT gibt den Inhalt des Arrays an (X|Y) wieder auf dem Bildschirm aus.
Naja, nicht ganz so einfach: Da ist ja noch der AKTIONSTYP:
Davon gibt es ein paar:
PSET - Gibt die Grafik wirklich so aus, wie sie eingelesen wurde
=> Da dieser Aktionstyp am einfachsten zu verstehen ist, werden wir zuerst einmal nur diesen verwenden.
PRESET - Gibt die Grafik inventiert wieder aus. Ansonsten bleibt alles gleich.
XOR - für Animationen benutzt, "vermischt" den bisherigen Hintergrund mit dem von GET
AND und OR - Vermischt ebenfalls Hintergrund mit neuem Bild, aber anders. Um genau zu verstehen, wie das geht, müsstest du dich ein wenig mit Bitweisem komplementieren auskennen. Klingt wahnsinnig schwierig, ist aber ziemlich einfach.... gehört aber nicht hier hin.
Nun, du wirst dich sicher schon die ganze Zeit fragen, wie groß denn nun dieses Array sein muss!
Die große ist von verschiedenen Dingen abhängig:
-Natürlich der Größe des eingelesenen Bildes,
-Verwendetem Bildschirmmodus
-Dem Datentyp des Arrays.
Die QB-Hilfe gibt eine ziemlich lange Formel an, mit der sich die Anzahl der benötigten Bytes errechnen lässt. Sicher wirst du die irgenwann einmal benutzen, für den Anfang reicht aber die Faustregel:
Groesse = (x2 - x1) * (y2 - y1) / 2
Meistens wird der Wert viel zu groß sein, aber noch ist uns das nicht wichtig. Professionelle Grafik kommt erst später
Nun wollen wir das mal anwenden:
Code: |
SCREEN 12
'Schneemann zeichnen
CIRCLE (320, 100), 50, 15
CIRCLE (320, 150), 30, 15
CIRLCE (320, 180), 10, 15
Groesse = (370 - 270) * (190 - 50) / 2 'ist gleich 7000
Dim Schneeman (Groesse)
GET (370, 190)-(270, 50), Schneeman
PUT (10, 400), Schneeman, PSET
|
Was machen wir also?
- Wir zeichnen den Schneemann
- Wir dimensionieren ein Array, in dem er gespeichert werden soll
- Wir lesen die Grafik ein
- Und geben Sie schließlich wieder aus.
Dieses beispiel kopert den Schneemann nur an einen anderen Ort, also müssen wir noch etwas ändern:
Code: |
SCREEN 12
Groesse = (370 - 270) * (190 - 50) / 2
DIM nichts (Groesse)
DIM Schnee (Groesse)
GET (370, 190)-(270, 50), nichts
CIRCLE (320, 100), 50, 15
CIRCLE (320, 150), 30, 15
CIRLCE (320, 180), 10, 15
GET (370, 190)-(270, 50), Schnee
CLS
FOR y = 200 TO 400
PUT (270, y - 1), nichts, PSET
PUT (270, y), Schnee, PSET
NEXT
|
Du siehst, wir arbeiten mit zwei Arrays. Im ersten ist nur der Hintergrund gespeichert - in dem Fall ein schwarzes Viereck *g*
Im zweiten befindet sich unser Schneemann.
Jetzt wird immer zuerst der Hintergrund gezeichnet, um eines niedriger als der alte Schneemann.
Der nämlich wird dann gelöscht. Und so wird Platz gemacht für den neuen!
Ich hoffe, ich konnte dir helfen!
Das Thema GET/PUT ist ziemlich groß, und nicht unbedingt leicht zu packen für jemanden, der erst vor so kurzer Zeit die Drawing Primitives kennen gelernt hat....
Deswegen versuchs erst mal mit Methode 1, probiere rum, und hab aber zwischendurch trotzdem den mut, auch mal was neues auszuprobieren![/b] _________________ fully biological degradable
Once, the big wave arrives, you've got two ways, you can go:
Either, you ride it, or you don't do.
But, if you don't ride, you'll never know wether you'd have gone wet. |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
|
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.
|
|