Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 18.09.2013, 15:47 Titel: BLoad und Get... Spritetiles speichern für Verarbeitung |
|
|
Ich kann mit BLoad ein Image laden und mit Get nunmehr einen bestimmten Bildbereich seperat sozusagen abspeichern.
Ich hätte gern dafür eine Routine welche selbstständig ein Image unter angaben der jeweiligen Größe eines Tiles aufsplittet.
Rauskommen sollten zwei Funktionen ala CreateAnimImage, wo das Bild gesplittet und die Frames gespeichert werden.
Und ein DrawAnimImage wo an Position x,y ein bestimmtes Frame, welches man der Funktion mitteilt, gezeichnet werden soll.
Wie müsste ich das mit dem Handling lösen?
Sicherlich in einem Type, aber ich würde dafür Hilfe brauchen, bzw. wenigstens ein paar Denkanstösse. |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 18.09.2013, 16:01 Titel: |
|
|
Das ginge wesentlich unkomplizierter.. es würde reichen wenn du mit BLoad ein Image lädst und mit put nur einen bestimmten teil des Bildes ausgibst.
Dürfte einiges an Zeit, Arbeit und Speicher sparen _________________
 |
|
Nach oben |
|
 |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 18.09.2013, 16:35 Titel: |
|
|
schon, aber wenn ich ein tileset mit sagen wir mal 50 tiles habe, da wäre es doch einfacher wenn man das so steuern könnte.
oder auch für animationenen.
und der code wäre wiederverwendbar...
oder meintest du das anders?
also dass bei jedem zeichnen anhand des frames und der breite+höhe jedesmal onthefly ausgerechnet wird welcher teil gezeichnet wird? |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4701 Wohnort: ~/
|
Verfasst am: 18.09.2013, 16:45 Titel: |
|
|
Wenn du 50 Tiles in seperate Bildpuffer speicherst, brauchst du auf jeden Fall wesentlich mehr Speicherplatz.Ob das Zeichnen eines Bild-Teilbereichs wesentlich mehr Zeit kostet als das Zeichnen eines kompletten kleineren Bildpuffers, weiß ich nicht; das müsste man mal testen. Aber programmiertechnisch ist es prinzipiell egal, ob du den richtigen kleinen Bildpuffer raussuchst und ausgibst oder ob du die richtige Stelle im Gesamtbildpuffer suchst und ausgibst. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 18.09.2013, 16:55 Titel: |
|
|
kann man den teilbereich denn nicht einfach seperat im speicher ablegen?
es geht ja auch nicht nur ums anzeigen, wenn da noch kollisionen etc. dazukommen würden, geht das über simples anzeigen eines bereichs eines images hinaus.
ich würde tatsächlisch jedes tile einzeln ansprechbar haben wollen und suche nun immer noch nach einer lösung für das handling |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 18.09.2013, 17:15 Titel: |
|
|
Hier ein Beispiel wie ich es zB mit einer font.bmp gelöst habe... dabei hat jeder font die gleiche größe (in meinem Beispiel 16x16) etwas verwirrend vielleicht sind es gleichzeitig 16x16 Zeichen, also insgesammt dann 256... ob das nun Fonts oder Tiles sind spielt dabei kaum eine Rolle, das Prinzip sollte gleich sein....
Auch wenn du es nun zerlegen willst, kann das Beispiel dabei helfen... statt des put, kannst du eben mit get genau diese Bereiche durchlaufen und in seperate speicherbereiche kopieren...
Code: |
'Globals
Namespace Globals
Dim FontGRX as any ptr
Dim FontWidth as Integer
Dim FontHeight as Integer
End Namespace
Sub LoadFont(byval filename as String)
Dim as Integer FF, W, H
FF = Freefile
Open filename for binary as #FF
get #FF, 19, W
get #FF, , H
Close #FF
Globals.FontWidth = W\16
Globals.FontHeight = H\16
Globals.FontGRX = Imagecreate(W,H)
Bload filename, Globals.FontGRX
End Sub
Sub DrawFont(byval fromX as Integer, byval fromY as Integer, byval drawString as String)
If (Globals.FontGRX = 0) Then Exit Sub
Dim cChar as UByte
Dim xChar as Integer
Dim yChar as Integer
For C as Integer = 0 to Len(drawString)-1
cChar = drawString[C]
xChar = cChar mod 16
yChar = cChar \ 16
Put (fromX+(C*Globals.FontWidth),fromY),Globals.FontGRX,(xChar*Globals.FontWidth,yChar*Globals.FontHeight)-((xChar*Globals.FontWidth)+(Globals.FontWidth-1),(yChar*Globals.FontHeight)+(Globals.FontHeight-1)),trans
Next C
End Sub
Sub FreeFont()
If (Globals.FontGRX) Then Imagedestroy(Globals.FontGRX)
Globals.FontWidth = 0
Globals.FontHeight = 0
End Sub
Screenres 640,480,32
LoadFont("beispiel.bmp")
DrawFont 100,100,"Test123 54"
sleep
FreeFont()
|
_________________
 |
|
Nach oben |
|
 |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 18.09.2013, 17:24 Titel: |
|
|
Danke dir das ist schonmal ein guter ansatz...
Bin in FB nicht wirklich gut, hoffe ich bekomme das gescheit hin. |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 18.09.2013, 19:58 Titel: |
|
|
Heiko hat Folgendes geschrieben: | es geht ja auch nicht nur ums anzeigen, wenn da noch kollisionen etc. dazukommen würden, geht das über simples anzeigen eines bereichs eines images hinaus. |
Wenn du einigermaßen sinnvoll programmierst, sollte Kollisionsdetektion absolut gar nichts damit zu tun haben, wie du deine Grafiken im Speicher verwaltest, sonst hast du was falsch gemacht. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Heiko
Anmeldungsdatum: 28.07.2008 Beiträge: 101
|
Verfasst am: 18.09.2013, 20:01 Titel: |
|
|
grins ja ich weiß...man sollte gfx und berechnungen anderer art voneinander trennen.... |
|
Nach oben |
|
 |
|