So Jungs, ihr macht ja soviel mit dem ES in 3D.
Da ich aber selber ein 3D noob bin und lieber bei 2D bleibe hab ich mich mal aufgemacht ein ES für 2D zu machen.
Bis jetzt sind ein paar Zeichen und Kollisions sachen drin, folgen werden File, Font und Sound ES, soweit ich das umsetzen kann.
Probleme bzw. an Verständnis fehlts mir noch mit den Poly DingsBums :)
Aber schauts Euch mal an an gebt Feedback.
So, Update:
Unten werden nur noch die Includes gepostet,
hier oben Kommt dann zu dem Update/Patch eine kleines beispiel dazu.
Wennn das ganze wiklich reif ist und Intererese besteht, wird es sicher ein kleines Tutorial dazu geben.
Update Sound_ES:
Es wird nun korrekt innerhalb einer Schleife (While-Wend)
der Zustand und Chanel des Sound angezeigt.
// --------------------------------- //
// Project: entity2d
// Start: Saturday, July 12, 2008
// IDE Version: 5.322
GLOBAL s1 AS Tsound
s1 = E_LOADSOUND("1.wav")
WHILE TRUE
	MOUSESTATE mx,my,b1,b2
			s1 = E_PLAYSOUND(s1)
			
PRINT s1.chanel,10,10
			s1 = E_SOUNDPLAYING(s1)
PRINT s1.play,10,50
SHOWSCREEN
WEND
Update 200708:
Media_ES:
GLOBAL mov AS Tmedia
	mov = E_LOADMEDIA("1.WMV")
	
	E_RUNTIMEERROR(mov.media$)
E_PLAYMOVIE(mov)
KEYWAIT
			
			
			
				Lustig hatte ich mir auch schon überlegt :D  :booze:
Nice one bis jetzt!
Evtl solltest du die ID-Übergabe dynamischer gestallten, da wenn du Static hast, ja immer um eins erhöst beim nächsten :)
So könnte eine nicht benutzte/gelöschte ID wieder genutzt werden.
Ist aber auch net so wild!
Bin mal gespannt ob du es weiter machst ;)
			
			
			
				So, Functionsnamen wurden geändert ;)
Sie sind soweit wie möglich gleich wie die Originalen nur mit einem E_ davor.
OK, ich werde versuchen es nach und nach zu erweitern,
SPRITE:
// --------------------------------- //
// Project: entity2d
// Start: Tuesday, July 15, 2008
// IDE Version: 5.322
FUNCTION E_ATAN2a : l_sprite1 AS Timage,l_sprite2 AS Timage ,l_line = FALSE
			IF l_line = TRUE THEN DRAWLINE l_sprite1.x,l_sprite1.y,l_sprite2.x,l_sprite2.y,RGB(0xff, 0x00, 0x00)
		 	RETURN	MOD((ATAN(l_sprite2.y-l_sprite1.y,l_sprite2.x-l_sprite1.x)+360),360)
ENDFUNCTION
FUNCTION E_ATAN2 : l_x1,l_y1, l_x2,l_y2, l_line = FALSE
			IF l_line = TRUE THEN DRAWLINE l_x1,l_y1,l_x2,l_y2,RGB(0xff, 0x00, 0x00)
		 	RETURN	MOD((ATAN(l_y2-l_y1,l_x2-l_x1)+360),360)
ENDFUNCTION
FUNCTION E_DRAWSINCOS : l_sprite AS Timage,l_x,l_y,l_frame = 0,l_rc = 50,l_rs = 50,l_speed = 0.3,l_left_right = 0,l_angel = 359
		 //STATIC l_i
			IF l_left_right = 0
				INC l_sprite.i,l_speed
					IF l_sprite.i > l_angel THEN l_sprite.i = 0
				ELSE
				DEC l_sprite.i,l_speed
					IF l_sprite.i < 0 THEN l_sprite.i = l_angel
			ENDIF
			l_sprite.y = l_y+SIN(l_sprite.i)*l_rc
			l_sprite.x = l_x+COS(l_sprite.i)*l_rs
			
			E_DRAWSPRITE(l_sprite,l_sprite.x,l_sprite.y,l_frame)
		//	RETURN l_sprite
ENDFUNCTION
// Zeichnet das Sprite an l_x,l_y und wird auf l_sizex,l_sizey gestretcht
FUNCTION E_STRETCHSPRITE AS Timage :  l_sprite AS Timage,l_x,l_y,l_sizex,l_sizey,l_frame = 0
	IF l_sprite.load = TRUE
			l_sprite.tilex = l_sizex
			l_sprite.tiley = l_sizey
			IF l_sprite.sprt = 1
					STRETCHSPRITE l_sprite.sprite, l_x,l_y,l_sizex,l_sizey
				ELSE
					STRETCHANIM   l_sprite.sprite,l_frame, l_x,l_y,l_sizex,l_sizey
			ENDIF
	ENDIF
		RETURN l_sprite
ENDFUNCTION
	// kopiert / Grabt ein Sprite
FUNCTION E_GRABSPRITE AS Timage : l_x,l_y,l_width,l_high
			LOCAL temp AS Timage
				temp.sprite = E_SPRITEINDEX()
				temp.name$	 = "Grabsprite"
				temp.x		 = l_x
				temp.y		 = l_y
				temp.tilex   = l_width
				temp.tiley   = l_high
				temp.frame	 = 0
				temp.col	 = 0
				temp.load    = TRUE
				temp.sprt	 = 1
			GRABSPRITE temp.sprite,l_x,l_y,l_width,l_high
		RETURN temp
ENDFUNCTION
// Speichert das sprite als Datei
FUNCTION E_SAVESPRITE : l_path$ ,l_sprite AS Timage
 			SAVESPRITE l_path$,l_sprite.sprite
ENDFUNCTION
// Sprite Drehen
FUNCTION E_ROTOSPRITE : l_sprite AS Timage,l_x,l_y,l_angle
			IF l_sprite.load = TRUE
							ROTOSPRITE l_sprite.sprite,l_x,l_y,l_angle
			ENDIF
ENDFUNCTION
// Sprite Zoomen und Drehen, Sprite wird als Single oder Animate erkannt
FUNCTION E_ROTOZOOMSPRITE : l_sprite AS Timage,l_x,l_y,l_angle,l_frame = 0,l_scale = 1
	IF l_sprite.load = TRUE
			IF l_frame > l_sprite.frame THEN l_frame = 0
			IF l_sprite.sprt = 1
					ROTOZOOMSPRITE l_sprite.sprite, l_x,l_y,l_angle, l_scale
				ELSE
					ROTOZOOMANIM l_sprite.sprite,l_frame, l_x,l_y,l_angle, l_scale
			ENDIF
	ENDIF
ENDFUNCTION
// Naja, hier bin ich noch nicht ganz schlau geworden
//FUNCTION E_DRAWPOLY : l_sprite AS Timage ,l_frame = 0
//
// l_sprite.load = TRUE
// IF l_frame > l_sprite.frame THEN l_frame = 0
//  STARTPOLY 	l_sprite.sprite // Bitmap = Nr.0
// //obenlinks	x,	y,
//
// SATIC a,b,c,d
// 				 KEY(30) AND KEY(205) THEN INC a,0.5
// 				 KEY(30) AND KEY(203) THEN DEC a,0.5
//  				 KEY(48) AND KEY(205) THEN INC b,0.5
// 				 KEY(48) AND KEY(203) THEN DEC b,0.5
// 				 KEY(46) AND KEY(205) THEN INC c,0.5
// 				 KEY(46) AND KEY(203) THEN DEC c,0.5
// 				 KEY(32) AND KEY(205) THEN INC d,0.5
// 				 KEY(32) AND KEY(203) THEN DEC d,0.5
//  LYVECTOR  a,   b,  32,  32, RGB(0xff, 0x10, 0x80)
//  LYVECTOR   a, b+32,  32, 32, RGB(0xff, 0x10, 0x80)
//  LYVECTOR 32+a, b+32, 32, 32, RGB(0xff, 0x10, 0x80)
//  LYVECTOR 32+a,  b, 32,  32, RGB(0xff, 0x10, 0x80)
// ENDPOLY
//
// ENDIF
//ENDFUNCTION
//
// Es kann im Image intern die RGB farben abgespeichert werden / test??
FUNCTION E_SETSPRITTANS AS Timage :l_sprite AS Timage, l_r,l_g,l_b
 				l_sprite.r = l_r
 				l_sprite.g = l_g
 				l_sprite.b = l_b
 		RETURN l_sprite
ENDFUNCTION
// Erstellt einen Kreis als ring, mit l_new als False könnte es realtime genutzt werden->Test
FUNCTION E_CREATEOVALLINE AS Timage :  l_sizex,l_sizey, l_rgb = 0xffffff, l_new = TRUE
	STATIC s_index
	STATIC s_ctrl
	LOCAL l_x,l_y
	LOCAL l_i
			IF l_new = FALSE AND s_ctrl = 0
				s_index = E_SPRITEINDEX()
				s_ctrl = 1
			ENDIF
			IF l_new = TRUE
				s_ctrl = 0
				s_index = E_SPRITEINDEX()
			ENDIF
				l_sizex = l_sizex/2
				l_sizey = l_sizey/2
		LOCAL l_sprite AS Timage
				l_sprite.name$ = "E_DRAWOVALLINE"
				l_sprite.tilex = l_sizex
				l_sprite.tiley = l_sizey
				l_sprite.sprite = s_index
				l_sprite.frame = 0
				l_sprite.sprt = 1
				l_sprite.load = TRUE
			DRAWRECT l_x,l_y   ,l_sizex*2   ,l_sizey*2 +l_sizey   ,  RGB(0xff, 0x00, 0x80)
		FOR l_i = 0 TO 359
			//SETPIXEL l_x+l_sizex+SIN(l_i)*l_sizex , l_y+COS(l_i)*l_sizey  ,l_rgb
			SETPIXEL l_x+l_sizex+SIN(l_i)*(l_sizex-1) , l_y+COS(l_i)*(l_sizey-1)+l_sizey  ,l_rgb
		NEXT
						GRABSPRITE l_sprite.sprite,l_x , l_y,  l_sizex*2   ,l_sizey*2+l_sizey
						BLACKSCREEN
			RETURN l_sprite
ENDFUNCTION
// Erstellt einen Voll Kreis/oval , mit l_new als False könnte es realtime genutzt werden->Test
FUNCTION E_CREATEOVAL AS Timage : l_sizex,l_sizey, l_rgb = 0xffffff, l_new = TRUE
	STATIC s_index
	STATIC s_ctrl
	LOCAL l_x,l_y
	LOCAL l_i
			IF l_new = FALSE AND s_ctrl = 0
				s_index = E_SPRITEINDEX()
				s_ctrl = 1
			ENDIF
			IF l_new = TRUE
				s_ctrl = 0
				s_index = E_SPRITEINDEX()
			ENDIF
				l_sizex = l_sizex/2
				l_sizey = l_sizey/2
		LOCAL l_sprite AS Timage
				l_sprite.name$ = "E_DRAWOVAL"
				l_sprite.tilex = l_sizex
				l_sprite.tiley = l_sizey
				l_sprite.sprite = s_index
				l_sprite.frame = 0
				l_sprite.sprt = 1
				l_sprite.load = TRUE
			DRAWRECT l_x,l_y   ,l_sizex*2   ,l_sizey*2 +l_sizey   ,  RGB(0xff, 0x00, 0x80)
		FOR l_i = 0 TO 359
			//SETPIXEL l_x+l_sizex+SIN(l_i)*l_sizex , l_y+COS(l_i)*l_sizey  ,l_rgb
			DRAWLINE   l_x , l_y+l_sizey   , l_x+SIN(l_i)*(l_sizex-1)+l_sizex , l_y+COS(l_i)*(l_sizey-1)+l_sizey  ,l_rgb
		NEXT
						GRABSPRITE l_sprite.sprite,l_x , l_y,  l_sizex*2   ,l_sizey*2+l_sizey
						BLACKSCREEN
			RETURN l_sprite
ENDFUNCTION
// Erstellt eine Box als linie, mit l_new als False könnte es realtime genutzt werden->Test
FUNCTION E_CREATERECTLINE   AS Timage:  l_sizex,l_sizey, l_rgb = 0xffffff, l_new = TRUE
	STATIC s_index
	STATIC s_ctrl
	LOCAL l_x,l_y
			IF l_new = FALSE AND s_ctrl = 0
				s_index = E_SPRITEINDEX()
				s_ctrl = 1
			ENDIF
			IF l_new = TRUE
				s_ctrl = 0
				s_index = E_SPRITEINDEX()
			ENDIF
		LOCAL l_sprite AS Timage
				l_sprite.name$ = "E_DRAWRECTLINE"
				l_sprite.tilex = l_sizex
				l_sprite.tiley = l_sizey
				l_sprite.sprite = s_index
				l_sprite.frame = 0
				l_sprite.sprt = 1
				l_sprite.load = TRUE
				DRAWRECT l_x,l_y,l_sizex,l_sizey,l_rgb
				DRAWRECT l_x+1,l_y+1,l_sizex-2,l_sizey-2,RGB(l_sprite.r, l_sprite.g, l_sprite.b)
				GRABSPRITE l_sprite.sprite,l_x,l_y,l_sizex,l_sizey
				BLACKSCREEN
		RETURN  l_sprite
ENDFUNCTION
// Erstellt eine Box als ring, mit l_new als False könnte es realtime genutzt werden->Test
FUNCTION E_CREATERECT  AS Timage:  l_sizex,l_sizey, l_rgb = 0xffffff, l_new = TRUE
	STATIC s_index
	STATIC s_ctrl
		LOCAL l_x,l_y
			IF l_new = FALSE AND s_ctrl = 0
				s_index = E_SPRITEINDEX()
				s_ctrl = 1
			ENDIF
			IF l_new = TRUE
				s_ctrl = 0
				s_index = E_SPRITEINDEX()
			ENDIF
		LOCAL l_sprite AS Timage
				l_sprite.name$ = "E_DRAWRECT"
				l_sprite.tilex = l_sizex
				l_sprite.tiley = l_sizey
				l_sprite.sprite = s_index
				l_sprite.frame = 0
				l_sprite.sprt = 1
				l_sprite.load = TRUE
			//	l_sprite.x = l_x
			//	l_sprite.y = l_y
				DRAWRECT l_x,l_y,l_sizex,l_sizey,l_rgb
				GRABSPRITE l_sprite.sprite,l_x,l_y,l_sizex,l_sizey
				BLACKSCREEN
		RETURN  l_sprite
ENDFUNCTION
// Spritecoillision für Single oder Animate Sprite
FUNCTION E_SPRCOLL : l_sprite1 AS Timage , l_x1, l_y1,l_frame1,l_sprite2 AS Timage ,l_x2,l_y2,l_frame2
	LOCAL l_out
			IF l_frame1 > l_sprite1.frame THEN l_frame1 = 0
			IF l_frame2 > l_sprite2.frame THEN l_frame2 = 0
			IF l_sprite1.load = TRUE AND l_sprite2.load = TRUE
					IF l_sprite1.sprt = 0 OR l_sprite2.sprt = 0
						l_out = ANIMCOLL(l_sprite1.sprite,l_frame1,l_x1,l_y1,l_sprite2.sprite,l_frame2,l_x2,l_y2)
						ELSE
						l_out = SPRCOLL(l_sprite1.sprite,l_x1,l_y1,l_sprite2.sprite,l_x2,l_y2)
					ENDIF
			ENDIF
			RETURN l_out
ENDFUNCTION
//---------------------------------------------------------------------
// Gibt die X grösse zurück
FUNCTION E_GETSPRITESIZEX :  l_sprite AS Timage
				GETSPRITESIZE l_sprite.sprite,l_sprite.tilex,l_sprite.tiley
			RETURN l_sprite.tilex
ENDFUNCTION
// Gibt die Y grösse zurück
FUNCTION E_GETSPRITESIZEY :   l_sprite AS Timage
				GETSPRITESIZE l_sprite.sprite,l_sprite.tilex,l_sprite.tiley
			RETURN l_sprite.tiley
ENDFUNCTION
// Ladet ein Single sprite
FUNCTION E_LOADSPRITE AS Timage :  l_path$
				E_RUNTIMEERROR(l_path$)
	LOCAL l_sprite AS Timage
					l_sprite.sprite = E_SPRITEINDEX()
					LOADSPRITE l_path$,l_sprite.sprite
					GETSPRITESIZE l_sprite.sprite,l_sprite.tilex,l_sprite.tiley
					l_sprite.load = TRUE
					l_sprite.frame = 0
					l_sprite.name$ = l_path$
					l_sprite.sprt = 1
		RETURN l_sprite
ENDFUNCTION
//--------------------------------loadanimimage---------------------------
//  file Path, tile width, tile high
// Ladet ein Tileset
FUNCTION E_LOADANIM AS Timage  : l_path$,l_tilex,l_tiley
				E_RUNTIMEERROR(l_path$)
        //-------------
    LOCAL l_x,l_y  				// zum berechnen der Tile anzahl aus der Image grösse
    LOCAL  l_xcount,l_ycount 	// Counter für die Positions verschiebung
    LOCAL imagetemp 			// für die aufnahme des Tilsets
    LOCAL image AS Timage 		//für die aufnahme der Tiles
    image.tilex = l_tilex
    image.tiley = l_tiley
    image.sprite = E_SPRITEINDEX()
    image.frame = l_frame
    image.name$ = l_path$
    image.sprt = 0
    image.load = TRUE
					LOADANIM l_path$,image.sprite,l_tilex,l_tiley
					GETSPRITESIZE image.sprite,l_x,l_y
					image.frame = INTEGER(l_x/l_tilex)*INTEGER(l_y/l_tiley)-1
                RETURN image
ENDFUNCTION
// Gibt den Speicher wieder frei, bei l_all = 1 werden alle benutzten Indexzahlen frei gegeben
// nur zum Testen
FUNCTION E_FREESPRITE : l_mem AS Timage,l_all = 0,l_indexstart = 1000
LOCAL l_temp,l_i
	IF l_all = 0
					l_mem.name$ = ""
					l_mem.x = 0
					l_mem.y = 0
					l_mem.tilex = 0
					l_mem.tiley = 0
					l_mem.frame = 0
					l_mem.col = 0
					l_mem.load = FALSE
					l_mem.sprt = 0
					LOADSPRITE "",l_mem.sprite
		ELSE
					l_temp = E_SPRITEINDEX(FALSE)-1
				FOR l_i = l_indexstart TO l_temp
						LOADSPRITE "",l_i
				NEXT
	ENDIF
ENDFUNCTION
// Zeichnet ein Single oder Animate Sprite mit einem Alphawert
FUNCTION E_DRAWSPRITEALPHA AS Timage : l_sprite AS Timage,l_posx,l_posy,l_frame = 0,l_alpha = 0
	IF l_sprite.load = TRUE
		IF l_frame > l_sprite.frame THEN l_frame = 0
			IF l_frame > l_sprite.frame  // Frame out of range ? Then dummy gfx
					l_frame = 0
					DRAWRECT l_posx,l_posy,l_sprite.tilex,l_sprite.tiley,RGB(RND(255),50,50)
						ELSE
					ALPHAMODE l_alpha
			IF l_sprite.sprt = 0
							DRAWANIM l_sprite.sprite,l_frame,l_posx,l_posy
						ELSE
							DRAWSPRITE l_sprite.sprite,l_posx,l_posy
			ENDIF
					ALPHAMODE  0
			ENDIF
	ENDIF
			RETURN l_sprite
ENDFUNCTION
// Zeichnet ein Single oder Animate Sprite
FUNCTION E_DRAWSPRITE AS Timage : l_sprite AS Timage,l_posx,l_posy,l_frame = 0
		IF l_sprite.load = TRUE
		IF l_frame > l_sprite.frame THEN l_frame = 0
					IF l_sprite.sprt = 0
							DRAWANIM  l_sprite.sprite,l_frame,l_posx,l_posy
						ELSE
							DRAWSPRITE l_sprite.sprite,l_posx,l_posy
					ENDIF
		ENDIF
			RETURN l_sprite
ENDFUNCTION
//VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
// Index Nr 0 to **
// Param True = inc index
// Param False = next Free index
FUNCTION E_SPRITEINDEX : l_in = TRUE, l_startindex = 1000
 STATIC s_index
 IF l_in = TRUE
 		INC s_index,1
		RETURN s_index -1 + l_startindex
	ELSE
		RETURN s_index +l_startindex
 ENDIF
ENDFUNCTION
TYPE Tsprite
x
ENDTYPE
TYPE  Timage
	name$	 	//Filename
	x			//Position X
	y			//Position Y
	tilex		//Tile width
	tiley		//Tile high
	sprite		//Sprite index
	frame		// Maximal Animation 0 -> ?
	col			// Collision True | False
	load        // True Or false for Freeimage()
	sprt		//sprite Type | 0 = loadanimimage | 1 = loadimage
	r	= 255	// RGB color
	g	= 0
	b	= 128
	i			//forschleife
ENDTYPE
SOUND:
FUNCTION E_LOADSOUND  AS Tsound: l_path$, l_buffer = 1
//LOADSOUND datei$, num, buffer
LOCAL l_sound AS Tsound
			//	E_RUNTIMEERROR(l_path$)
			l_sound.sound = E_SOUNDINDEX()
			l_sound.buffer = l_buffer
			l_sound.name$ = l_path$
			l_sound.load = TRUE
			LOADSOUND l_path$,l_sound.sound,l_buffer
					RETURN l_sound
ENDFUNCTION
FUNCTION E_PLAYSOUND  AS Tsound : l_sound AS Tsound,l_pan = 0.0 ,l_vol = 1.0
		l_sound.vol = l_vol
		l_sound.pan = l_pan
			IF l_sound.play = 0 THEN l_sound.chanel = PLAYSOUND( l_sound.sound,l_pan,l_vol)
		RETURN  l_sound
ENDFUNCTION
FUNCTION E_SOUNDPLAYING AS Tsound  : l_sound AS Tsound
	
			l_sound.play = SOUNDPLAYING(l_sound.chanel)
		RETURN  l_sound
ENDFUNCTION
// Gibt den Speicher wieder frei, bei l_all = 1 werden alle benutzten Indexzahlen frei gegeben
// nur zum Testen
FUNCTION E_FREESOUND :  l_mem AS Tsound, l_all = 0, l_indexstart = 0
LOCAL l_temp,l_i
	IF l_all = 0
					l_mem.name$ = ""
					l_mem.vol = 0
					l_mem.pan = 0
					l_mem.chanel = 0
					l_mem.sctrl = 0
					l_mem.load = FALSE
					l_mem.buffer = 0
					LOADSOUND  "",l_mem.sound,1
		ELSE
					l_temp = E_SOUNDINDEX(FALSE)-1
				FOR l_i = l_indexstart TO l_temp
						LOADSOUND  "",l_i,1
				NEXT
	ENDIF
ENDFUNCTION
//vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
FUNCTION E_SOUNDINDEX : l_in = TRUE, l_startindex = 10
 STATIC s_index
 IF s_index > 126 THEN s_index = 0
 IF l_in = TRUE
 		INC s_index,1
		RETURN s_index -1 + l_startindex
	ELSE
		RETURN s_index +l_startindex
 ENDIF
ENDFUNCTION
TYPE Tsound
x			//---
y	 		//---
chanel		//
play		// On | Off
playcount	//counter
vol			//volume
pan			//Balance
name$		//Filename
sound		//Soundindex
buffer 		//soundbuffer
sctrl		// True False
load
ENDTYPE
FILE:
FUNCTION E_OPENFILE AS Tfile : l_string$,l_mode = TRUE
			LOCAL l_file AS Tfile
			l_file.file = E_FILEINDEX()
			l_file.name$ = l_string$
	l_file.load  = OPENFILE(l_file.file,l_string$,l_mode)
		RETURN l_file
ENDFUNCTION
FUNCTION E_CLOSEFILE : l_file AS  Tfile
		CLOSEFILE l_file.file
ENDFUNCTION
FUNCTION E_FILEREQUEST AS Tfile:l_mode = TRUE , l_ext1a$ = "Text",l_ext1b$ ="*.txt",l_ext2a$ = "All",l_ext2b$ ="*.*"
		LOCAL l_file AS Tfile
		LOCAL l_string$ =  l_ext1a$+ CHR$(124)+l_ext1b$+ CHR$(124)+l_ext2a$+CHR$(124)+l_ext2b$
		l_file.name$ = FILEREQUEST$(l_mode,l_string$)
		RETURN l_file
ENDFUNCTION
FUNCTION E_FILEINDEX : l_in = TRUE, l_startindex = 3
 STATIC s_index
 IF l_in = TRUE
 		INC s_index,1
		RETURN s_index -1 + l_startindex
	ELSE
		RETURN s_index +l_startindex
 ENDIF
ENDFUNCTION
TYPE Tfile
name$		//
file		//index
load		//
ENDTYPE
ERROR:
FUNCTION E_RUNTIMEERROR : l_path$
		LOCAL l_ok
				l_ok = DOESFILEEXIST(l_path$)
				IF l_ok = FALSE
						BLACKSCREEN
						PRINT "Sorry, file "+l_path$+" not fount",10,100
						PRINT "Press any key to end",10,150
						SHOWSCREEN
						KEYWAIT
						END
				ENDIF
		RETURN l_ok
ENDFUNCTION
Media_ES:
// --------------------------------- //
// Project: entity2d
// Start: Saturday, July 19, 2008
// IDE Version: 5.322
// Media_ES ist nicht wirklich notwendig da hier keine Indexwerte gebraucht
// werden, es aber alles schlüssiger ist als gesammtes ES.
FUNCTION E_LOADMEDIA AS Tmedia: l_path$
		LOCAL l_media AS Tmedia
		l_media.media$ = l_path$
		RETURN l_media
ENDFUNCTION
FUNCTION E_LOOPMOVIE: l_media AS Tmedia
			LOOPMOVIE l_media.media$
ENDFUNCTION
FUNCTION E_PLAYMOVIE : l_media AS Tmedia
			PLAYMOVIE l_media.media$
ENDFUNCTION
FUNCTION E_PLAYMUSIC:l_media AS Tmedia
			PLAYMUSIC l_media.media$
ENDFUNCTION
TYPE Tmedia
media$
ENDTYPE
			
			
			
				Ich find das ja schonmal klasse von dir, irgendwie kristallisiert sich da wohl irgendwann eine zweite Befehlsschicht als Alternative heraus.....
			
			
			
				Update Sprite:220708
E_ATAN2()  Gibt den winkel der angegebenen Kordinaten zurück
E_ATAN2a() Gibt den winkel der angegebenen Entity zurück
*.x und *.x werden nicht mehr als Rückgabe zurückgegeben, da das ganze eh global abläuft.
E_Drawsincos() lässt ein objekt im kreis drehen, die Paramater sind:
Objekt ,position x un y ,frame,radius für Cos() ,Radius für sin(),Bewegungsgeschwindigkeit,Drehrichtung,Drehwinkel
Hier ein kleines  beispiel :
GLOBAL s1 AS Timage
GLOBAL s2 AS Timage
s1 = E_CREATERECT(32,32)
s2 = E_CREATERECTLINE(32,32)
GLOBAL mouse AS Timage 
mouse = E_CREATEOVAL(6,6,RGB(0xff, 0xff, 0x00))
GLOBAL mymove = 0
WHILE TRUE
	MOUSESTATE mx,my,b1,b2
	MouseHitUpdate(b1,b2)
		IF MouseHit(1) = 1 THEN mymove = bNOT(mymove)
	PRINT "E_ATAN2 : "+E_ATAN2(mx,my,s1.x,s1.y,TRUE ),290,10
	PRINT "E_ATAN2a : "+E_ATAN2a(s2,s1,TRUE ),10,10
	
	E_ATAN2(mx,my,s2.x,s2.y,TRUE) 
	PRINT s1.x,10,40
	PRINT s1.y,10,70
	E_DRAWSINCOS(s1,150,150,0,5,50,0.1,mymove)
	E_DRAWSINCOS(s2,mx,my,0,100)
	E_DRAWSPRITE(mouse,mx,my)
	PRINT "Collision : "+E_SPRCOLL(s1,s1.x,s1.y,0,s2,s2.x,s2.y,0),10,100
 SHOWSCREEN
WEND
			
			
			
				Ich hab das TImage internv versteckt, so dass man einen "Handle" bekommen hat. Intern habe ich halt ein Array von TImage gemacht und den Index als "Handle" zurückgegeben.
Das hat den Vorteil, dass man mit T_move usw.. ein Entity schieben kann, und mit T_drawall() alle zeichnen kann.
Sonst ist's ja wirklich nur ein Wrapper über DRAWSPRITE.
Sollte man nich evtl. den 2D und 3D Kram zusammenbringen? Ich mein: So könnte man gemeinsam genutzte Funktionen verwenden. Meine EntityLoadTexture z.B. macht das.
...nur so eine Idee...
			
			
			
				ich hoffe es ist nicht vermessen, wenn ich da jetzt mal ein großes "JA" verlauten lasse.
			
			
			
				 :nw: :good:
Ja Du hast Recht, es ähnelt mehr einen Wrapper, es ist halt mein Versuch/Beitrag dazu :)
Jede Hilfe und verbesserung ist gerne gesehen :)
Das heist, natürlich muss auch der rest der Comunity Interres daran haben, nur wegen zwei "Hansel" so etwas aufzubauen ist auch nicht das ware.
			
			
			
				Ich glaube es macht schon Sinn das ES um 2D zu erweitern.
Evtl. kann man Sprites in 2D und 3D umschalten, also X_SPRITE als auch DRAWSPRITE reinwerfen.
			
			
			
				ja das wäre super, würde nämlich gern ein paar Effekte umsetzen, die aber auf sprites basieren, das geht ja im moment glaub ich nicht mit dem ES, bzw. in einem damit generierten code.
Gernot, hast du nochmal beim ES Thread geschaut, ob du da noch was machst?
 Und schau mal nach dem code, die bodenkollision gefällt mir noch nicht so wirklich, etwas schwammig im moment, weil ich ja den sprung da auch drin habe.
			
			
			
				Schwammig?
Die Kollision gibt dir auch nur ein True oder False wieder... der Rest ist dein Bier. Sprich codefehler/denkfehler...
			
			
			
				das ist mir schon klar, deswegen steht ja in meinem text oben, "...etwas schwammig im moment, weil ich ja den sprung da auch drin habe."
mir ist das schon klar, kannst dir das ja mal anschauen, bin für verbesserungsvorschläge immer offen.
bau grad an meinem ersten demo level die items ein, stell ich dann ein bei beta test oder so.
ich muss aber noch startbildschirm menü usw. einbauen, aber vorallem noch die grafiken dazu basteln.
achja, erstmal ohne animation, es sei denn ich setz mich in und mach tatsächlich sämtliche keyframes einzeln, is aber sooooo viel unnötige arbeit.sch...ddd
			
			
			
				@Heiko
Also bei mir geht die Kollision einwandfrei. Meine Figur läuft Hügel rauf und runter und das weder holprig, schwammig oder sonst was. Vielleicht liegt's daran, dass ich (immer noch) nicht das ES benutz. ;)
Quote from: Heiko 
aber vorallem noch die grafiken dazu basteln
LOL. Und genau das ist ja die eigentliche Arbeit. Den Programmcode in GLBasic zu schreiben ist ja das kleinste Übel. Ist ja nicht so wie wenn du es in z.B. in VC++ 6 schreiben müßtest.  :booze: Auf jeden Fall wenn du was hast dann her damit. :)
Cheers
			
 
			
			
				schau einfach beim ES thread nach.....
			
			
			
				This one looks interesting, how finished is it? Is there any zip-file to download?
			
			
			
				Quote from: Moru on 2008-Aug-23
This one looks interesting, how finished is it? Is there any zip-file to download?
Hi Moru, its no zip download, only the Codepasting.
I have in moment short time!? 
But i think you can use the SPRITE CODE and ERROR CODE.
Puhh, man bin ich gut im English :puke:
			 
			
			
				Thanks, I will try to use the sprite code then, that's exactly what I needed anyway :-)
			
			
			
				Noseying about this old thread, lots missing  ;/, anyone have a link to another version?
			
			
			
				I don't know if this is the sourcecode but it is saved around that time:
// --------------------------------- //
// Project: entity2d
// Start: Tuesday, July 15, 2008
// IDE Version: 5.322
FUNCTION E_ATAN2a : l_sprite1 AS Timage,l_sprite2 AS Timage ,l_line = FALSE
	IF l_line = TRUE THEN DRAWLINE l_sprite1.x,l_sprite1.y,l_sprite2.x,l_sprite2.y,RGB(0xff, 0x00, 0x00)
	RETURN	MOD((ATAN(l_sprite2.y-l_sprite1.y,l_sprite2.x-l_sprite1.x)+360),360)
ENDFUNCTION
FUNCTION E_ATAN2 : l_x1,l_y1, l_x2,l_y2, l_line = FALSE
	IF l_line = TRUE THEN DRAWLINE l_x1,l_y1,l_x2,l_y2,RGB(0xff, 0x00, 0x00)
	RETURN	MOD((ATAN(l_y2-l_y1,l_x2-l_x1)+360),360)
ENDFUNCTION
FUNCTION E_DRAWSINCOS : l_sprite AS Timage,l_x,l_y,l_frame = 0,l_rc = 50,l_rs = 50,l_speed = 0.3,l_left_right = 0,l_angel = 359
	//STATIC l_i
	IF l_left_right = 0
		INC l_sprite.i,l_speed
		IF l_sprite.i > l_angel THEN l_sprite.i = 0
		ELSE
			DEC l_sprite.i,l_speed
		IF l_sprite.i < 0 THEN l_sprite.i = l_angel
	ENDIF
	l_sprite.y = l_y+SIN(l_sprite.i)*l_rc
	l_sprite.x = l_x+COS(l_sprite.i)*l_rs
	E_DRAWSPRITE(l_sprite,l_sprite.x,l_sprite.y,l_frame)
//	RETURN l_sprite
ENDFUNCTION
// Zeichnet das Sprite an l_x,l_y und wird auf l_sizex,l_sizey gestretcht
//draws the sprite at 1_x,1_y and is streched to 1_sizex,1_sizey
FUNCTION E_STRETCHSPRITE AS Timage :  l_sprite AS Timage,l_x,l_y,l_sizex,l_sizey,l_frame = 0
	IF l_sprite.load = TRUE
		l_sprite.tilex = l_sizex
		l_sprite.tiley = l_sizey
		IF l_sprite.sprt = 1
			STRETCHSPRITE l_sprite.sprite, l_x,l_y,l_sizex,l_sizey
		ELSE
			STRETCHANIM   l_sprite.sprite,l_frame, l_x,l_y,l_sizex,l_sizey
		ENDIF
	ENDIF
	RETURN l_sprite
ENDFUNCTION
	// kopiert / Grabt ein Sprite
	//copies / grabs a sprite
FUNCTION E_GRABSPRITE AS Timage : l_x,l_y,l_width,l_high
	LOCAL temp AS Timage
	temp.sprite = E_SPRITEINDEX()
	temp.name$	 = "Grabsprite"
	temp.x		 = l_x
	temp.y		 = l_y
	temp.tilex   = l_width
	temp.tiley   = l_high
	temp.frame	 = 0
	temp.col	 = 0
	temp.load    = TRUE
	temp.sprt	 = 1
	GRABSPRITE temp.sprite,l_x,l_y,l_width,l_high
	RETURN temp
ENDFUNCTION
// Speichert das sprite als Datei
// saves the sprite as file
FUNCTION E_SAVESPRITE : l_path$ ,l_sprite AS Timage
	SAVESPRITE l_path$,l_sprite.sprite
ENDFUNCTION
// Sprite Drehen
//rotate the sprite
FUNCTION E_ROTOSPRITE : l_sprite AS Timage,l_x,l_y,l_angle
	IF l_sprite.load = TRUE
		ROTOSPRITE l_sprite.sprite,l_x,l_y,l_angle
	ENDIF
ENDFUNCTION
// Sprite Zoomen und Drehen, Sprite wird als Single oder Animate erkannt
// zoom and rotate the sprite, sprite is recognized as single or animate
FUNCTION E_ROTOZOOMSPRITE : l_sprite AS Timage,l_x,l_y,l_angle,l_frame = 0,l_scale = 1
	IF l_sprite.load = TRUE
	IF l_frame > l_sprite.frame THEN l_frame = 0
	IF l_sprite.sprt = 1
		ROTOZOOMSPRITE l_sprite.sprite, l_x,l_y,l_angle, l_scale
	ELSE
		ROTOZOOMANIM l_sprite.sprite,l_frame, l_x,l_y,l_angle, l_scale
	ENDIF
	ENDIF
ENDFUNCTION
// Naja, hier bin ich noch nicht ganz schlau geworden		//nya i didn't fully understood this part
//FUNCTION E_DRAWPOLY : l_sprite AS Timage ,l_frame = 0
//
// l_sprite.load = TRUE
// IF l_frame > l_sprite.frame THEN l_frame = 0
//  STARTPOLY 	l_sprite.sprite // Bitmap = Nr.0
// //obenlinks	x,	y,										//upper left
//
// SATIC a,b,c,d
// 				 KEY(30) AND KEY(205) THEN INC a,0.5
// 				 KEY(30) AND KEY(203) THEN DEC a,0.5
//  				 KEY(48) AND KEY(205) THEN INC b,0.5
// 				 KEY(48) AND KEY(203) THEN DEC b,0.5
// 				 KEY(46) AND KEY(205) THEN INC c,0.5
// 				 KEY(46) AND KEY(203) THEN DEC c,0.5
// 				 KEY(32) AND KEY(205) THEN INC d,0.5
// 				 KEY(32) AND KEY(203) THEN DEC d,0.5
//  LYVECTOR  a,   b,  32,  32, RGB(0xff, 0x10, 0x80)
//  LYVECTOR   a, b+32,  32, 32, RGB(0xff, 0x10, 0x80)
//  LYVECTOR 32+a, b+32, 32, 32, RGB(0xff, 0x10, 0x80)
//  LYVECTOR 32+a,  b, 32,  32, RGB(0xff, 0x10, 0x80)
// ENDPOLY
//
// ENDIF
//ENDFUNCTION
//
// Es kann im Image intern die RGB farben abgespeichert werden / test??
// it can in the image internal save the RGB colors / test ??
FUNCTION E_SETSPRITTANS AS Timage :l_sprite AS Timage, l_r,l_g,l_b
	l_sprite.r = l_r
	l_sprite.g = l_g
	l_sprite.b = l_b
	RETURN l_sprite
ENDFUNCTION
// Erstellt einen Kreis als ring, mit l_new als False könnte es realtime genutzt werden->Test
// creates a circle as ring, with 1_new as false it could be used realtime -> test
FUNCTION E_CREATEOVALLINE AS Timage :  l_sizex,l_sizey, l_rgb = 0xffffff, l_new = TRUE
	STATIC s_index
	STATIC s_ctrl
	LOCAL l_x,l_y
	LOCAL l_i
	IF l_new = FALSE AND s_ctrl = 0
	s_index = E_SPRITEINDEX()
	s_ctrl = 1
	ENDIF
	IF l_new = TRUE
	s_ctrl = 0
	s_index = E_SPRITEINDEX()
	ENDIF
	l_sizex = l_sizex/2
	l_sizey = l_sizey/2
	LOCAL l_sprite AS Timage
	l_sprite.name$ = "E_DRAWOVALLINE"
	l_sprite.tilex = l_sizex
	l_sprite.tiley = l_sizey
	l_sprite.sprite = s_index
	l_sprite.frame = 0
	l_sprite.sprt = 1
	l_sprite.load = TRUE
	DRAWRECT l_x,l_y   ,l_sizex*2   ,l_sizey*2 +l_sizey   ,  RGB(0xff, 0x00, 0x80)
	FOR l_i = 0 TO 359
		//SETPIXEL l_x+l_sizex+SIN(l_i)*l_sizex , l_y+COS(l_i)*l_sizey  ,l_rgb
		SETPIXEL l_x+l_sizex+SIN(l_i)*(l_sizex-1) , l_y+COS(l_i)*(l_sizey-1)+l_sizey  ,l_rgb
	NEXT
	GRABSPRITE l_sprite.sprite,l_x , l_y,  l_sizex*2   ,l_sizey*2+l_sizey
	BLACKSCREEN
	RETURN l_sprite
ENDFUNCTION
// Erstellt einen Voll Kreis/oval , mit l_new als False könnte es realtime genutzt werden->Test
// creates a full circle/oval, with 1_new as false it could be used realtime -> test
FUNCTION E_CREATEOVAL AS Timage : l_sizex,l_sizey, l_rgb = 0xffffff, l_new = TRUE
	STATIC s_index
	STATIC s_ctrl
	LOCAL l_x,l_y
	LOCAL l_i
	IF l_new = FALSE AND s_ctrl = 0
		s_index = E_SPRITEINDEX()
		s_ctrl = 1
	ENDIF
	IF l_new = TRUE
		s_ctrl = 0
		s_index = E_SPRITEINDEX()
	ENDIF
	l_sizex = l_sizex/2
	l_sizey = l_sizey/2
	LOCAL l_sprite AS Timage
	l_sprite.name$ = "E_DRAWOVAL"
	l_sprite.tilex = l_sizex
	l_sprite.tiley = l_sizey
	l_sprite.sprite = s_index
	l_sprite.frame = 0
	l_sprite.sprt = 1
	l_sprite.load = TRUE
	DRAWRECT l_x,l_y   ,l_sizex*2   ,l_sizey*2 +l_sizey   ,  RGB(0xff, 0x00, 0x80)
	FOR l_i = 0 TO 359
		//SETPIXEL l_x+l_sizex+SIN(l_i)*l_sizex , l_y+COS(l_i)*l_sizey  ,l_rgb
		DRAWLINE   l_x , l_y+l_sizey   , l_x+SIN(l_i)*(l_sizex-1)+l_sizex , l_y+COS(l_i)*(l_sizey-1)+l_sizey  ,l_rgb
	NEXT
	GRABSPRITE l_sprite.sprite,l_x , l_y,  l_sizex*2   ,l_sizey*2+l_sizey
	BLACKSCREEN
	RETURN l_sprite
ENDFUNCTION
// Erstellt eine Box als linie, mit l_new als False könnte es realtime genutzt werden->Test
//creates a box as line, with 1_new as false it could be used  realtime -> test
FUNCTION E_CREATERECTLINE   AS Timage:  l_sizex,l_sizey, l_rgb = 0xffffff, l_new = TRUE
	STATIC s_index
	STATIC s_ctrl
	LOCAL l_x,l_y
	IF l_new = FALSE AND s_ctrl = 0
		s_index = E_SPRITEINDEX()
		s_ctrl = 1
	ENDIF
	IF l_new = TRUE
		s_ctrl = 0
		s_index = E_SPRITEINDEX()
	ENDIF
	LOCAL l_sprite AS Timage
	l_sprite.name$ = "E_DRAWRECTLINE"
	l_sprite.tilex = l_sizex
	l_sprite.tiley = l_sizey
	l_sprite.sprite = s_index
	l_sprite.frame = 0
	l_sprite.sprt = 1
	l_sprite.load = TRUE
	DRAWRECT l_x,l_y,l_sizex,l_sizey,l_rgb
	DRAWRECT l_x+1,l_y+1,l_sizex-2,l_sizey-2,RGB(l_sprite.r, l_sprite.g, l_sprite.b)
	GRABSPRITE l_sprite.sprite,l_x,l_y,l_sizex,l_sizey
	BLACKSCREEN
	RETURN  l_sprite
ENDFUNCTION
// Erstellt eine Box als ring, mit l_new als False könnte es realtime genutzt werden->Test
//creates a box as ring, with 1_new as false it could be used realtime -> test
FUNCTION E_CREATERECT  AS Timage:  l_sizex,l_sizey, l_rgb = 0xffffff, l_new = TRUE
	STATIC s_index
	STATIC s_ctrl
	LOCAL l_x,l_y
	IF l_new = FALSE AND s_ctrl = 0
		s_index = E_SPRITEINDEX()
		s_ctrl = 1
	ENDIF
	IF l_new = TRUE
		s_ctrl = 0
		s_index = E_SPRITEINDEX()
	ENDIF
	LOCAL l_sprite AS Timage
	l_sprite.name$ = "E_DRAWRECT"
	l_sprite.tilex = l_sizex
	l_sprite.tiley = l_sizey
	l_sprite.sprite = s_index
	l_sprite.frame = 0
	l_sprite.sprt = 1
	l_sprite.load = TRUE
	//	l_sprite.x = l_x
	//	l_sprite.y = l_y
	DRAWRECT l_x,l_y,l_sizex,l_sizey,l_rgb
	GRABSPRITE l_sprite.sprite,l_x,l_y,l_sizex,l_sizey
	BLACKSCREEN
	RETURN  l_sprite
ENDFUNCTION
// Spritecoillision für Single oder Animate Sprite
//spritecollision for single  or animate sprite
FUNCTION E_SPRCOLL : l_sprite1 AS Timage , l_x1, l_y1,l_frame1,l_sprite2 AS Timage ,l_x2,l_y2,l_frame2
	LOCAL l_out
	IF l_frame1 > l_sprite1.frame THEN l_frame1 = 0
	IF l_frame2 > l_sprite2.frame THEN l_frame2 = 0
	IF l_sprite1.load = TRUE AND l_sprite2.load = TRUE
		IF l_sprite1.sprt = 0 OR l_sprite2.sprt = 0
			l_out = ANIMCOLL(l_sprite1.sprite,l_frame1,l_x1,l_y1,l_sprite2.sprite,l_frame2,l_x2,l_y2)
		ELSE
			l_out = SPRCOLL(l_sprite1.sprite,l_x1,l_y1,l_sprite2.sprite,l_x2,l_y2)
		ENDIF
	ENDIF
	RETURN l_out
ENDFUNCTION
//---------------------------------------------------------------------
// Gibt die X grösse zurück
//returns the size of x
FUNCTION E_GETSPRITESIZEX :  l_sprite AS Timage
	GETSPRITESIZE l_sprite.sprite,l_sprite.tilex,l_sprite.tiley
	RETURN l_sprite.tilex
ENDFUNCTION
// Gibt die Y grösse zurück
//returns the size of y
FUNCTION E_GETSPRITESIZEY :   l_sprite AS Timage
	GETSPRITESIZE l_sprite.sprite,l_sprite.tilex,l_sprite.tiley
	RETURN l_sprite.tiley
ENDFUNCTION
// Ladet ein Single sprite
//loads a single sprite
FUNCTION E_LOADSPRITE AS Timage :  l_path$
	E_RUNTIMEERROR(l_path$)
	LOCAL l_sprite AS Timage
	l_sprite.sprite = E_SPRITEINDEX()
	LOADSPRITE l_path$,l_sprite.sprite
	GETSPRITESIZE l_sprite.sprite,l_sprite.tilex,l_sprite.tiley
	l_sprite.load = TRUE
	l_sprite.frame = 0
	l_sprite.name$ = l_path$
	l_sprite.sprt = 1
	RETURN l_sprite
ENDFUNCTION
//--------------------------------loadanimimage---------------------------
//  file Path, tile width, tile high
// Ladet ein Tileset
//loads a tileset
FUNCTION E_LOADANIM AS Timage  : l_path$,l_tilex,l_tiley
	E_RUNTIMEERROR(l_path$)
	//-------------
	LOCAL l_x,l_y  				// zum berechnen der Tile anzahl aus der Image grösse //calculate the number of tiles from the image size
	LOCAL  l_xcount,l_ycount 	// Counter für die Positions verschiebung // counter for the position shifting
	LOCAL imagetemp 			// für die aufnahme des Tilsets //for the "recording" of the tileset
	LOCAL image AS Timage 		//für die aufnahme der Tiles //for the "recording" of the tiles
	image.tilex = l_tilex
	image.tiley = l_tiley
	image.sprite = E_SPRITEINDEX()
	image.frame = l_frame
	image.name$ = l_path$
	image.sprt = 0
	image.load = TRUE
	LOADANIM l_path$,image.sprite,l_tilex,l_tiley
	GETSPRITESIZE image.sprite,l_x,l_y
	image.frame = INTEGER(l_x/l_tilex)*INTEGER(l_y/l_tiley)-1
	RETURN image
ENDFUNCTION
// Gibt den Speicher wieder frei, bei l_all = 1 werden alle benutzten Indexzahlen frei gegeben
//releases the memory again, if l_all = 1 all used indexnumbers are released
// nur zum Testen //only for testing
FUNCTION E_FREESPRITE : l_mem AS Timage,l_all = 0,l_indexstart = 1000
LOCAL l_temp,l_i
	IF l_all = 0
		l_mem.name$ = ""
		l_mem.x = 0
		l_mem.y = 0
		l_mem.tilex = 0
		l_mem.tiley = 0
		l_mem.frame = 0
		l_mem.col = 0
		l_mem.load = FALSE
		l_mem.sprt = 0
		LOADSPRITE "",l_mem.sprite
	ELSE
		l_temp = E_SPRITEINDEX(FALSE)-1
		FOR l_i = l_indexstart TO l_temp
			LOADSPRITE "",l_i
		NEXT
	ENDIF
ENDFUNCTION
// Zeichnet ein Single oder Animate Sprite mit einem Alphawert
//draws a single or animate sprite with alphavalue
FUNCTION E_DRAWSPRITEALPHA AS Timage : l_sprite AS Timage,l_posx,l_posy,l_frame = 0,l_alpha = 0
	IF l_sprite.load = TRUE
		IF l_frame > l_sprite.frame THEN l_frame = 0
		IF l_frame > l_sprite.frame  // Frame out of range ? Then dummy gfx
			l_frame = 0
			DRAWRECT l_posx,l_posy,l_sprite.tilex,l_sprite.tiley,RGB(RND(255),50,50)
		ELSE
			ALPHAMODE l_alpha
			IF l_sprite.sprt = 0
				DRAWANIM l_sprite.sprite,l_frame,l_posx,l_posy
			ELSE
				DRAWSPRITE l_sprite.sprite,l_posx,l_posy
			ENDIF
			ALPHAMODE  0
		ENDIF
	ENDIF
	RETURN l_sprite
ENDFUNCTION
// Zeichnet ein Single oder Animate Sprite
//draws a single or animate sprite
FUNCTION E_DRAWSPRITE AS Timage : l_sprite AS Timage,l_posx,l_posy,l_frame = 0
	IF l_sprite.load = TRUE
		IF l_frame > l_sprite.frame THEN l_frame = 0
		IF l_sprite.sprt = 0
			DRAWANIM  l_sprite.sprite,l_frame,l_posx,l_posy
		ELSE
			DRAWSPRITE l_sprite.sprite,l_posx,l_posy
		ENDIF
	ENDIF
	RETURN l_sprite
ENDFUNCTION
//VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
// Index Nr 0 to **
// Param True = inc index
// Param False = next Free index
FUNCTION E_SPRITEINDEX : l_in = TRUE, l_startindex = 1000
	STATIC s_index
	IF l_in = TRUE
		INC s_index,1
		RETURN s_index -1 + l_startindex
	ELSE
		RETURN s_index +l_startindex
	ENDIF
ENDFUNCTION
TYPE Tsprite
	x
ENDTYPE
TYPE  Timage
	name$	 	//Filename
	x			//Position X
	y			//Position Y
	tilex		//Tile width
	tiley		//Tile high
	sprite		//Sprite index
	frame		// Maximal Animation 0 -> ?
	col			// Collision True | False
	load        // True Or false for Freeimage()
	sprt		//sprite Type | 0 = loadanimimage | 1 = loadimage
	r	= 255	// RGB color
	g	= 0
	b	= 128
	i			//forschleife //forloop
ENDTYPE
			
			
			
				Thanks for looking that out for me Moru, its a nice read!  :good: