Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

patrick246

Treue Seele

Beiträge: 328

Wohnort: nahe Heilbronn/BW

Beruf: TG Profil Informatik-Schüler

  • Private Nachricht senden

21

24.07.2013, 13:02

Du willst, dass man nur einmal schießen kann, solange die Leertaste gedrückt ist? Ich habe mir für so etwas einen Input-Manager geschrieben. Dieser speichert alle Tastendrücke, die in diesem und im letzen Frame getätigt wurden und kann daher entscheiden, ob eine Taste gehalten oder gerade gedrückt worden ist.

https://dl.dropboxusercontent.com/u/1015…nputManager.rar

In deiner main() kannst du einmal einen InputManager erstellen und dann einmal pro Frame updaten.

C-/C++-Quelltext

1
2
3
4
5
// Vor der while-Schleife
PGE::InputManager imgr(window);

// In der while-Schleife
imgr.update();


Alle Funktionen, die auf eine einmalige Eingabe reagieren haben ein Hit im Namen, die anderen Pressed.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
if(imgr.isKeyHit(sf::Keyboard::Space))
{
    // Shoot
}

if(imgr.isKeyPressed(sf::Keyboard::Up))
{
    // Move up
}

Allen Klassen, die die Eingabe benötigen, kannst du eine Referenz darauf geben.

Ich persönlich habe mir das als lib kompiliert und benutze sie in allen meinen SFML-Projekten.

Stazer

Alter Hase

Beiträge: 468

Wohnort: Berlin

Beruf: Student

  • Private Nachricht senden

22

24.07.2013, 13:39

Ich weiß nicht, obs schon genannt wurde, aber ich glaube du hast vergessen die Bewegungen mit der Frametime zu multiplzieren.
Bei mir ist das Spiel nämlich nicht spielbar, da die Spieler zu schnell agieren.

Freundliche Grüße
Stazer

BK Simon

Treue Seele

  • »BK Simon« ist der Autor dieses Themas

Beiträge: 151

Beruf: Student

  • Private Nachricht senden

23

24.07.2013, 13:41

@patrick246: Erstmal Danke fuer deine Antwort :)
Also das mit dem einmaligen Schiessen, solange die Leertaste gedrueckt ist, hast du richtig erkannt und ich denke, mit Hilfe deiner Klasse wuerde ich dies auch loesen koennen.
Ich denke jedoch, dass dies doch eher ein Overkill fuer diesen doch recht kleinen Anwendungsfall ist, und wuerde gerne wissen, ob es dort nicht vllt. eine andere simplere Loesung gibt.

BK Simon

Treue Seele

  • »BK Simon« ist der Autor dieses Themas

Beiträge: 151

Beruf: Student

  • Private Nachricht senden

24

24.07.2013, 13:45

@Stazer:
Das mit der Bewegung und der Frametime wurde schon genannt, jedoch habe ich dies nicht vergessen, sondern habe ich absichtlich bei der Bewegung bis jetzt erst nur eine Zahl addiert, da dies ja nur ein Testspiel ist.
Ich werde jedoch in naher Zukunft auch die Zeit mit einbringen, so dass auch besser Computer, als mein eher spartanisch ausgeruesteter Laptop, es spielen koennen.

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

25

24.07.2013, 13:52

Im Fall der Bewegung ist es Quatsch "nur" zu addieren. Du musst ja immerhin mit der Zeit "nur" multiplizieren. Einfach die Geschwindigkeit (Wert pro Sekunde) multiplizieren mit der Zeit (in Sekunden). Das ist ja nicht wirklich mehr arbeit. Hab keine Angst vor solchen Dingen. Die sind wirklich wichtig und du solltest das direkt am Anfang festigen. Weiterhin ist auch so ein Inputmanager gar nicht so viel Overhead. Trau dich solche Dinge zu benutzen. Vor allem wenn dir das ganze schon fertig präsentiert wird. Guck dir hinterher den Code an und versuch ihn zu verstehen. Möglicherweise schreibst du dir ja einen eigenen. Das ist eine Sache die du in fast jedem Projekt benötigen wirst. Auch wenn es nur ein kleines Testprojekt ist machst du das ja um was dabei zu lernen. Von daher nimm diese beiden Punkte direkt mit. Es gibt jetzt ja diesen Thread hier und den kannst du direkt nutzen wenn du Probleme dabei bekommst. Aber trau dich und mach es gleich richtig. Es ist weniger Aufwand als du grad vielleicht denken magst:)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

FSA

Community-Fossil

  • Private Nachricht senden

26

24.07.2013, 13:59

Joa schade :( Entweder ist mein Block links oder rechts. Dazwischen sehe ich nix. *Alten PC aus Keller hol*

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

BK Simon

Treue Seele

  • »BK Simon« ist der Autor dieses Themas

Beiträge: 151

Beruf: Student

  • Private Nachricht senden

27

24.07.2013, 14:01

@Schorch:
Mit naher Zukunft habe ich ja nicht naechste Woche gemeint :) Ich bin gerade nur noch dabei erstmal alles schoen in Klassen aufzuteilen, womit ich heute Abend hoffentlich fertig bin und werde mich dann dran setzen die Zeit reinzubringen.
Muss ich also einfach nur nen Timer starten und dann immer nur mit der Zeit multiplizieren ? Ich muss doch da noch ein wenig mehr schreiben vonwegen, wieviel Sekunden sind seit dem letzten Frame vergangen usw.

Scheint ja wohl, als wuerde man da wirklich immer nen Inputmanager verwenden, also dann werde ich mir das mal genauer anschaun.

BK Simon

Treue Seele

  • »BK Simon« ist der Autor dieses Themas

Beiträge: 151

Beruf: Student

  • Private Nachricht senden

28

24.07.2013, 14:03

@FSA:
Bin nicht davon ausgegangen, dass Leute wirklich dieses Spiel antesten wollen :D Dachte eher, dass sich die Leute nur den Quellcode und das Bild ein wenig anschaun :D

Also auf meinem Laptop mit nem 2,1 GHz Single-Core laeufts gut :D

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

29

24.07.2013, 14:41

Guck dir die SFML Tutorials mal an. Einfach mal von oben bis unten durchgehen. Da gibts einiges interessantes zu sehen. Hier ein Tutorial zur Zeit. Das sollte dir alles zeigen was du benötigst. Dir wird gezeigt wie du jeden Frame die Zeit seit dem letzten Frame ermittelst und wie du von einem Time Objekt die Zeit in Sekunden holen kannst. Mit ein wenig Physik kannst du dir folgendes denken, wobei s eine Strecke ist, v eine Geschwindigkeit und t die Zeit.
Es gibt v = s/t (Geschwindigkeit = Strecke durch Zeit, vergleichen Geschwindigkeit messen wir oft in Km/h). Nun willst du aber eine Strecke ausrechnen, nämlich die um die sich deine Figur bewegen soll. Also stellen wir die Formel um zu:
s = v * t (also Strecke = Geschwindigkeit multipliziert mit der Zeit).
Sagen wir du hast eine Geschwindigkeit von 50 Pixeln pro Sekunde und die Zeit seit dem letzten Frame wäre 0.5 Sekunden, dann wäre die Berechnung:
s = 50(px/s) * 0.5(s) = 25px. Das rechnest du auf deine Position auf und hast deine Bewegung abhängig von der Zeit.
Was Input angeht. Da kann man sich so einen Input Manager schreiben, den man einmal schreibt und immer wieder verwendet. Oder man schreibst sich halt jedes mal das was man braucht. Aber im Prinzip musst du in extrem vielen Spielen abfragen können, ob ein Button gedrückt wird (auch über mehrere Frames), oder ob ein Button geklickt wird (nur der erste Frame). Jetzt kannst du dir jedes mal sowas basteln wie du es mit deinem bool gemacht hast. Je mehr Tasten dann mit der Zeit dazu kommen umso mehr blähst du deinen Code dadurch auf. Du kannst dir aber auch jedes mal eine Klasse dafür schreiben, wodurch du den Code für den Input ein wenig auslagern kannst. Das hält deinen Code ein wenig übersichtlicher. Ob du diese Klasse ein mal schreibst und guckst dass du sie möglichst wieder verwenden kannst ist deine Sache. Du kannst die Klasse natürlich auch jedes mal an deine Bedürfnisse angepasst neu schreiben. Aber sinnvoll ist das schon, damit dein Code übersichtlich bleibt.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BK Simon

Treue Seele

  • »BK Simon« ist der Autor dieses Themas

Beiträge: 151

Beruf: Student

  • Private Nachricht senden

30

24.07.2013, 15:03

@Schorsch: Erstmal dickes dankeschoen fuer deine ausfuehrliche Antwort!
Das mit der Zeit klingt auch alles einleuchtend und ich habe es mir auch so gedacht, auch da es Heiko Kalista in seinem Spiel am Ende des Buches aehnlich realisiert hat.
Nur hat es mich abgeschreckt, dass er dort eine ganze Klasse fuer die Zeit geschrieben hat, doch mit SFML schaut das ja um einiges simpler aus.

Ob ich mir einfach so nen Inputmanager schreiben kann, weiss ich nicht, dafuer muss ich mir erstmal ueberlegen, was ich denn da alles benoetige, und ob ich das auch so realisiert bekomme.

Werde heute Abend sicherlich mal meinen aktuellen Code mit OOP und vermutlich auch der Zeit hier reinstellen :)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BK Simon« (24.07.2013, 15:11)


Werbeanzeige