RPG animations Problem
Übersicht

![]() |
Mathias-KwiatkowskiBetreff: RPG animations Problem |
![]() Antworten mit Zitat ![]() |
---|---|---|
hi leute ich habe dieses mal ein richtig dickes problem, kenne keinen ausweg mehr, mein rpg code ist eigentlich sehr übersichtlich und sollte auch sehr gut aufgebaut sein, das finde ich jedenfalls, aber ich habe ein problem mit animationen, die genaue beschreibung zu meinem Problem findet ihr hier, ich habe extra eine webseite erstellt weil es dazu eine genaue erklärung gibt mit nen paar bildern die es einfacher machen solln mein problem zu verstehen.
Danke wenn ihr mir hilft http://purechannel.ath.cx/ProblemRPG/ |
||
![]() |
Rone |
![]() Antworten mit Zitat ![]() |
---|---|---|
moin,
geht doch schon fast... if map(x,y) = 1068 muss halt If map(x,y) >= 1068, damit auch alle wasser-tiles animiert werden.... Und dann muss halt noch sichgestellt werden, dass das neue Tile auch gültig ist... If map(x,y) >= 1116 Then map(x,y)=1068 + ( map(x,y)-1116 ) EndIf Code: [AUSKLAPPEN] Global timer=MilliSecs()
Function Animation() If (MilliSecs() - timer) > 200 Then animimage=animimage+1 If animimage=4 Then animimage=0 timer = MilliSecs() cam_x_div = cam_x /16 cam_y_div = cam_y / 16 For x = cam_x_div To cam_x_div + 64 For y = cam_y_div To cam_y_div + 48 If map(x,y)>=1068 map(x,y)=map(x,y)+12*animimage If map(x,y) >= 1116 Then map(x,y)=1068 + ( map(x,y)-1116 ) EndIf EndIf Next Next EndIf End Function mfg Rone |
||
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
danke dir des hat mir echt mal weitergeholfen, gab es den sonst etwas am quellcode auszusetzen oder ist dieser so gut das man darau mal ein spiel machen könnte? | ||
![]() |
Rone |
![]() Antworten mit Zitat ![]() |
---|---|---|
Geht schon, funktioniert ja.... ist nur ziemlich hardcodiert...
Ich würde mir ne kleine TileEngine mit Types daraus machen, halt irgendwie so... Code: [AUSKLAPPEN] ;-------------------------------------------------------------
...oder so ähnlich
Type TElement Field txt Field tyt Field ico Field frames Field timer Field timerDelay End Type ;------------------------------------------------------------- Type TileMap Field element.TElement[1000] Field elemtAnz Field tileSet Field tileSize Field mapwidth Field mapheight Field scrollX Field scrollY Field map[1000000] End Type ;------------------------------------------------------------- Function Create.TileMap(tileSize,mapwidth,mapheight) m.TileMap = New TileMap ;initialisieren Return m End Function ;------------------------------------------------------------- Function Scroll(map.TileMap,x,y) map\scrollY=map\scrollY+y map\scrollX=map\scrollX+x End Function ;------------------------------------------------------------- Function Draw(map.TileMap) ;Sichtbaren teil des Maps einzeichnen End Function ;------------------------------------------------------------- Function AnimateMap(map.TileMap) ;Sichtbare Animierte Elemente animieren End Function ;------------------------------------------------------------- Function AddTileSetElement(map.TileMap,tileSetElement,txt,tyt,frames) ;tileSetElement zu map\tileSet hinzufügen End Function ;------------------------------------------------------------- Function SetMapXY(map.TileMap,x,y,elementNr) ;Element in TileMap setzten End Function ;------------------------------------------------------------- Damit bist auf jeden Fall flexibler und musst nicht bei jedem neuen Element so viel rumtüdeln, speziell bei animierten Tiles... mfg |
||
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
ja haste wohl recht, nur habe keine ahnung wie ich meine welt mit types machen soll also rein theroritisch müsste man es so machen wie bei diesem dim feld, einfach x,y und icon.... ist aber auch nen ganzes stück arbeit denke ich
ich lasse es erst mal so... mal sehen wenns nimmer geht werde ich wohl alles umschreiben müssen..... naja trotzdem erst mal danke an euch . habt mir sehr weitergeholfen! |
||
Omenaton_2 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Ich habe mir - vor allem aus Zeitgründen - deinen Code nicht angeschaut, nur die Seite mit den Beispielbildern.
Ich glaube aber, daß ich auch so schon begriffen habe, womit du Schwierigkeiten hast. Ich kann dir grundsätzlich empfehlen, die Sache mit den animierten Tiles richitg, gründlich, zukunftsfähig zu regeln. Siehe es so, daß wenn du das jetzt richtig machst, dann steht dir dieses wichtige Programmteil auch für zukünftige, ähnliche Projekte zur Verfügung. Ich habe ein 2D RTS Spiel in Iso-Ansicht gemacht, bei dem ich Boden Tiles habe, die zum Teil animiert sind, zum Teil nicht. Einige haben nur 3 Frames, andere 8 und die Geschwindigkeit kann auch variieren. Ich habe das schon vor fast 2 Jahren programmiert und habe jetzt nicht mehr alles Genau im Kopf. Ich habe es aber so gemacht, daß ich extra ein kleines Animationstool programmiert habe, das die Aufgabe hatte, die Tiles einzuladen, anzuzeigen und hier konnte ich für jedes Bild (damit meine ich eine Folge von 0-X Frames) Delay und Loopen oder Ping-Pong einzustellen. Hier habe ich bestimmt, wie Viele Frames zu einem Tile gehören. Es war also so, daß manche Tiles nur 1 Frame hatte, andere waren lange BMPs mit mehreren Frames. Das mußte ich irgendwie wissen, wenn ich die vielen (ich habe mehrere Hundert Tiles) in Spiel richtig einladen wollte. Manche Tiles mußten ja ganz normal eingeladen werden, andere mit LoadAnimImage und Angabe der Anzahl der Frames. Ich habe in dem Animationstool die Eigenschaften aller Tiles beschrieben und dann habe ich daraus eine TXT-Datei gemacht, wo alles festgehalten wurde. Dann, beim Laden der Tiles in Game wird aus dieser externen TXT-Datei für jeden einzelnen zu Ladenden Tile die Eigenschaft ausgelesen, wie Viele Frames es hat, etc. Eigentlich ist nur Frame Anzahl wichtig. Das Animationstool zu machen ist nicht viel Arbeit, nur ca. 1 Tag, weil man das aus dem Leveleditor oder Game macht. Nicht komplett neu. Man entfernt alles was man nicht braucht und erweitert es um die paar neue Features. Fazit: Halte die Angabe zu der Frameanzahl aller Tiles in einer Datei fest. Beim Laden kannst du aus dieser Datei erfahren, wie Viele Frames du laden mußt. Du kannst auf diese Datei auch bei der Darstellung der Grafik zurückgreifen, natürlich nicht so, daß du ständig aus der Datei direkt liest, sondern so, daß du die Datei ein Mal am Start liest und den Inhal in ein DIM oder Type oder Bank ablegst wo du schnellen Zugriff darauf hast. Wenn du nur die Anzahl der Frames einstellen willst, dann könntest du dir ein Animationstool auch sparen. Erstelle eine Text-Datei mit Windows Notepad und schreibe einfach in jede Zeile die Anzahl der Frames. Jede Zeile entspricht einem Tile, richtig schon durchnummeriert. |
||
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
hi ich ahbe nun mal versucht meine animationen in einem type feld zu packen das ergebniss ist das es nicht animiert ist, die frage ist warum, hier der code
Code: [AUSKLAPPEN] ;Grafikmodus etc. initialisieren Graphics 1024, 768, 0,1 ;HidePointer ClsColor 100,150,100 Global kachel=LoadAnimImage ("Data\RPG-Tiles.BMP",32,32,0,8) Global timer = MilliSecs() SetBuffer BackBuffer() ;Variablen der "Kamere" Global cam_x Global cam_y Global cam_speed = 20 Global frame ;Die Tilemap wird hier erstellt Dim tilemap(1000,1000) For x = 0 To 999 For y = 0 To 999 tilemap(x,y) = 1 Next Next For x = 1 To 998 For y = 1 To 998 tilemap(x,y) = 0 Next Next ; Golobaliesierung und erstellen von Types, in diesem Type kommen alle animationen rein ; wenn man nun wasser animieren möchte und es das gleiche tile ist dann reicht es wenn es einmalig eingetragen ist. Global Info.Tiles Type Tiles Field Animotion_Start_Tile Field Animotion_End_Tile Field Animotion_Frame End Type ;eintrag von ner anderen animation Info.Tiles=New Tiles info\Animotion_Start_Tile=2 info\Animotion_End_Tile=3 info\Animotion_Frame=1 ; eintrag vom animierten wasser Info.Tiles=New Tiles info\Animotion_Start_Tile=4 info\Animotion_End_Tile=4 info\Animotion_Frame=1 ;Die Hauptschleife While Not KeyHit(1) Cam_Control() DrawTileMap() xt = ((MouseX()+cam_x)/32) yt = ((MouseY()+cam_y)/32) x = xt *32 -cam_x y = yt *32 -cam_y Color 255,255,255 Text 10,10,"X-Position:"+xt+" Y-Position:"+yt+" Icon:"+tilemap(xt,yt)+" Kamera Speed:"+cam_speed Color 255,0,0 Rect x,y,32,32 If (MilliSecs() - timer) > 100 Then For Info.Tiles=Each Tiles info\Animotion_Frame=info\Animotion_Frame+1 Next timer = MilliSecs() EndIf For Info.Tiles=Each Tiles If info\Animotion_Frame>info\Animotion_End_Tile-1 Then info\Animotion_Frame=1 Next Color 255,255,255 Info.Tiles=First Tiles Text 10,25, info\Animotion_Frame Info.Tiles=Last Tiles Text 10,50, info\Animotion_Frame Flip Wend ;Die Sichtbaren Tile werden gezeichnet Function DrawTileMap() cam_x_div = cam_x / 32 cam_y_div = cam_y / 32 ;Malt 21*16 Tiles statt 100*100 Tiles For x = cam_x_div To cam_x_div + 32 For y = cam_y_div To cam_y_div + 24 For Info.Tiles=Each Tiles If tilemap(x,y)>info\Animotion_Start_Tile And tilemap(x,y)<Animotion_End_Tile Then DrawImage kachel,x*32-cam_x,y*32-cam_y ,tilemap(x,y)+info\Animotion_Frame Else DrawImage kachel,x*32-cam_x,y*32-cam_y ,tilemap(x,y) EndIf Next Next Next End Function Function Cam_Control() ;Die Kamera wird hier mit Pfeiltasten gesteuert, Q und A beeinflussen den Speed If KeyDown(203) Then cam_x = cam_x - cam_speed : spieler_x = spieler_x -cam_speed /32 If KeyDown(205) Then cam_x = cam_x + cam_speed : spieler_x = spieler_x + cam_speed /32 If KeyDown(200) Then cam_y = cam_y - cam_speed : spieler_y = spieler_y - cam_speed /32 If KeyDown(208) Then cam_y = cam_y + cam_speed : spieler_y = spieler_y + cam_speed /32 If KeyDown(78) Then cam_speed = cam_speed + 1 If KeyDown(74) Then cam_speed = cam_speed - 1 If MouseX()>-2 And MouseX()<10 Then cam_x = cam_x - cam_speed If MouseX()>1024-10 And MouseX()<1024 Then cam_x = cam_x + cam_speed If MouseY()>-2 And MouseY()<10 Then cam_y = cam_y - cam_speed If MouseY()>768-10 And MouseY()<768 Then cam_y = cam_y + cam_speed If cam_x < 0 Then cam_x = 0 If cam_y < 0 Then cam_y = 0 If cam_x > 1000*32-1024 Then cam_x = 1000 *32-1024 If cam_y > 1000*32-768 Then cam_y = 1000 *32-768 If MouseDown(1) Then xt = ((MouseX()+cam_x)/32) yt = ((MouseY()+cam_y)/32) x = xt *32 -cam_x y = yt *32 -cam_y If tilemap(xt,yt)=1 Then Else tilemap(xt,yt)=4 EndIf EndIf If MouseDown(2) Then xt = ((MouseX()+cam_x)/32) yt = ((MouseY()+cam_y)/32) x = xt *32 -cam_x y = yt *32 -cam_y If tilemap(xt,yt)=1 Then Else tilemap(xt,yt)=2 EndIf EndIf ;Hier wird verhindert, dass die Kamera ausserhalb der Map gerät End Function ich habe die bilder nun mal weggelassen |
||
![]() |
Mathias-Kwiatkowski |
![]() Antworten mit Zitat ![]() |
---|---|---|
auch im jahr 2007 wollte ich es schaffen ein rpg game mit animation zu machen, nur diesmal habe ich nicht ein tileset genommen sondern mehrere bilder
ich habe es versucht auf verschiedener art zu lösen, leider nicht geschafft, ohne viele worte vll hat jemand lust es sich anzusehen und mir etwas unter die arme zu greifen.?=? http://purechannel.ath.cx/RPG-Game.rar 1,35MB darin sind alle daten die ihr benötigt um es zu testen, rechts die leiste ist allerdings beabsichtigt, da soll ein spielmenu später mal rein. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group