2D Entitysystem ;)

Previous topic - Next topic

D2O

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.

Code (glbasic) Select
// --------------------------------- //
// 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:

Code (glbasic) Select




GLOBAL mov AS Tmedia

mov = E_LOADMEDIA("1.WMV")

E_RUNTIMEERROR(mov.media$)


E_PLAYMOVIE(mov)

KEYWAIT







I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Schranz0r

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 ;)
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

D2O

#2
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:


Code (glbasic) Select
// --------------------------------- //
// 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:

Code (glbasic) Select


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:

Code (glbasic) Select

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:

Code (glbasic) Select
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:
Code (glbasic) Select
// --------------------------------- //
// 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
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Heiko

Ich find das ja schonmal klasse von dir, irgendwie kristallisiert sich da wohl irgendwann eine zweite Befehlsschicht als Alternative heraus.....

D2O

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 :

Code (glbasic) Select
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

I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Kitty Hello

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...

Heiko

ich hoffe es ist nicht vermessen, wenn ich da jetzt mal ein großes "JA" verlauten lasse.

D2O

 :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.
I7 2600K; 8 GB RAM ; Win10 Pro x64 | NVidia GTX 750 TI 2048MB ; Realtec OnBoard Sound;
Lenovo ThinkPad T400: XP Pro
GLB Premium-immer Aktuell

Kitty Hello

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.

Heiko

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.

Schranz0r

Schwammig?
Die Kollision gibt dir auch nur ein True oder False wieder... der Rest ist dein Bier. Sprich codefehler/denkfehler...
I <3 DGArray's :D

PC:
AMD Ryzen 7 3800X 16@4.5GHz, 16GB Corsair Vengeance LPX DDR4-3200 RAM, ASUS Dual GeForce RTX™ 3060 OC Edition 12GB GDDR6, Windows 11 Pro 64Bit, MSi Tomahawk B350 Mainboard

Heiko

#11
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

BumbleBee

@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
The day will come...

CPU Intel(R) Core(TM) i5-3570k, 3.4GHz, AMD Radeon 7800 , 8 GB RAM, Windows 10 Home 64Bit

Heiko

schau einfach beim ES thread nach.....

Moru

This one looks interesting, how finished is it? Is there any zip-file to download?