Kollision + Animation bei Tilemap Probleme

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

GearTechDE

ehemals 'KillerJo96'

Betreff: Kollision + Animation bei Tilemap Probleme

BeitragMi, Jul 06, 2011 20:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo, ich bin im Moment ja dabei, mit Tiles und so zu arbeiten.

Habe jetzt auch schon meine erste Map (Juhu) und einen kleinen Character Tile.

Ich habe genau 2 Probleme.

1. Ich habe eine normale Map mit Data gemacht (20x20). Jetzt hab ich aber keinen Schimmer wie ich das angehen soll. Könnte mir vllt. einer einen Beispiel Code posten? Wäre echt hilfreich.

2. Ich habe ein Tileset mit vielen verschiedenen Charakteren drauf. Alle Charaktere zeigen einmal in alle Richtungen... So jetzt habe ich es so gemacht:

Ich habe jeweils ne Variable erstellt:

Code: [AUSKLAPPEN]

Global PlayerX
Global PlayerY
Global FRAME


So...

Dann in der Loop:

Code: [AUSKLAPPEN]

DrawImage CHARTILE,PlayerX,PlayerY,FRAME


Dann auch noch für die Tastenbelegung...

Code: [AUSKLAPPEN]

        If KeyDown(17) Then PlayerY = PlayerY - 1 : FRAME = 0
   If KeyDown(31) Then PlayerY = PlayerY + 1 : FRAME = 65
   If KeyDown(32) Then PlayerX = PlayerX + 1 : FRAME = 33
   If KeyDown(30) Then PlayerX = PlayerX - 1 : FRAME = 97


Somit ist die FRAME Anzahl immer das Tile, welches gemalt werden soll, wenn der Charakter nach z.B. rechts laufen soll.

Jedoch gibt es für jede Richtung 2 verschiedene Bewegungen für eine Animation wie z.B. laufen.

Jetzt weiß ich nicht wirklich, wie ich die 2 Tiles immer abwechselnd zeichnen soll.

Ich hoffe ihr versteht so ganz grob was ich meine xD

LG Killerjo96
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragMi, Jul 06, 2011 20:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Beispielcode für was? Hast du die Robsite Tutorials zum Thema RPG durch?
Frames abwechseln würde ich mit einem Millisecs Timer.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

GearTechDE

ehemals 'KillerJo96'

BeitragMi, Jul 06, 2011 21:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja aber wie mit dem Millisecs

Edit: Bei dem Tutorial von Robsite ... welches ist das denn.. sind ja mehrere? Die 1-6 Teile da?

Weil da wird nicht genau mein Problem geschildert... sondern macht der das anders.
Mit freundlichen Grüßen: GearTechDE
  • Zuletzt bearbeitet von GearTechDE am Mi, Jul 06, 2011 21:12, insgesamt einmal bearbeitet

Sir Gauss der III

BeitragMi, Jul 06, 2011 21:06
Antworten mit Zitat
Benutzer-Profile anzeigen
die Frage 1 kann ich grad nicht so nach vollziehen.

zur Frage 2, allgemein zu abläufen:

erstell eine Zustandsvariable für den Charakter und eine zeitvariable

in der ersteren speicherst du in welchem Modus sich dein Charakter befindet (z.B. 1 für gehen; 0 für stehen ...)
in der zweiten, wie lange er sich maximal darin befinden soll (je nach Framrate usw)

dann zählst du die zeitvariable einfach runter, bei null angelangt verändert sich der Zustand (zb in 2 für gehen zweites Bild)

den Zustand zählst du dann immer zur Richtung dazu um das entsprechende Bild auszulesen.

Code: [AUSKLAPPEN]
zeit=10
zustand=1
richtung=1



Repeat
   
   zeit=zeit-1
   If zeit<=0 Then
      If zustand>0 Then
         zustand=2-zustand
      EndIf
      zeit=10
   EndIf
   
   DrawImage bild,x,y,richtung+zustand

Until ...


hoffe das hilf

BladeRunner

Moderator

BeitragMi, Jul 06, 2011 21:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Forensuche millisecs und timer sollte mehrere brauchbare ergebnisse liefern.
EDIT: Sir Gauss, Zählvariablen laufen auf jedem Rechner unterschiedlich schnell. Das war auf dem C64 in Ordnung, heutzutags ist das voll daneben Wink
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
  • Zuletzt bearbeitet von BladeRunner am Mi, Jul 06, 2011 21:08, insgesamt einmal bearbeitet

Midimaster

BeitragMi, Jul 06, 2011 21:07
Antworten mit Zitat
Benutzer-Profile anzeigen
BlitzBasic: [AUSKLAPPEN]
LaufFrame = 1- LaufFrame
DrawImage CHARTILE , PlayerX , PlayerY , FRAME+LaufFrame

GearTechDE

ehemals 'KillerJo96'

BeitragMi, Jul 06, 2011 21:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Naja, erstmal drüber nachdenken was die Profis schreiben.. und ausprobieren.

Danke für die Antworten.
Mit freundlichen Grüßen: GearTechDE
 

PhillipK

BeitragDo, Jul 07, 2011 8:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich würde dazu raten, ein-zwei variablen im Charakter Type anzulegen.
Wahlweise, falls kein Charakter-type vorhanden ist, tuts eine globale, erstmal testweise Smile (ps: globals sollte man nur bedingt nutzen, dh ein Charaktertype eignet sich^^)

BlitzBasic: [AUSKLAPPEN]
Local frame:Int = 0
Local action:Int = 0
Local Char_timer:Int = MilliSecs()


mit 'action' bezeichne ich immer eine aktion die ein Charakter grade durchführt. zb: Gehen.
Im idealfall sind deine animationen so geordnet, das du zb immer 8 bilder pro 'aktion' hast, somit kannst du action als faktor nehmen.
Frame hingegen ist eine angabe, welcher frame der momentanne aktion läuft.
So kannst du 'frame' umschalten, zb alle 250ms.

Hierzu ein kleines beispiel:

BlitzBasic: [AUSKLAPPEN]
If KeyDown(17) Then 
PlayerY = PlayerY - 1 : action= 1
If char_timer < MilliSecs() Then
char_timer = MilliSecs()+250
frame = 1-frame
EndIf
ElseIf KeyDown(31) Then
PlayerY = PlayerY + 1 : action = 2
If char_timer < MilliSecs() Then
char_timer = MilliSecs()+250
frame = 1-frame
EndIf
ElseIf KeyDown(32) Then
PlayerX = PlayerX + 1 : action = 3
If char_timer < MilliSecs() Then
char_timer = MilliSecs()+250
frame = 1-frame
EndIf
ElseIf KeyDown(30) Then
PlayerX = PlayerX - 1 : action = 4
If char_timer < MilliSecs() Then
char_timer = MilliSecs()+250
frame = 1-frame
EndIf
Else
action = 0 ;zurück auf idle!
EndIf


;sonstiger krams, landschaftszeichnung etc.
DrawImage CHARTILE , PlayerX , PlayerY , (action*2)+frame ; action*2 ist nur ein beispiel!
; Um action *2 mal zu erläutern:
; wenn du für jede richtung, aktion und was weiß ich was genau 2 frames hast, ist mein beispiel so nutzbar.
; action gibt immer die aktion an, frame = 1-frame schaltet zwischen 1 und 0 hin und her.
; somit musst du bei action*2 auf das ERSTE bild deiner animation kommen.
; es würde theoretisch auch mit 4 oder mehr bildern pro animation gehen, allerdings funktioniert das simple umschalten der FRAME variable nichtmehr so easy - also gehe ich von 2 aus!



So, das war eine grobe erklärung meinerseits.

Um noch genauer auf das Zeitliche umschalte einzugehen, schauen wir uns nocheinmal das hier an:
BlitzBasic: [AUSKLAPPEN]
     If char_timer < MilliSecs() Then
char_timer = MilliSecs()+250
frame = 1-frame
EndIf


Millisecs() liefert die anzahl der millisekunden! seit computer start.
Es ist also anzunehmen, das es diese Zahl recht gut tut Smile

char_timer <- Das ist eine variable, die das letzte umschalten der Variable speichert!
beim umschalten siehst du, das char_timer = Millisecs()+250 gemacht wird.
Die 250 steht für 250ms in der Zukunft, es ist also davon auszugehen, das das umschalten immer nach etwa 250 ms geschieht, da ich pro aufruf prüfe, ob char_timer KLEINER millisecs() ist.
Bei einem umschalten passierts nun:

Ms ist 1000.
char_timer ist 0.
char_timer wird auf 1000+250 == 1250 gesetzt.

251 ms später sieht das ganze soi aus, das char_timer < Millisecs() ist, somit gibts wieder ein match.

Und nun zum letzten - das umschalten zwischen 1 und 0.

Local x = 1

x = 1-x ; 1-1 == 0!
x = 1-x ; 1-0 == 1!
x = 1-x ; 1-1 == 0!

e voila! ein umschalter.

Es mag allerdings etwas doof sein, das man für jeden der tasten eine identische If abfrage nutzt, das erhöht die fehlerquote.
Nunja, man könnte das ganze auch auslagern, aber was solls. Die arbeit liegt bei dir, ich habe dir nur eine simple möglichkeit mit blöden rahmenbedingungen genannt, die schönste ist es trotzdem nicht Smile
Vielleicht hilfts ja!

Ps: Ich hoffe der code ist so einigermaßen okay, ich kann Blitz Basic nimmer :< Nurnoch blitzmax. Ansonsten musst du es sinngemäß abschreiben! Smile

Nachtrag:

Solltest du mehr frames wie 2 haben, kannst du evtl MOD benutzen.
Mod gibt den rest einer Division zurück!

also könntest du zb so hochzählen:

Frame = (1+frame) Mod FrameZahl

Solange frame kleiner als FrameZahl bleibt, ist alles okay.
In dem moment, wo beide gleichgroß sind, wird 'frame' auf 0 gesetzt! das solltest du beim verwenden beachten Smile

GearTechDE

ehemals 'KillerJo96'

BeitragDo, Jul 07, 2011 13:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ok danke, werde das jetzt bald mal ausprobieren und dann lernen xD, dann wäre mein einziges Problem nur noch die Kollision, welche ich nicht hinkriege. am besten wäre ein kompleeter Beispiel Code. darunter kann ich mir am bestem vorstellen wie sowas funktioniert. dann versuche ich mir den anzugucken und zu lernen...
Mit freundlichen Grüßen: GearTechDE

Xeres

Moderator

BeitragDo, Jul 07, 2011 13:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Es gibt Tutorials (siehe oben) die auch Kollision beinhalten und das Forum sollte auch vor Tilemap Kollision überquellen - da machst du dich mit bitten um eine Extra-Wurst nicht unbedingt beliebt. Alles was du willst gibt es schon, du müsstest nur suchen.
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

GearTechDE

ehemals 'KillerJo96'

BeitragDo, Jul 07, 2011 18:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Na... gut... man brauch sich ja nicht direkt so aufzuregen...
Mit freundlichen Grüßen: GearTechDE

BladeRunner

Moderator

BeitragDo, Jul 07, 2011 20:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Das war noch sehr höflich von Xeres formuliert. Wenn Du willst dass dir geholfen wird zeig dass Du selbst willens bist dir zu helfen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

GearTechDE

ehemals 'KillerJo96'

BeitragDo, Jul 07, 2011 23:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Okey, okey... tut mir Leid... verstehe das i-wie komplett falsch ...
Mit freundlichen Grüßen: GearTechDE

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group