Author Topic: 2D Entitysystem ;)  (Read 11505 times)

Offline D2O

  • Prof. Inline
  • *****
  • Posts: 1066
    • View Profile
    • http://www.deuteriumoxid.com
2D Entitysystem ;)
« on: 2008-Jul-14 »
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






« Last Edit: 2008-Jul-20 by D²O »
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

Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5028
  • O Rly?
    • View Profile
Re: 2D Entitysystem ;)
« Reply #1 on: 2008-Jul-15 »
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 1700 @3.9GHz, 16GB HyperX Fury 3000MHz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard

Offline D2O

  • Prof. Inline
  • *****
  • Posts: 1066
    • View Profile
    • http://www.deuteriumoxid.com
Re: 2D Entitysystem ;)
« Reply #2 on: 2008-Jul-18 »
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
« Last Edit: 2008-Jul-22 by D²O »
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

Offline Heiko

  • Community Developer
  • Prof. Inline
  • ******
  • Posts: 500
    • View Profile
Re: 2D Entitysystem ;)
« Reply #3 on: 2008-Jul-19 »
Ich find das ja schonmal klasse von dir, irgendwie kristallisiert sich da wohl irgendwann eine zweite Befehlsschicht als Alternative heraus.....
Ryzen 5 2400G - MSI B450 Tomahawk

Offline D2O

  • Prof. Inline
  • *****
  • Posts: 1066
    • View Profile
    • http://www.deuteriumoxid.com
Re: 2D Entitysystem ;)
« Reply #4 on: 2008-Jul-22 »
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

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10723
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
Re: 2D Entitysystem ;)
« Reply #5 on: 2008-Jul-22 »
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...

Offline Heiko

  • Community Developer
  • Prof. Inline
  • ******
  • Posts: 500
    • View Profile
Re: 2D Entitysystem ;)
« Reply #6 on: 2008-Jul-22 »
ich hoffe es ist nicht vermessen, wenn ich da jetzt mal ein großes "JA" verlauten lasse.
Ryzen 5 2400G - MSI B450 Tomahawk

Offline D2O

  • Prof. Inline
  • *****
  • Posts: 1066
    • View Profile
    • http://www.deuteriumoxid.com
Re: 2D Entitysystem ;)
« Reply #7 on: 2008-Jul-22 »
 :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

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10723
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
Re: 2D Entitysystem ;)
« Reply #8 on: 2008-Jul-22 »
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.

Offline Heiko

  • Community Developer
  • Prof. Inline
  • ******
  • Posts: 500
    • View Profile
Re: 2D Entitysystem ;)
« Reply #9 on: 2008-Jul-22 »
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.
Ryzen 5 2400G - MSI B450 Tomahawk

Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5028
  • O Rly?
    • View Profile
Re: 2D Entitysystem ;)
« Reply #10 on: 2008-Jul-22 »
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 1700 @3.9GHz, 16GB HyperX Fury 3000MHz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard

Offline Heiko

  • Community Developer
  • Prof. Inline
  • ******
  • Posts: 500
    • View Profile
Re: 2D Entitysystem ;)
« Reply #11 on: 2008-Jul-22 »
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
« Last Edit: 2008-Jul-22 by Heiko »
Ryzen 5 2400G - MSI B450 Tomahawk

Offline BumbleBee

  • Global Moderator
  • Prof. Inline
  • *******
  • Posts: 891
    • View Profile
Re: 2D Entitysystem ;)
« Reply #12 on: 2008-Jul-22 »
@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

Offline Heiko

  • Community Developer
  • Prof. Inline
  • ******
  • Posts: 500
    • View Profile
Re: 2D Entitysystem ;)
« Reply #13 on: 2008-Jul-22 »
schau einfach beim ES thread nach.....
Ryzen 5 2400G - MSI B450 Tomahawk

Offline Moru

  • Administrator
  • Prof. Inline
  • *******
  • Posts: 1781
    • View Profile
    • Homepage
Re: 2D Entitysystem ;)
« Reply #14 on: 2008-Aug-23 »
This one looks interesting, how finished is it? Is there any zip-file to download?