anfänger mit schleifen

Previous topic - Next topic

Metamorphose

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
lalagames - www.metamo.ch/lalagames/
Keine K?nstler Online - www.keinekuenstler.ch
M?rchenwelt PNP-RPG - www.metamo.ch/maerchenwelt

Schranz0r

#1
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 :)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Metamorphose

#2
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.
lalagames - www.metamo.ch/lalagames/
Keine K?nstler Online - www.keinekuenstler.ch
M?rchenwelt PNP-RPG - www.metamo.ch/maerchenwelt

S.O.P.M.

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.
Notebook PC Samsung E372 Core i5 @ 2,6 GHz; 4 GB RAM; Win 7 Home Premium

Schranz0r

Quote from: S.O.P.M. 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)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

S.O.P.M.

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.
Notebook PC Samsung E372 Core i5 @ 2,6 GHz; 4 GB RAM; Win 7 Home Premium

kanonet

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.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Schranz0r

Jopp, stellt euch Call of Duty oder Counterstrike ohne Frameabhängigkeit vor.
Der mit dem dicksten PC ist der wildeste Drücker ;)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Metamorphose

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 ;)
lalagames - www.metamo.ch/lalagames/
Keine K?nstler Online - www.keinekuenstler.ch
M?rchenwelt PNP-RPG - www.metamo.ch/maerchenwelt

Schranz0r

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.


I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

kanonet

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.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Schranz0r

Wenn dem so sein sollte ist Select scheisse :) und sollte in " GOTO's " zerlegt werden ;)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

kanonet

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.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Schranz0r

Ein GOTO wird nicht gerne gesehen, weil dann dieser "Spagetticode" entsteht  :x
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Schranz0r

Habe bis jetzt nie GOTO gebraucht...
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard