2D Spieler Bewegungen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

2D Spieler Bewegungen

Beitrag von X360 Andy »

Hab jetzt wirklich lange nach der besten Lösung gesucht , aber keine wirkliche Lösung zu meiner gefunden, deswegen frag ich einfach nochmal nach.

Um in einem Spiel die Figur zu animieren ( deren Bewegung ) verwende ich folgeden Code
Einmal diesen

Code: Alles auswählen

    If KeyboardPushed(#PB_Key_Left)
        If LaufenLinks() = 0
          
          If SpielerX<1-scroll
            DisplayTransparentSprite(#SpielerLinks1, SpielerX + Scroll, SpielerY)
          Else
            
            If startlinks = 0
              Startlauf = SpielerX
              startlinks = 1
            EndIf
            If Startlauf-SpielerX = 2
              LoadSprite(#Spieler, "sfx/SpielerLinks1.png")
              DisplayTransparentSprite(#Spieler, SpielerX + Scroll, SpielerY) : spielerX-2
              
            ElseIf Startlauf-SpielerX = 4
              LoadSprite(#Spieler, "sfx/SpielerLinks2.png")
              DisplayTransparentSprite(#Spieler, SpielerX + Scroll, SpielerY) : spielerX-2
              
            ElseIf Startlauf-SpielerX = 6
              LoadSprite(#Spieler, "sfx/SpielerLinks3.png")
              DisplayTransparentSprite(#Spieler, SpielerX + Scroll, SpielerY) : spielerX-2
              startlinks = 0
            Else
              
              SpielerX-2
              
            EndIf
          EndIf
        Else
          LoadSprite(#Spieler, "sfx/SpielerLinks1.png")
          DisplayTransparentSprite(#Spieler, SpielerX + Scroll, SpielerY)
        EndIf

Falls der Spieler nicht kolidieren wird ( if LaufenLinks()= 0 ) wird das animation "gestartet":
Falls nach Rechts gedrückt wird der Spieler um 2 px bewegt
Bei 2 Px wird bild 1 angzeigt bei 4 px wird bild und bei 6 px wird Bild 3 angezeigt.
Also wird bei jeder Pixel Bewegung ein neues Bild angezeigt.

Falls LaufenLinks() = 1 gibt wird ein "Standbild" angzeigt"
und danach gehts wieder von vorne los.

Hier noch ein Versuch (Mein eigentlicher versuch)

Code: Alles auswählen

 ElseIf KeyboardPushed(#PB_Key_Right)  Laufenrechts() = 0
        
        If startrechts = 0
          Startlauf = SpielerX
          startrechts = 1
        EndIf
        Debug  SpielerX-Startlauf 
        If SpielerX-Startlauf = 2
          DisplayTransparentSprite(#SpielerRechts1, SpielerX + Scroll, SpielerY) : spielerX + 2
        ElseIf SpielerX-Startlauf = 4
          DisplayTransparentSprite(#SpielerRechts2, SpielerX + Scroll, SpielerY) : spielerX + 2
        ElseIf SpielerX-Startlauf = 6
          DisplayTransparentSprite(#SpielerRechts3, SpielerX + Scroll, SpielerY) : spielerX + 2
          startrechts = 0
        Else
          SpielerX + 2
          If spielerX>300-scroll
            scroll-8
          EndIf
          
        EndIf
Beide Codes flackern, und genau das is mein Problem.
Was kann ich dagegen machen ?

Würd mich über eine Hilfe freuen.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

zu 1.)

LoadSprite hat in der Hauptschleife nichts zu suchen!


zu beiden:

sieht ja unglaublich umständlich aus...?


> Beide Codes flackern
> Was kann ich dagegen machen ?

keine Ahnung.

von etwas, was eindeutig ein Flackern erzeugt sehe ich hier nix.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Hier mal eben zum selber testen -link

nur das wichtigste (ok bis auf die Wetter Erffekte .... ) is drin

Beide Proceduren ( von oben sind drin ) sind drin (Links loadsprite und rechts die andere ohne loadsprite)

Umständlich wirds bei mir erst wenn ich es nicht hinkriege , das versuche ich verschiedene Sachen .......

Auf allen aktuellen OSén (XP,Vista,7) flimmerts....
:?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

> Hier mal eben zum selber testen

das hätte jetzt sogar beinahe zu meiner Belustigung beigetragen.

an einer EXE kann ich auch nicht sehen, was vielleicht ein flackern verursacht.

ich dachte ja, du hättest vielleicht wenigstens den source reingepackt.

macht aber nix, normal zieh ich mir eh keine riesigen pakete um mich durch fremden source zu wühlen.


das ändert auch alles nix dran, dass du bei beiden Codesnippets viel zu umständlich vorgegangen bist,
und schon garnicht daran, dass LoadSprite in einer fortlaufenden Routine einfach nichts zu suchen hat.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Das mit Loadsprite ist mir auch klar , habs wie gesagt einfach getestet.

Eine passende frage , und vie. (warscheinlich) die Lösung.
http://www.purebasic.fr/german/viewtopi ... highlight=
Hier hast du ein Beispiel gebracht (unterster Beitrag) nun frage ich mich aber wie ich das Sprite laden muss damit es die Nr. 100 bekommt.

Ich lade ca. 50 Sprites in dem Spiel muss ich da nicht aufpassen mit welcher Nr. ich das Lade ?
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

ja natürlich musst du auf die Nummer aufpassen.

> nun frage ich mich aber wie ich das Sprite laden muss damit es die Nr. 100 bekommt.
öh... indem du es in die nummer 100 lädst?

aber die 100 dort war ja nur ein beispiel, du kannst auch jede andere Nummer nehmen.

je nachdem ist es sowieso sinnvoll, dynamische nummern zu vergeben.

also z.b. so

Code: Alles auswählen

Dim AnimFrames(9)

For n=0 To 9
  Name$ = "AnimFrameSprite" + Str(n) + ".bmp"
  ;Debug Name$
  AnimFrames(n) = LoadSprite( #PB_Any, Name$ )
Next

PS:
achso... du hast bisher Konstanten genommen, deshalb die Frage...

also, ich nehm für Sprites niemals Konstanten, damit hat man keinen Überblick, welche Nummer welche ist.

gerade bei sprites muss man mal mit ner Schleife ansteuern oder mit nem Zähler, so wie z.B. Animationsframes.
descriptive Nummernkreise sind zwar auch eine Möglichkeit, so viele Lücken behält man garnicht unbedingt,
aber dynamisches Laden und die Rückgabewerte in Arrays speichern ist besser.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
X360 Andy
Beiträge: 1206
Registriert: 11.05.2008 00:22
Wohnort: Bodensee
Kontaktdaten:

Beitrag von X360 Andy »

Hammer Geil , vielen vielen Dank :allright:

Wieder ein Problem weniger :D

Dachte zawr immer das Konstanten besser sind ... aber das ist warscheinlich nur bei Programmen so ..:?
Benutzeravatar
Batze
Beiträge: 1492
Registriert: 03.06.2005 21:58
Wohnort: Berlin
Kontaktdaten:

Beitrag von Batze »

Kaeru Gaman hat geschrieben:also, ich nehm für Sprites niemals Konstanten, damit hat man keinen Überblick, welche Nummer welche ist.
Kommt immer drauf an, so allgemein würde ich Konstanten nicht abtun (für diesen konkreten Fall aber wohl eher doch Variablen benutzen).
Das kann teilweise übersichtlicher sein, falls dir bekannt ist wie viele Sprites du hast.
Hier sind meine Codes (aber die Seite geht gerade nicht):
http://www.basicpure.de.vu
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

kommt drauf an, was du machst, aber der Fall scheint mir doch eher speziell zu sein.

egal, welche Zusammenstellung ich mir jetzt erdenke...

ob ich Units auf einer Map habe, oder die Tiles die sie bilden...
Juwelen oder Puzzelsteine sind das gleiche wie Tiles...
ein Mauscursor der sich je nach Aufgabe verändert ist so ähnlich wie ne Animation...
das Spielerschiff in einem Ballergame, wenn es nicht animiert ist hat es vielleicht unterschiedliche Waffenaufbauten...
und die Gegner in einem Ballergame werden auch von nem Algorithmus gezeichnet der ALLE Gegner zeichnet...
die Bereiche die dein HUD bilden verändern sich unter Umständen,
je nachdem welcher Rasse deine Spielfigur angehört
oder in welcher Epoche sich deine Rasse befindet...

Also, ich kann mir praktisch keinen Fall vorstellen, der nicht sehr speziell ist, wo man sinnvoller Weise eine Konstante verwendet.
und wenn ich 99% der Sprites dynamisch lade, fände ich das eher verwirrend, drei oder vier einzelne Sprites mit Konstanten zu bezeichnen.

Also, Sprites sind etwas ganz anderes als Gadgets in einer kleinen GUI.

wenn deine GUI sehr viel größer wird, wirst du irgendwann auch dynamisch laden und die Konstanten rauswerfen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten