Verzwicktes Animationsproblem {Hilfe!}

Übersicht BlitzBasic Blitz3D

Neue Antwort erstellen

N0X

Betreff: Verzwicktes Animationsproblem {Hilfe!}

BeitragSo, Feb 15, 2009 11:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey, Community!
Ich habe folgendes Problem:

Ich habe eine Laufanimation die abgespielt wir sobald man "W" drückt.
Wenn die Taste nicht gedrückt wird, wird gestoppt.
Jetzt möchte ich eine *Idle* Animation einführen. (also das er atmet)
Allerdings wird ja die Animation gestoppt sobald kein "W" gedrückt wird!

Wie kann ich das beheben?

Hier Code: [AUSKLAPPEN]
Global player     = LoadAnimMesh("mesh\dwarf1.b3d")

ExtractAnimSeq (player,16,26)     ;Laufen
ExtractAnimSeq (player,292,325)     ;Idle
idle=1

Repeat
   
   If idle=1 Then
         If Not Animating(player)
            Animate player,1,-0.3,3,1
         EndIf
   EndIf

   PlayerBewegen()
   
Until KeyHit(1)
End


Function PlayerBewegen()
   
   If KeyDown(17) Then
      If Not Animating(player) Then
         Animate player,1,0.3,1,1
         aktiv=1
      EndIf
   EndIf
   
   If KeyDown(31) Then
      If Not Animating(player) Then
         Animate player,1,-0.3,1,1
      EndIf
   EndIf
   
   If Not (KeyDown(17) Or KeyDown(31) Or KeyDown(57) Or MouseDown(1)) Then
      Animate player,0
      idle=1
   EndIf
   
End Function


Hoffe auf Antworten!

Mfg,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%
  • Zuletzt bearbeitet von N0X am So, Feb 15, 2009 14:25, insgesamt einmal bearbeitet

juse4pro

BeitragSo, Feb 15, 2009 12:25
Antworten mit Zitat
Benutzer-Profile anzeigen
vielleicht kannst du es so machen:
du hast eine variable.
diese speichert, welche antimation GRADE abgespielt werden muss...
du animierst das model so, dass die aktuelle animation deiner variable entspricht.
setzt sie vor den tastenabfragen IMMER auf idle (1 oder 2 oder so (oder auch 0 Very Happy ))
wenn tastendruck, dann wird deine variable auf laufen gestellt, und schon funktioniert es Wink
Portfolio |LinkedIn |XING

N0X

BeitragSo, Feb 15, 2009 13:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Mist...
Ich bekomm es nicht hin Surprised
Ich habe jetzt eine Sequenz-Variable erstellt und lasse sie nach jedem Tastendruck auf Idle(0) stellen. Funktioniert nicht.

Hier der Code: [AUSKLAPPEN]
   If KeyDown(17) Then
      MoveEntity player,0,0,2.5 : pz=pz+2.5 : move2=2.5
      MoveEntity skybox,0,0,2.5
      If Not Animating(player) Then
         Animate player,1,0.3,seq,1
      EndIf
   EndIf
   
   seq=3

   If KeyDown(31) Then
      MoveEntity player,0,0,-2.5 : pz=pz-2.5 : move2=-2.5
      MoveEntity skybox,0,0,-2.5
      If Not Animating(player) Then
         Animate player,1,-0.3,seq,1
      EndIf
   EndIf
   
   seq=3
   
   If Not (KeyDown(17) Or KeyDown(31) Or KeyDown(57) Or MouseDown(1)) Then
      Animate player,1,0.3,seq,1
   EndIf


Mfg,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

juse4pro

BeitragMo, Feb 16, 2009 18:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm...
Wie wäre es mit:
Code: [AUSKLAPPEN]

;seq 3 ist idle und seq 2? wenn ja, machs so (wenn nicht, änder die werte)
   seq=3
   If KeyDown(17) Then
      seq=2
      MoveEntity player,0,0,2.5 : pz=pz+2.5 : move2=2.5
      MoveEntity skybox,0,0,2.5
   EndIf 

   If KeyDown(31) Then
      seq=2
      MoveEntity player,0,0,-2.5 : pz=pz-2.5 : move2=-2.5
      MoveEntity skybox,0,0,-2.5
   EndIf
   
   If Not Animating(player) Then
      Animate player,1,0.3,seq,1
   EndIf


so sollte das funktionieren:
vor den ganzen tastenabfragen, seq auf idle setzten
wenn tastendruck: seq auf laufen setzten
DANACH: immer animieren (nämlich immer die entsprechende animation, die mit seq gesetzt wurde)
Portfolio |LinkedIn |XING

Tankbuster

BeitragMo, Feb 16, 2009 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Warum nicht einfach so?

Zitat:

Oldanim=anim
anim=1

If Keydown(2)
anim=2
Endif

If Keydown(3)
anim=3
Endif

If oldanim<>anim Then Animate .,.,.,anim


So wäre, wenn nichts gedrückt wird, immer Animation 1 am laufen, sonst die aneren Animationen Wink
Twitter
Download Jewel Snake!
Windows|Android

N0X

BeitragMo, Feb 16, 2009 22:41
Antworten mit Zitat
Benutzer-Profile anzeigen
@Tankbuster: Klappt nicht ...

@mortus: Die Idle-Animation klappt jetzt, allerdings wird aufgrund der Abfrage ob nicht animiert wird nur die Idle Animation gespielt und keine Laufanimation! Weil die Animation ja nie stoppt!

Irgendwer Lösungsvorschläge?

Mfg,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

SpionAtom

BeitragDi, Feb 17, 2009 0:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab eigentlich keine Ahnung von 3D, aber das Problem würde ich in 2D ungefähr so lösen:
2 Variablen sind wichtig: phase gibt an, ob man läuft oder steht. ani gibt das zu zeichnende Frame an.
Zum Testen Return drücken.

Code: [AUSKLAPPEN]
Const LAUFEN = 1, STEHEN = 0

Local p$[1]
p[0] = "stehen "
p[1] = "laufen "

   SetBuffer BackBuffer()   
   phase = STEHEN

   Repeat      
   
      If KeyDown(28) And phase = LAUFEN Then ;weiterlaufen
         ani = (ani + 1) Mod 10      
      End If      
      If KeyDown(28) And phase = STEHEN Then ;loslaufen
         phase = LAUFEN
         ani = 0
      End If
      If (Not KeyDown(28)) And phase = STEHEN Then ;weiterstehen (idle)
         ani = (ani + 1) Mod 10
      End If
      If (Not KeyDown(28)) And phase = LAUFEN Then ;stehenbleiben
         phase = STEHEN
         ani = 0
      End If      
      
      Cls
      star$ = "": For i = 0 To ani: star$ = star$ + "*": Next         
      Text 0, 0, p[phase] + star
      Flip()
      Delay 50         
   
   Until KeyDown(1)
   End
os: Windows 10 Home cpu: Intel Core i7 6700K 4.00Ghz gpu: NVIDIA GeForce GTX 1080

N0X

BeitragMi, Feb 18, 2009 19:52
Antworten mit Zitat
Benutzer-Profile anzeigen
Passt nicht...
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

the FR3AK

BeitragMi, Feb 18, 2009 20:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Das was die anderen Vorschlagen ist doch gut...

Aber bei deinem ersten Code ist ein FEhler:

Code: [AUSKLAPPEN]
Animate player,0
      idle=1


Die Animation wird hier immer auf 0 gesetzt sodass die Idle Animation nicht funktionieren kann Wink

N0X

BeitragDo, Feb 19, 2009 18:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, das stimmt!
Die Lösungen sind ja gut, aber die Lösung sollte 1zu1 auf meinen Code passen, da ich sonst alles (und damit meine ich wirklich Alles!) umschreiben müsste.
Und das mit "Animate player,0" ändert auch nichts.

Momentan bin ich schon so weit das die ganze Zeit "Idle" abgespielt wird...

Code: [AUSKLAPPEN]
   If KeyDown(17) Then
      seq=1
      anim=1
      MoveEntity player,0,0,2.5 : pz=pz+2.5 : move2=2.5
      MoveEntity skybox,0,0,2.5
   EndIf

   ;seq=3
   If KeyDown(31) Then
      seq=1
      anim=1
      MoveEntity player,0,0,-2.5 : pz=pz-2.5 : move2=-2.5
      MoveEntity skybox,0,0,-2.5
   EndIf
   
   If Not (KeyDown(17) Or KeyDown(31) Or KeyDown(57) Or MouseDown(1)) Then
      seq=3
      ;Animate player,1,0.3,seq,1
   EndIf
   
   If Not Animating(player) Then
      Animate player,1,-0.3,seq,1
   EndIf


Mfg,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

Tankbuster

BeitragDo, Feb 19, 2009 18:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Nox, ich mache es bei allen Spielen von mir so. Das funktioniert. Vielleicht hast du was falsch gemacht?
Twitter
Download Jewel Snake!
Windows|Android

biggicekey

BeitragDo, Feb 19, 2009 19:53
Antworten mit Zitat
Benutzer-Profile anzeigen
N0X hat Folgendes geschrieben:

Die Lösungen sind ja gut, aber die Lösung sollte 1zu1 auf meinen Code passen, da ich sonst alles umschreiben müsste.


also das ist ja mal etwas dreist. "1zu1" auf deinen code musst du dir schon selbst schreiben!
dieses ganze thema ist nun wirklich nicht so kompliziert und dir wurden gute ansätze aufgezeigt.

Arrow selber grips anstrengen! wenns dann immernoch nix wird hast du dich wohl übernommen...

uuund manchmal muss man halt das system komplett ändern um alte fehler auszubessern!
#45 www.icekeyunlimited.de www.starcrusade.de
Gewinner BCC#17 !!! mit dotkiller
Nothing more to register - you've cleaned us out![/size]

N0X

BeitragSa, Feb 21, 2009 15:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Tut mir Leid, sollte nicht dreist wirken. Embarassed
Aber z.B. mortus Lösung funktioniert nicht, weil "If Not Animating" nie eintrifft!

Weiß da vielleicht einer eine Lösung?

@Tankbuster: Deine Lösung habe ich auch ausprobiert, hat aber leider nicht funktioniert. (Keine Animation wurde abgespielt)

Mfg,
N0X
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%

the FR3AK

BeitragSa, Feb 21, 2009 16:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Statt if Not Animating:

if Animating bla=0 then

N0X

BeitragSa, Feb 21, 2009 16:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktioniert auch nicht, da dann ja Animiert wird, wenn animiert wird Rolling Eyes

\\EDIT
Ok, doch nicht, tut mir Leid, klappt nicht.
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5%
 

norc

BeitragSa, Feb 28, 2009 12:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Erst mal, ich halte es für unklug, auf nur 2 Möglichkeiten zu begrenzen. Eher sollte man eine Liste von Keys
evaluieren, und nur wen keine gedrückt ist, auf idle schalten

Ausserdem hast du scheinbar vegessen, idle als Global zu deklarieren, trotz Verwendung in einer Function.

Und verwendung von aktiv UND idle macht nicht viel Sinn, denn im Prinzip ist idle XOR aktiv.

Ich nehm mal die Tastaturabfragungen aus der FUnktion raus, der LEsbarkeit halber...

Das Problem in deinem Code ist, dass du KeyDown verwendest, wobei doch eher Keyhit für solche Jobs
gedacht sind: Richtungswechsel. Ok, mit der Variable lastkey wird nun verhindert, dass etwas andauernd gestartet wird.

Code: [AUSKLAPPEN]

Global player     = LoadAnimMesh("mesh\dwarf1.b3d")

ExtractAnimSeq (player,16,26)     ;Laufen
ExtractAnimSeq (player,292,325)     ;Idle
idle=1

Repeat

   If (KeyDown(17)=1) and (lastkey<>17) Then
         Animate player,1,0.3,1,1
         idle=0
         lastkey=17
   EndIf
   
   If (KeyDown(31)=1) and (lastkey<>31) Then
         Animate player,1,-0.3,1,1
         idle=0
         lastkey=31
   EndIf
   
   If ( ( KeyDown(17) Or KeyDown(31) Or KeyDown(57) Or MouseDown(1) )=0) and (lastkey<>-1) Then
      Animate player,0
      idle=1
      lastkey=-1
   EndIf

Until KeyHit(1)
End


Ob keine Taste gedrückt wird, lässt sich auch in einer FOR Schleife testen, mit Werten von 0 bis 255.

Wenn es nötig sein sollte, die Animationen wegen Not Animating neu zu animieren, müsste man die Parameter sequenz, speed usw. bei der Tastaturabfrage in Variablen zwischenspeichern. damit erspart man sich nachher, herausfinden zu müssen, was denn reanimiert werden soll.
Und nicht vergessen, sollen die Variablen in Funktionen verwendet werden, müssen sie als Global deklariert sein.

Neue Antwort erstellen


Übersicht BlitzBasic Blitz3D

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group