Seite 1 von 2

Sprite auf Sprite zeichnen

Verfasst: 10.08.2006 15:41
von wolle212
Ein Hallo und Dankeschön an alle Lesenden:

ich habe mal versucht, viele kleine quadratische Sprites auf ein großes rechteckiges zu schreiben. Jedoch ohne Erfolg.
Habe es mittels folgendem Codes-Schema versucht:

Code: Alles auswählen

StartDrawing(SpriteOutput(#sprite))
For x=0 to x_may
  For y=0 to y_max
    DisplaySprite(Feld(x,y),x*30,y*30)
  next
next
StopDrawing()
Das Ergebnis war dann, wenn ich das Sprite anzeigen lassen wollte, dass der Bildschirm schwarz blieb. Habe in der Hilfe nachgeschaut und mir so gedacht, dass man da wohl jetzt Images aufmalen muss. Doch das wäre insofern blöd, als dass ich dann die Bilder ja zweimal im Speicher hätte (jaja, kann das ja nach der Spriteherstellung löschen, aber es MUSS doch das was besseres geben ...)
Und immer über die For-Schleife das Bild auszugeben ist aus programmatischer Sicht auch nich gerade sehr elegant - aber so mach ich es im Moment.

Aber um auf meine Frage zurückzukommen: Wie mach nun da das so nicht geht ich aus vielen kleinen Sprites ein großes?

Verfasst: 10.08.2006 15:49
von #NULL
-Flippbuffers()?
-außerdem schreibt die PB-hilfe:
Hinweis: Sprites sollten nicht größer als der verwendete Bildschirmmodus sein. Das Verwenden größerer Sprites kann auf mancher Hardware funktionieren, auf anderer nicht. Besser ist das Aufsplitten des großen Sprites in mehrere kleine.
-falls du eine (große) map darstellen willst, ist es aus speichertechnischer sicht schon besser viele kleine sprites mehrmals darzustellen

Verfasst: 10.08.2006 15:54
von roherter
#PB_Sprite_Texture schau dir das flag mal an ich glaube wen du sprites darüber erstellst dann müsste das mit den sprite3d befehlen gehen bin mir aber nicht sicher!

Verfasst: 10.08.2006 16:03
von wolle212
@#NULL:
Nein, FlipBuffers() ändert nichts daran; der ist nur für den Bildschirm da. Andere 2D-Malbefehle wie Box() funzen ja auch, nur DisplaySprite() nicht (wohl einfach deswegen, weil sich dabei nicht um einen solchen handelt). Muss wohl doch über die Image-Sache gehen ...

Und das generierte Sprite ist nicht so groß wie mein Bildschirmbereich, sondern max. genauso groß.

Nochmals vielen Dank für deine wirklich schnelle Hilfe :D

@roherter:
Werde mir das mal anschauen, dank gebührt auch dir :-)

Verfasst: 10.08.2006 16:19
von Jilocasin
also wenn ich das richtig verstanden hab willst du ein sprite auf ein sprite rendern, oder??? :lol:

naja egal, falls das zutrifft und du 4.0 hast machs doch mittels "UseBuffer(#Sprite)"

...
DIe Hilfe hat geschrieben:Ändert den standardmäßigen Rendering-Buffer (normalerweise der Bildschirm) auf das angegebene '#Sprite'. Dies bedeutet, dass alle folgenden DisplaySprite() ähnlichen Befehle auf dem '#Sprite' ausgegeben werden.

Um die Ausgabe wieder auf den Bildschirm-Buffer umzuleiten, benutzen Sie #PB_Default (= -1) als '#Sprite' Parameter.

Verfasst: 10.08.2006 16:19
von #NULL
hab mal geschaut. UseBuffer(#Sprite) ist das was du brauchst, und dann einfach DisplaySprite(). vor der haupt schleife aber wieder den buffer auf default (backbuffer) setzen:

Code: Alles auswählen

InitSprite()
InitMouse()
OpenScreen(1024,768,32,"fllscrn")

CreateSprite(0,32,32)
  StartDrawing( SpriteOutput(0) )
    Circle(15,15,10,$770000)
  StopDrawing()

CreateSprite(1,200,200)
  UseBuffer(1)
  For i=0 To 200/32
    For k=0 To 200/32
      DisplaySprite(0,i*32,k*32)
    Next
  Next

UseBuffer(-1)
Repeat
  ExamineMouse()
  DisplaySprite(0,10,10)
  DisplaySprite(1,100,100)
  FlipBuffers()
  ClearScreen(0)
  ;Delay(10)
Until MouseButton(2)

Verfasst: 10.08.2006 17:04
von wolle212
Jilocasin hat geschrieben:also wenn ich das richtig verstanden hab willst du ein sprite auf ein sprite rendern, oder??? :lol:
[...]
:twisted: Was gibt es denn da zu lachen!? :twisted:
Egal, ich danke euch allen aber trotzdem für die Lösung meines lächerlichen Problems ... :-)
Ihr seid echt spitze, Jungs :allright:

Verfasst: 10.08.2006 17:22
von Kaeru Gaman
@wolle

obwohl dein problem schon gelöst ist (sprite-darstellung ist nunmal kein Drawing-Vorgang ;) ) noch eine anmerkung:

falls du das für das softscrolling einer Tile-Map verwenden willst
(jedenfalls sieht mir deine schleife extrem nach einer tilemap aus)
dann mach es lieber per tile-auswahl und änderung der fein-koordinaten direkt auf den screen, als extra in ein sprite.

Verfasst: 10.08.2006 17:59
von wolle212
Also es handelt sich nicht um eine große Karte, sondern bloß um ein maximal bildschirmgroßes Sprite.
An etwas Scrollbares habe ich zwar gedacht, jedoch mich noch nicht rangetraut, von daher erübrigt sich das.

Der Grund warum ich es auf ein Sprite zeichnen will, ist der, dass sich der angezeigte Hintergrund nicht ändert. Also wird nur einmal ein großes Sprite geschaffen, anschließend wird es als ClearScreen-Äquivalent benutzt.

Verfasst: 10.08.2006 18:08
von Kaeru Gaman
ok, in dem fall hast du natürlich nen gewaltige performance-gewinn. :allright: