GLBasic forum

Other languages => GLBasic - de => Topic started by: Metamorphose on 2013-Apr-04

Title: anfänger mit schleifen
Post by: Metamorphose on 2013-Apr-04
hallo.
ich hab bis jetzt nur textadventures geschrieben und auf schleifen verzichtet, da ich gewisse grundsachen nicht kapiere (half mir die hilfe von glbasic nicht weiter).

ich will ein spielchen schreiben wie ein textadventure, doch muss man durch klicken weiterkommen (daher brauchts ja ne schleife).

zum grundprinzip denke ich mir das so:

---
variablen
schleifenanfang
abfrage (zb text was machst du und 2 knöpfe für handlungen)
schleifenende

handlung 1
handlung 2
---

nun wird das ja durchgelooped. wie bekomme ich also ein intro rein? muss ich diese aus der schleife aufrufen?
und ein startmenü? oder sind das verschiedene schleifen?
wie bekomme ich im hauptprogramm generell verzögerungen hin?

in älteren basics habe ich schon solche sachen ansatzweise geschrieben, doch benutzte ich dort faulerweise befehle wie sleep 2000 (2 sekunden warten) in der schleife, zB um ein weiteres sprite erst später anzeigen zu lassen.

grüsse
Title: Re: anfänger mit schleifen
Post by: Schranz0r on 2013-Apr-05
Code: (glbasic) [Select]
LOCAL was_passiert
LOCAL timer // siehe weiter unten

WHILE TRUE // Hauptschleife die mit ESC-Taste beendet werden kann
   IF was_passiert = 1
      // Hier Handlung für Fall #1
   ENDIF
   IF was_passiert = 2
      // Hier Handlung für Fall #2
   ENDIF
   // solltest du mehrere Handlungen haben, würde ich auf SELECT CASE gehen!

   FOR i = 0 to 4  // 5 Schleifendurchläufe
      //Hier kannst du z.B. 5 Mal ein gleiches Bild zeichen und auf die "i" -Variable im Loop zugreifen
      DRAWSPRITE 1, i*50,20 // i wird also immer mal 50 genommen ( 0, 50,100,150,200 )
   NEXT
   
   IF timer< GETTIMERALL()
      // hier kannst du nun nur 1x pro Sekunde rein!
      timer = GETTIMERALL()+1000
   ENDIF

   SHOWSCREEN
WEND // Ende der Hauptschleife
END // Programm beenden

Hoffe das reicht erstmal für den Anfang um es verständlich zu machen ?
Sonst einfach weiter fragen :)
Title: Re: anfänger mit schleifen
Post by: Metamorphose on 2013-Apr-05
hm. ich hab immer nich nicht kapiert, wie ich etwas verzögert wiedergebe. ob man ein bild *50 zeichnet, macht ja nix dran.
muss ich einfach immer eine variable raufzählen und dass verzögert ihn?
pcs sind ja unterschiedlich schnell, dann ist bei dem einten die verzögerung schneller weg als bei dem anderen.

//edit: ah, das meinst du mit dem timer. werd mir das mal genauer anschauen, ist für mich noch kompletter bahnhof.
Title: Re: anfänger mit schleifen
Post by: S.O.P.M. on 2013-Apr-05
Ja, ich würde da mit Timervariablen arbeiten, die wie du richtig sagst, bis zu bestimmten Werten raufzählen lassen, um dann eine neue Aktion auszuführen. Durch den Befehl LIMITFPS kannst du eine feste Framerate einstellen, so dass der Schleifendurchlauf auf verschiedenen Systemen gleichschnell ist.
Title: Re: anfänger mit schleifen
Post by: Schranz0r on 2013-Apr-05
... Durch den Befehl LIMITFPS kannst du eine feste Framerate einstellen, so dass der Schleifendurchlauf auf verschiedenen Systemen gleichschnell ist.

So nicht ganz richtig!
Wenn du es genau haben willst musst du einen Timer benutzen (Stichwort: Frameunabhängig)
Title: Re: anfänger mit schleifen
Post by: S.O.P.M. on 2013-Apr-05
Hm... für mich war's bis jetzt immer genau genug. Wenn man nicht gerade ne Uhr bauen will, dachte ich, sollte die Variante genügen. Die Einleitung von GLBasic sagt ja auch: "Um stabile Geschwindigkeiten auf allen Rechnern zu erhalten, kann GLBasic wenn nötig auf eine einstellbare Anzahl von Bildern pro Sekunde gebremst werden." Man sollte natürlich noch Ressourcen lassen, so dass das Spiel auf den meisten Zielgeräten die vorgesehenen FPS schafft.
Title: Re: anfänger mit schleifen
Post by: kanonet on 2013-Apr-05
Dann würde dir aber immer noch die Möglichkeit eines Framedrops fehlen, sollte das Game zu langsam sein um die angegebenen FPS überhaupt zu erreichen.
Title: Re: anfänger mit schleifen
Post by: Schranz0r on 2013-Apr-05
Jopp, stellt euch Call of Duty oder Counterstrike ohne Frameabhängigkeit vor.
Der mit dem dicksten PC ist der wildeste Drücker ;)
Title: Re: anfänger mit schleifen
Post by: Metamorphose on 2013-Apr-08
ich dachte ich schreibs hier rein, weils bedingt auch mit schleifen zu tun hat und ich der ersteller war.
das programm funktioniert bis jetzt ganz gut, jedoch habt ihr mir sicherlich eine schönere lösung für folgendes problem:
ich will das in der schleife der held bei bestimmten aktionen zB 1 leben dazubekommt. wenn ich nun mache (pseudocode)
bewegt sich der held zum leben then leben = leben +1
dann bekommt er, ist er beim leben tausende leben (schleife).
habe nun für solche events immer eine eigene variable gemacht, die aus 0 und 1 besteht. bekam er leben +1 dann wird die variable auf 1 gesetzt, bei 1 bekommt er kein leben mehr. ist er wieder aus der "gefahrenzone", dann wird der wert wieder auf 0 gesetzt, sprich es ruft dies einmal auf.
ist jetzt nur ein beispiel.
das müsst ich aber bei allen möglichen sachen so handhaben. sprich experience, mana, leben usw. immer eigene variablen dazu machen oder geht das auch einfacher?
und wieso ist select case schneller als if? habe den code komplett mit tausenden ifs ;)
Title: Re: anfänger mit schleifen
Post by: Schranz0r on 2013-Apr-08
Select ist schneller weil es nicht "Tausend mal" die gleiche Variable abfragen muss.


Geht in etwar so:

- Frage Variable ab
- ist 1 gehte zu CASE 1 pfeif auf CASE 2: !
- ist 2 gehte zu CASE 2 und gib nen Mist drauf was auf CASE 1: steht !
- ist beides nicht der Fall gehe zu DEFAULT: und pfeif auf 1 und 2.


Title: Re: anfänger mit schleifen
Post by: kanonet on 2013-Apr-08
Sicher? Ich war immer davon ausgegangen, dass select vom compiler (gcc nicht GLB) ohnehin in eine Verkettung von ifs zerlegt wird. Glaube ich etwas von Gernot in dieser Richtung gelesen zu haben, finde es aber nicht un kann mich auch irren.

Übrigens gibt es noch jede menge an Optimierungen, die gcc für den compiler unternehmen kann, ohne dass wir etwas davon mitbekommen (außer dem Speed eben), z.B. wenn alle case werte aufeinander folgen und jeweils den gleichen Abstand zu einander haben etc.
Title: Re: anfänger mit schleifen
Post by: Schranz0r on 2013-Apr-08
Wenn dem so sein sollte ist Select scheisse :) und sollte in " GOTO's " zerlegt werden ;)
Title: Re: anfänger mit schleifen
Post by: kanonet on 2013-Apr-09
Am Ende werden eh alle Schleifen etc. in Sprungbefehle übersetzt; da zum Schluss ohnehin Sprungbefehle im Maschinencode stehen, ist die Ablehnung von Goto in manchen Hochsprachen eh dämlich.

Welche Optimierungen ein Compiler jeweils tatsächlich vornimmt ist für uns nicht wirklich ersichtlich und somit auch fast egal.
Title: Re: anfänger mit schleifen
Post by: Schranz0r on 2013-Apr-09
Ein GOTO wird nicht gerne gesehen, weil dann dieser "Spagetticode" entsteht  :x
Title: Re: anfänger mit schleifen
Post by: Schranz0r on 2013-Apr-09
Habe bis jetzt nie GOTO gebraucht...
Title: Re: anfänger mit schleifen
Post by: kanonet on 2013-Apr-09
Ein GOTO wird nicht gerne gesehen, weil dann dieser "Spagetticode" entsteht  :x
Schon klar, aber da eine Schleife am Ende ohnehin als "goto" übersetzt wird ist es egal ob man den Spagetticode vermeided in dem man entschprechende Schleifen verwendet oder Goto vorsichtig einsetzt. Der Verweis auf die Benutzbarkeit von Basic, da ja immer Spagetticode rauskäme ist natürlich purer Blödsinn. Im übrigen geht es mir da wie dir, ich verwende GOTO überhaupt nicht, schließlich kann alles durch Schleifen dargestellt werde.
Aber ich gebe zu, dass dieses Thema leicht Offtopic ist.  :whistle:
Title: Re: anfänger mit schleifen
Post by: Schranz0r on 2013-Apr-10
Aber nur leicht OT ^^
Title: Re: anfänger mit schleifen
Post by: BumbleBee on 2013-Apr-10
Ich mach alles mit GOTO. Damit kann ich meinen Quellcode offenlegen und keine Sau blickt durch.  :D

Cheers
Title: Re: anfänger mit schleifen
Post by: Schranz0r on 2013-Apr-10
Ich mach alles mit GOTO. Damit kann ich meinen Quellcode offenlegen und keine Sau blickt durch.  :D

Cheers


Coding like a GOTO:BOSS :D
Title: Re: anfänger mit schleifen
Post by: Marmor on 2013-Apr-10
also ich nutze nie goto ! echt  :whistle:
was mich aber wundert das in der exe trotzdem jmp's vorkommen ! sauerei sowas  :whistle:

mal ehrlich , wer liest sich seinen code nach einem jahr durch und versteht ihn noch ?
ob mit oder ohne goto , neuschreiben ist da oft besser.
oceans methode gefällt mir ganz gut , alles nah aneinander in einer funktion das passt .
Title: Re: anfänger mit schleifen
Post by: S.O.P.M. on 2013-Apr-11
Ich mache das immer so, ich habe mehrere WHILE WEND Schleifen die alle von dem Wert einer Variablen abhängen und mit dieser Steuerungsvariable kann ich jede der Schleifen nach Bedarf anspringen. Macht das wer auch noch so? Mir gefällt das nicht, alles in einer Schleife zu haben und dann mit vielen IF's abfragen zu müssen, welcher Teil gerade ausgeführt werden darf und welcher nicht.
Title: Re: anfänger mit schleifen
Post by: Schranz0r on 2013-Apr-11
Ich verschachtel :)
Title: Re: anfänger mit schleifen
Post by: kanonet on 2013-Apr-11
Ich verschachtel :)
+1
Title: Re: anfänger mit schleifen
Post by: Metamorphose on 2013-Apr-12
so, nochmals ne frage betreffend schleifen.
ich würde gerne, wenn der held einen feind schlägt, für eine halbe sekunde ein bild anzeigen, dieses bild wieder verbergen, für eine halbe sekunde ein anderes bild anzeigen + 1x musik abspielen bei jedem der bilder.
also eine kleine schlaganimation. (bild 1 = held schlägt, bild 2 = monster schlägt).

hier hat mal jemand timer vorgeschlagen.
weiss nur nicht wie ich das ganze bewerkstelligen kann.
kann mir da jemand helfen?
Title: Re: anfänger mit schleifen
Post by: BumbleBee on 2013-Apr-12
Hi

also mit DRAWANIM ist das ja kein Problem sein. Das Ganze noch mit  GETTIMER gedrosselt und schon sollte es gehen. Vielleicht   macht dir jemand noch ein Beispiel.


@Schranz0r
 
Apropos GOTO. Was hältst du von diesen GOTOs?
 
   GOTO Lagerleben, GOTO Bierstand, GOTO Bierstand, GOTO Bierstand... :booze:   GOTO Klo  :puke:   GOTO Taxistand  :D

Also ich wäre dabei.   =D

Cheers

Title: Re: anfänger mit schleifen
Post by: Metamorphose on 2013-Apr-12
ich hab mir jetzt mehrmals gettimer angeschaut in der hilfe und immer wieder dran rumgeschraubt.

Code: (glbasic) [Select]
LIMITFPS 30
LOADANIM "test.png", 0, 32,32

WHILE TRUE
DRAWANIM 0, x, 1,1
PRINT dtime, 200, 200

dtime = GETTIMER()
IF dtime>30
x=x+1
ENDIF

SHOWSCREEN
WEND


wie kann ich das umschreiben, dass die anim jede sekunde weitergeht? ich kapier das glbasic-hilfebeispiel nicht.
in diesem code geht er alle 30 1en hoch. weiss nicht wie ich des umschreiben kann.
Title: Re: anfänger mit schleifen
Post by: Schranz0r on 2013-Apr-12
Hi

also mit DRAWANIM ist das ja kein Problem sein. Das Ganze noch mit  GETTIMER gedrosselt und schon sollte es gehen. Vielleicht   macht dir jemand noch ein Beispiel.


@Schranz0r
 
Apropos GOTO. Was hältst du von diesen GOTOs?
 
   GOTO Lagerleben, GOTO Bierstand, GOTO Bierstand, GOTO Bierstand... :booze:   GOTO Klo  :puke:   GOTO Taxistand  :D

Also ich wäre dabei.   =D

Cheers

Bin dabei! :D Machen wir dieses Jahr wieder? Evtl. mal versuchen Gernot mit zu nehmen :)
Title: Re: anfänger mit schleifen
Post by: Metamorphose on 2013-Apr-12
leute, dass ist alles ot.
macht nen eigenen goto-thread auf.
Title: Re: anfänger mit schleifen
Post by: Quentin on 2013-Apr-12
ich verwende eigentlich lieber GETTIMERALL().
vielleicht macht das folgende kleine Beispiel es klarer. Es erhöht die Variable zaehler jede Sekunde um 1.

Die Zeit bis zur nächsten Erhöhung von zaehler wird in der Variablen Zeit gespeichert. Das ist dann jeweils die aktuelle Zeit (GETTIMERALL) plus die gewünschte Verzögerung (verzoegerung).

Wenn diese abgelaufen ist (zeit ist kleiner als die aktuelle Zeit), wird die Variable zaehler erhöht und die Zeit bis zur nächsten Erhöhung von zaehler neu berechnet.

Code: (glbasic) [Select]
LOCAL zaehler = 0
LOCAL verzoegerung = 1000  // 1000 Millisekunden
LOCAL zeit

WHILE TRUE

PRINT zaehler, 0, 0
IF zeit < GETTIMERALL()
INC zaehler
zeit = GETTIMERALL() + verzoegerung
ENDIF

SHOWSCREEN

WEND
Title: Re: anfänger mit schleifen
Post by: Metamorphose on 2013-Apr-12
genau so ein beispiel hab ich gesucht.
wie geht das ganze mit gettimer?
weil so wie ich das versteh, sehe ich mit gettimerall seit wann das programm läuft.
Title: Re: anfänger mit schleifen
Post by: Quentin on 2013-Apr-12
GETTIMER fängt halt eben nach jedem SHOWSCREEN die Zählung neu an. Du bräuchtest dann halt eben noch eine weitere Variable, wo du die jeweilige Verzögerung ermittelst. GETTIMERALL ist hier imho einfacher zu handhaben, weil er die Zählung beim Start des Programmes beginnt und somit linear fortgeschrieben wird.

Theoretisch könnte es zwar irgendwann mal zu einem Überlauf kommen und die Zählung im negativen Bereich weitergehen, das geschieht bei 32-Bit integer aber erst nach etwas mehr als 24 Tagen.

aber hier dann noch das passende Beispiel mit GETTIMER

Code: (glbasic) [Select]
LOCAL zaehler = 0
LOCAL verzoegerung = 1000  // 1000 Millisekunden
LOCAL zeit = 0

WHILE TRUE

zeit = zeit + GETTIMER()

PRINT zaehler, 0, 0
IF zeit > verzoegerung
INC zaehler
zeit = 0
ENDIF

SHOWSCREEN

WEND
Title: Re: anfänger mit schleifen
Post by: kanonet on 2013-Apr-13
Schließe mich Quentins Empfehlung an GETTIMERALL() zu verwenden, mach ich (und vermutlich auch alle anderen) immer so.
Title: Re: anfänger mit schleifen
Post by: Schranz0r on 2013-Apr-13
jopp GETTIMERALL()