RPG animations Problem

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Mathias-Kwiatkowski

Betreff: RPG animations Problem

BeitragSo, Okt 22, 2006 16:16
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Okt 22, 2006 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Okt 22, 2006 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Okt 22, 2006 19:22
Antworten mit Zitat
Benutzer-Profile anzeigen
Geht schon, funktioniert ja.... ist nur ziemlich hardcodiert...
Ich würde mir ne kleine TileEngine mit Types daraus machen, halt irgendwie so...
Code: [AUSKLAPPEN]
;-------------------------------------------------------------
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
;-------------------------------------------------------------
...oder so ähnlich
Damit bist auf jeden Fall flexibler und musst nicht bei jedem neuen Element
so viel rumtüdeln, speziell bei animierten Tiles...

mfg

Mathias-Kwiatkowski

BeitragSo, Okt 22, 2006 21:07
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMo, Okt 23, 2006 10:38
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragMi, Nov 01, 2006 15:42
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragSo, Jan 21, 2007 17:29
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group