Fast Image Bibliothek V.1.2 von ??? |
Da nun schon häufiger die Frage nach 3d Sprites in 2d Anwendungen aufgetaucht sind habe ich eine passende Bibliothek geschrieben. Ich verwende übrigens Meshes, so daß man auch Lichter einsetzen kann. [code:1:5039013580] ; Fast Image Bibliothek ; (C) 2003 by Lars Holger Roth ; Kontakt : BigSnake@web.de ; Version : 1.1 ; Wird die Bibliothek in einem Projekt benutzt, so muß dies in den Credits erwähnt werden ; ACHTUNG : Benötigt Blitz 3d ; ACHTUNG : Die Z-Order der Bilder wird durch die Reihenfolge, in der die Bilder erstellt ; werden festgelegt ; Erweiterung in 1.1 ; Fast alle Funktionen sind nun auch für Sprites verfügbar. Sprites werden nicht von Licht ; Quellen beeinflußt. Sie sind jedoch so eingestellt, daß deren Farben sich mit denen der ; Fast_Images vermischen. Somit können sie für Lichteffekte, Explosionen etc. benutzt werden ; Erweiterung in 1.2 ; Man kann nun mit 2d Befehlen auf die Oberfläche eines Fast Images zeichnen.Dadurch ist es ; möglich die Oberfläche so wie den Bildschirm zu benutzen. Dadurch sind unglaubliche Effekte ; möglich wie zum Beispiel eine Tilemap mit echten Lichteffekten. ; Dafür ruft man zuerst Fast_SetBuffer(Image) auf und nach den Zeichen Operationen Fast_Update(Image) ; Damit kein Tempo verloren geht sollte wie folgt vorgegangen werden ; 1.) Texture.Fast_Texture = New Fast_Texture ; 2.) Image.Fast_Image = New Fast_Image ; 3.) Fast_LoadTexture(Texture,"Datei.png",256) ; Damit wird die Textur im VRAM abgelegt ; 4.) Fast_ImageFromTexture(...) ; Schritt 3 ist enorm wichtig, ansonsten fällt das Tempo um gut 40 fps ab. ; Initialisieren der Engine ------------------------------------------------------------- ; Nachdem mit Graphics3d in den Grafikmodus gewechselt wurde muß die Engine über Aufruf ; der Funktion Fast_Init() initialisiert werden. Ohne den Aufruf der Funktion werden die ; Grafiken nicht korrekt angezeigt. ; Die Bibliothek eignet sich nur für 2d Spiele, die mit Effekten aufgewertet werden sollen. ; Es ist wichtig Graphics3d anstatt Graphics zu benutzen und es dürfen keine Camera Befehle ; verwendet werden. Die Bilder werden nur angezeigt, wenn RenderWorld benutzt wird !!! ; --------------------------------------------------------------------------------------- ; Texturen laden ------------------------------------------------------------------------ ; Zuerst benötigt man einn Typ Fast_Texture. Im Gegensatz zu einer normal geladenen Textur ; werden hier später wahrscheinlich noch zusätzliche Funktionen integriert. ; Der Typ wird dann als Parameter an die Funktion Fast_LoadTexture() übergeben ; --------------------------------------------------------------------------------------- ; Bild von Textur ableiten -------------------------------------------------------------- ; Zuerst benötigt man einen Typ Fast_Image. Man verwendet dann einfach die Funktion ; Fast_ImageFromTexture(Image,Texture,Width,Height,X,Y,Active). Ist Active = true, so ; wird das Bild auch bereits angezeigt. ; --------------------------------------------------------------------------------------- ; Bild mit Texur laden ------------------------------------------------------------------ ; Lädt die Textur direkt in das Bild, so daß nicht extra eine Textur erstellt werden muß ; Dafür verbraucht diese Methode aber für jedes Bild den Speicher der Textur und man kann ; keinen Modus angeben. Diese Funktion eignet sich also vor allem für ein einzelnes Bild, ; spricht eines, das einmalig vorkommt. ; --------------------------------------------------------------------------------------- ; Bild von Bild ableiten ---------------------------------------------------------------- ; Erstellt eine 1:1 Kopie eines Bildes. Fast_CopyImage(Image1,Image2) ; --------------------------------------------------------------------------------------- ; Bild positionieren -------------------------------------------------------------------- ; Ein aktives Bild kann beliebig auf dem Bildschirm positioniert werden. Dafür wird die ; Funktion Fast_Position(Image,X,Y) benutzt ; --------------------------------------------------------------------------------------- ; Bild anzeigen ------------------------------------------------------------------------- ; Mit dem Befehl Fast_Activate(Image) kann das Bild angezeigt werden ; --------------------------------------------------------------------------------------- ; Bild Anzeige sperren ------------------------------------------------------------------ ; Mit dem Befehl Fast_Deactivate(Image) wird die Anzeige des Bildes unterbunden ; --------------------------------------------------------------------------------------- ; Bild einblenden/ausblenden ------------------------------------------------------------ ; noch nicht implementiert ... ; --------------------------------------------------------------------------------------- ; Bild rotieren / skalieren ------------------------------------------------------------- ; Das Bild rotieren kann man mit Fast_Rotate(Image,AbsolutWinkel) und skalieren mit ; Fast_Scale(Image,Width,Height) ; --------------------------------------------------------------------------------------- ; Alphawert des Bildes einstellen ------------------------------------------------------- ; Mit der Funktion Fast_Alpha kann man einem Bild einen Alphawert von 0 bis 1 zuweisen ; Fast_Alpha(Image,Alpha#) ; --------------------------------------------------------------------------------------- ; Bild aus dem Speicher entfernen ------------------------------------------------------- ; Löscht die Daten des Bildes. Der Type bleibt jedoch bestehend und muß seperat gelöscht ; werden, wenn man es nicht mehr braucht Fast_FreeImage(Image) ; --------------------------------------------------------------------------------------- ; Typen --------------------------------------------------------------------------------- Type Fast_Texture Field Index ; Handle der Textur Field Name$ ; Orignal Dateiname der Textur End Type Type Fast_Image Field Mesh ; Handle des Bildes Field X ; Bildschirm Koordinaten Field Y Field Active ; Flag : Anzeigen oder nicht Field Texture ; Handle der zugehörigen Textur Field OwnTexture ; Flag : True = keine externer Textur Type wird benutzt Field Width Field Height End Type Type Fast_Sprite Field Sprite Field X Field Y Field Active ; Flag : Anzeigen oder nicht Field Texture ; Handle der zugehörigen Textur Field OwnTexture ; Flag : True = keine externer Textur Type wird benutzt Field Width Field Height End Type Type Fast_Light Field Light ; Handle des Lichts Field Active ; Licht rendern oder nicht Field X ; Die Position des Lichts Field Y Field Z# ; Höhe des Lichts über dem Geschen Field RGB[3] ; Die Farbe des Lichts Field Mode ; Typus des Lichts Field Gradient ; Winkel für Scheinwerferlicht Field Range ; Reichweite des Lichts End Type ; Globale Variablen --------------------------------------------------------------------- Global Fast_Camera Global Fast_GfxWidth Global Fast_GfxHeight Global Fast_HalfWidth Global Fast_HalfHeight Function Fast_Init() Fast_GfxWidth = GraphicsWidth() Fast_GfxHeight = GraphicsHeight() Fast_HalfWidth = Fast_GfxWidth / 2 Fast_HalfHeight = Fast_GfxHeight / 2 Fast_Camera = CreateCamera() CameraZoom Fast_Camera,1.0 CameraRange Fast_Camera,1,Fast_HalfWidth + 1000 CameraClsMode Fast_Camera,0,1 End Function Function Fast_LoadTexture(Texture.Fast_Texture,TextureFile$,Mode = 0) TextureIndex = LoadTexture(TextureFile$,Mode) If Not TextureIndex RuntimeError "Textur : "+TextureFile$+" konnte nicht geladen werden." TextureName$ = TextureFile$ End Function Function Fast_FreeTexture(Texture.Fast_Texture) If TextureIndex <> 0 FreeTexture TextureIndex End Function Function Fast_ImageFromTexture(Image.Fast_Image,Texture.Fast_Texture,Width,Height,X,Y,Active) ImageMesh = CreateMesh() Local v0,v1,v2,v3,v4,v5,s1,s2 ; Erstes Dreick s1 = CreateSurface(ImageMesh) v0 = AddVertex(s1,0,0,0,0,0,0) v1 = AddVertex(s1,1,1,0,1,-1,0) v2 = AddVertex(s1,0,1,0,0,-1,0) AddTriangle(s1,v2,v1,v0) UpdateNormals ImageMesh ; Zweites Dreick s2 = CreateSurface(ImageMesh) v3 = AddVertex(s2,0,0,0,0,0,0) v4 = AddVertex(s2,1,0,0,1,0,0) v5 = AddVertex(s2,1,1,0,1,-1,0) AddTriangle(s2,v5,v4,v3) UpdateNormals ImageMesh ; Skaliert das Bild ScaleEntity ImageMesh,Width,Height,1 ImageX = X ImageY = Y ImageActive = Active ImageWidth = Width ImageHeight = Height If Active Then ; Anzeigen : Wird vor der Kamera positioniert PositionEntity ImageMesh,ImageX-Fast_HalfWidth,-ImageY-ImageHeight+Fast_HalfHeight,Fast_HalfWidth;Fast_HalfHeight-Y,Fast_HalfWidth Else ; Nicht anzeigen : Wird hinter der Kamera positioniert PositionEntity ImageMesh,0,0,-5000 EndIf ; Textur überspannen EntityTexture ImageMesh,TextureIndex ImageTexture = TextureIndex ImageOwnTexture = False End Function Function Fast_ImageFromFile(Image.Fast_Image,TextureFile$,Width,Height,X,Y,Active) Local Texture = LoadTexture(TextureFile$) ImageMesh = CreateMesh() Local v0,v1,v2,v3,v4,v5,s1,s2 ; Erstes Dreick s1 = CreateSurface(ImageMesh) v0 = AddVertex(s1,0,0,0,0,0,0) v1 = AddVertex(s1,1,1,0,1,-1,0) v2 = AddVertex(s1,0,1,0,0,-1,0) AddTriangle(s1,v2,v1,v0) UpdateNormals ImageMesh ; Zweites Dreick s2 = CreateSurface(ImageMesh) v3 = AddVertex(s2,0,0,0,0,0,0) v4 = AddVertex(s2,1,0,0,1,0,0) v5 = AddVertex(s2,1,1,0,1,-1,0) AddTriangle(s2,v5,v4,v3) UpdateNormals ImageMesh ; Skaliert das Bild ScaleEntity ImageMesh,Width,Height,1 ImageX = X ImageY = Y ImageActive = Active ImageWidth = Width ImageHeight = Height If Active Then ; Anzeigen : Wird vor der Kamera positioniert PositionEntity ImageMesh,ImageX-Fast_HalfWidth,-ImageY-ImageHeight+Fast_HalfHeight,Fast_HalfWidth Else ; Nicht anzeigen : Wird hinter der Kamera positioniert PositionEntity ImageMesh,0,0,-5000 EndIf ; Textur überspannen EntityTexture ImageMesh,Texture ImageTexture = Texture ImageOwnTexture = True End Function ; Kopiert Image 1 nach Image 2 Function Fast_CopyImage(Image1.Fast_Image,Image2.Fast_Image) ; Löscht alle Ressourcen in Image 2 If Image2OwnTexture Then FreeTexture Image2Texture Image2OwnTexture = False EndIf If Image2Mesh <> 0 Then FreeEntity Image2Mesh EndIf ; Kopiert die Daten Image2Mesh = CopyEntity(Image1Mesh) Image2Texture = Image1Texture Image2X = Image1X Image2Y = Image1Y Image2Active = True Image2Width = Image1Height Image2Height = Image1Height End Function Function Fast_Position(Image.Fast_Image,X,Y) PositionEntity ImageMesh,X-Fast_HalfWidth,-Y-ImageHeight+Fast_HalfHeight,Fast_HalfWidth ImageX = X ImageY = Y End Function Function Fast_Activate(Image.Fast_Image) Fast_Position(Image,ImageX,ImageY) ImageActive = True End Function Function Fast_Deactivate(Image.Fast_Image) PositionEntity ImageMesh,0,0,-5000 ImageActive = False End Function Function Fast_Alpha(Image.Fast_Image,Alpha#) EntityAlpha ImageMesh,Alpha# End Function Function Fast_Rotate(Image.Fast_Image,Gradient) RotateEntity ImageMesh,0,0,Gradient End Function Function Fast_Scale(Image.Fast_Image,Width,Height) ScaleEntity ImageMesh,Width,Height,1 End Function Function Fast_FreeImage(Image.Fast_Image) If ImageOwnTexture Then FreeTexture ImageTexture ImageOwnTexture = False EndIf If ImageMesh <> 0 Then FreeEntity ImageMesh EndIf End Function Function Fast_SetBuffer(Image.Fast_Image) SetBuffer TextureBuffer(ImageTexture) End Function Function Fast_Update() SetBuffer BackBuffer() End Function Function Fast_SpriteFromTexture(Sprite.Fast_Sprite,Texture.Fast_Texture,Width,Height,X,Y,Active) SpriteSprite = CreateSprite() ScaleSprite SpriteSprite,Width/2,Height/2 SpriteX = X SpriteY = Y SpriteActive = Active SpriteWidth = Width SpriteHeight = Height If Active Then ; Anzeigen : Wird vor der Kamera positioniert PositionEntity SpriteSprite,SpriteX-Fast_HalfWidth+SpriteWidth/2,-SpriteY-SpriteHeight/2+Fast_HalfHeight,Fast_HalfWidth Else ; Nicht anzeigen : Wird hinter der Kamera positioniert PositionEntity SpriteSprite,0,0,-5000 EndIf ; Textur überspannen EntityTexture SpriteSprite,TextureIndex SpriteTexture = TextureIndex SpriteOwnTexture = False EntityBlend SpriteSprite,3 End Function Function Fast_AlphaSprite(Sprite.Fast_Sprite,Alpha#) EntityAlpha SpriteSprite,Alpha# End Function Function Fast_RotateSprite(Sprite.Fast_Sprite,Gradient) RotateEntity SpriteSprite,0,0,Gradient End Function Function Fast_ScaleSprite(Sprite.Fast_Sprite,Width,Height) ScaleEntity SpriteSprite,Width,Height,1 End Function Function Fast_FreeSprite(Sprite.Fast_Sprite) FreeEntity SpriteSprite End Function Function Fast_PositionSprite(Sprite.Fast_Sprite,X,Y) PositionEntity SpriteSprite,SpriteX-Fast_HalfWidth+SpriteWidth/2,-SpriteY-SpriteHeight/2+Fast_HalfHeight,Fast_HalfWidth SpriteX = X SpriteY = Y End Function Function Fast_ActivateSprite(Sprite.Fast_Sprite) Fast_PositionSprite(Sprite,SpriteX,SpriteY) SpriteActive = True End Function Function Fast_DeactivateSprite(Sprite.Fast_Sprite) PositionEntity SpriteSprite,0,0,-5000 SpriteActive = False End Function Function Fast_SpriteMode(Sprite.Fast_Sprite,Mode) EntityBlend SpriteSprite,Mode End Function [/code:1:5039013580] Und hier noch ein kurzes Beispiel, daß nichts anderes macht als zwei Bilder zu laden und übereinander dazustellen, während das obere einen Alpha Wert von 0.4 besitzt. [code:1:5039013580] Include "FastImage.bb" Graphics3D 800,600,32,2 SetBuffer BackBuffer() AntiAlias 8 Fast_Init() Global Image1.Fast_Image = New Fast_Image Global Image2.Fast_Image = New Fast_Image Fast_ImageFromFile(Image1,"bg.png",400,300,0,0,True) Fast_ImageFromFile(Image2,"bg2.png",400,300,200,150,True) Fast_Alpha(Image2,0.4) Repeat Cls UpdateWorld RenderWorld Flip Until KeyHit(1) End [/code:1:5039013580] |
von ??? |
Hi! Finde ich super das Du das gemacht hast. Stockt etwas bei mir aber egal. Setze am besten gleich immer vorne AmbientLight 255,255,255 damit die Farben richtig dargstellt werden. Habe nämlich ein kleines Bild in Paint gemacht, mit weißer Fläche und grünen Rahmen und erst durch AmbientLight konnte man das richtig erkennen. mfg olli |
von ??? |
THX, jau das mit dem Ambient Light stimmt. Sollte ich vieleicht noch dazu schreiben. Das kann man dann auch gut zum faden benutzen, indem man einfach das licht bis auf 0 dimmt :-) |
von ??? |
Coole Sache. Hab mir überlegt es in meinem Game zu verwenden aber ich progge lieber doch alles selber. Auf jeden fall gute arbeit :) |
von ??? |
jo, es ist wirklich gut, kompliment... aber es gibt da noch ein paar sachen: 1. ich habe ein problem: [code:1:f88c2209e4] graphics3d 800,600 setbuffer backbuffer() cube=createcube() cam=createcamera() spriteCamera() /Fast_Init() global image1.fast_image = new fast_image LoadImage3D(Image1,"hud2.png",800,600,0,0,1) /Fast_Imagefrom... alphaimage3d (image1,0.8);Fast_Alpha... repeat ... flip wend end [/code:1:f88c2209e4] so, wenn ich den code da starte habe ich das geladene hud 2mal da, einmal als tatsächliches mesh, das sich nicht mit der kamera bewegt, und einmal so wie es sei sollte. keine ahnung woran das leigt, wäre aber schön wenn man das ausbessern köönte... 2. Darf ich die Namen deiner Funktionen verändern? oder auch minimale änderungen in den funktionen selbst vornehemn? 3. so habe ich zB. in der Funktion LoadImage3d()/Fast_ImageFromFile(Image.Fast_Image,TextureFile$,Width,Height,X,Y,Active, [b:f88c2209e4]masked[/b:f88c2209e4]) den Befehl masked reingebaut, um schwarze flächen nicht einzuzeichnen: [code:1:f88c2209e4] Function Fast_ImageFromFile(Image.Fast_Image,TextureFile$,Width,Height,X,Y,Active,masked) Local Texture if masked=1 then texture=LoadTexture(TextureFile$,4) else texture= LoadTexture(TextureFile$) ImageMesh = CreateMesh() Local v0,v1,v2,v3,v4,v5,s1,s2 ; Erstes Dreick s1 = CreateSurface(ImageMesh) v0 = AddVertex(s1,0,0,0,0,0,0) v1 = AddVertex(s1,1,1,0,1,-1,0) v2 = AddVertex(s1,0,1,0,0,-1,0) AddTriangle(s1,v2,v1,v0) UpdateNormals ImageMesh ; Zweites Dreick s2 = CreateSurface(ImageMesh) v3 = AddVertex(s2,0,0,0,0,0,0) v4 = AddVertex(s2,1,0,0,1,0,0) v5 = AddVertex(s2,1,1,0,1,-1,0) AddTriangle(s2,v5,v4,v3) UpdateNormals ImageMesh ; Skaliert das Bild ScaleEntity ImageMesh,Width,Height,1 ImageX = X ImageY = Y ImageActive = Active ImageWidth = Width ImageHeight = Height If Active Then ; Anzeigen : Wird vor der Kamera positioniert PositionEntity ImageMesh,ImageX-Fast_HalfWidth,-ImageY-ImageHeight+Fast_HalfHeight,Fast_HalfWidth Else ; Nicht anzeigen : Wird hinter der Kamera positioniert PositionEntity ImageMesh,0,0,-5000 EndIf ; Textur überspannen EntityTexture ImageMesh,Texture ImageTexture = Texture ImageOwnTexture = True End Function [/code:1:f88c2209e4] 4 außerdem noch en Vorschlag: wenn du die Befehlen Handle und Oject einbauen würdest, wäre alles viel übersichtlicher und bequemer zu laden etc.: bild1Fast_ImageFromFile() ___ das waren jetzt nur vorschläge, ich find das tool echt gelungen und wirklich hilfreich (tja, das haben tools so an sich :wink: ) |
von ??? |
Klar kannst du was an den Namen ändern. Es wird noch eine bessere Fassung geben sobald der Bug mit maskierten Texturen behoben worden ist. Ich mache heute wahrscheinlich noch die Version 1.3 inklusive Handle für Images und Sprites sowie geänderten Namen |