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



Suche:
(unterstützt mySQL Wildcards ala %)
Titel:
Text:
Autor: