Verzwicktes Animationsproblem {Hilfe!}
Übersicht

![]() |
N0XBetreff: Verzwicktes Animationsproblem {Hilfe!} |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() wenn tastendruck, dann wird deine variable auf laufen gestellt, und schon funktioniert es ![]() |
||
Portfolio |LinkedIn |XING |
![]() |
N0X |
![]() Antworten mit Zitat ![]() |
---|---|---|
Mist...
Ich bekomm es nicht hin ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
Twitter
Download Jewel Snake! Windows|Android |
![]() |
N0X |
![]() Antworten mit Zitat ![]() |
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Passt nicht... | ||
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5% |
![]() |
the FR3AK |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() |
||
![]() |
N0X |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Tut mir Leid, sollte nicht dreist wirken. ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Statt if Not Animating:
if Animating bla=0 then |
||
![]() |
N0X |
![]() Antworten mit Zitat ![]() |
---|---|---|
Funktioniert auch nicht, da dann ja Animiert wird, wenn animiert wird ![]() \\EDIT Ok, doch nicht, tut mir Leid, klappt nicht. |
||
Projekte: |Tibario| http://www.blitzforum.de/worklogs/325/ | 5% |
norc |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group