BlitzBasic like Syntax

Previous topic - Next topic

Schranz0r

Hab mal angefangen ein ImageHandling und kleinigkeiten wie bei BlitzBasic zu machen.

Bilder z.B werden per Variable "gehandelt", siehe Codebeispiel

wers braucht!

Codebeispiel:

Code (glbasic) Select
// - Load Images ----------------------------------
GLOBAL Img1 = LoadImage("pic.png")
GLOBAL Img2 = LoadImage("pic.png")
GLOBAL Img3 = LoadImage("pic.png")
// ------------------------------------------------


MidHandleImage(Img1) //\
MidHandleImage(Img2) //--> Setze Ausgangspunk des Images in die Bildmitte

WHILE TRUE
KeyHitUpdate()

DrawImage(Img1,320,240)
DrawImage(Img2,MouseX(),MouseY())
DrawImage(Img3,100,100)

IF KeyDown(57) THEN PRINT "PRESSED",10,10 // Space
IF KeyHit(47) THEN PRINT "KeyHit",10,30 // V

IF MouseHit(1) AND ImagesCollide(Img2, Img1) // linke Maustaste und Collision
PRINT "COLLISION",500,10
ENDIF

IF MouseHit(1) AND ImagesCollide(Img2, Img3) // linke Maustaste und Collision
PRINT "COLLISION",500,10
ENDIF

SHOWSCREEN
WEND
END
Hier die BB.gbas:

Code (glbasic) Select
// --------------------------------- //
// Project: BB-Syntax
// Version: 0.1 Alpha
// IDE Version: 5.119
// --------------------------------- //



TYPE Image
ID // Spritenumber
X;Y // Position
XX;YY // width and height
Midhand // 0 = off , 1 = on
ENDTYPE

GLOBAL TImage[] AS Image

// --------------------------------------------------------
// - Functions --------------------------------------------
// --------------------------------------------------------

FUNCTION _GetImageID:
LOCAL XX, YY, num
    GETSPRITESIZE num, XX, YY
    WHILE XX>0
        INC num, 1
        GETSPRITESIZE num, XX, YY
    WEND
    RETURN num
ENDFUNCTION


// --------------------------------------------------------
// - Images -----------------------------------------------
// --------------------------------------------------------
// TYPE Image
// ID // Spritenumber
// X;Y // Position
// XX;YY // width and height
// Midhand // 0 = off , 1 = on
// ENDTYPE
// --------------------------------------------------------
FUNCTION LoadImage: file$
LOCAL t AS Image
LOCAL num
t.ID = _GetImageID()
LOADSPRITE file$,t.ID
GETSPRITESIZE t.ID,t.XX,t.YY
DIMPUSH TImage[],t
RETURN t.ID
ENDFUNCTION

FUNCTION DrawImage: handle, x, y // handle = Name from LoadImage, example: IMG = LoadImage("img.png") use IMG !
TImage[handle].X = x
TImage[handle].Y = y
IF TImage[handle].Midhand = FALSE
DRAWSPRITE TImage[handle].ID, TImage[handle].X, TImage[handle].Y
ELSE
DRAWSPRITE TImage[handle].ID, TImage[handle].X-TImage[handle].XX/2, TImage[handle].Y-TImage[handle].YY/2
ENDIF
ENDFUNCTION

FUNCTION MidHandleImage: handle
TImage[handle].Midhand = TRUE
ENDFUNCTION

FUNCTION ImagesCollide: handle, handle2  // handle = image variable, handle2 = image variable 2
LOCAL x1, y1, x2, y2, col

IF TImage[handle].Midhand = FALSE
x1 = TImage[handle].X
y1 = TImage[handle].Y
ELSE
x1 = TImage[handle].X - TImage[handle].XX/2
y1 = TImage[handle].Y - TImage[handle].YY/2
ENDIF

IF TImage[handle2].Midhand = FALSE
x2 = TImage[handle2].X
y2 = TImage[handle2].Y
ELSE
x2 = TImage[handle2].X - TImage[handle2].XX/2
y2 = TImage[handle2].Y - TImage[handle2].YY/2
ENDIF

col =  SPRCOLL(TImage[handle].ID, x1, y1, TImage[handle2].ID, x2, y2)

RETURN col
ENDFUNCTION


// --------------------------------------------------------
// - Input -----------------------------------------------
// --------------------------------------------------------
//
// --------------------------------------------------------

FUNCTION MouseX:
LOCAL mx,my,b1,b2
MOUSESTATE mx, my, b1, b2

RETURN mx
ENDFUNCTION

FUNCTION MouseY:
LOCAL mx,my,b1,b2
MOUSESTATE mx, my, b1, b2

RETURN my
ENDFUNCTION

FUNCTION MouseHit: num// 1 = left, 2 = right, 3 = mouseweel
LOCAL but
IF num = 1 THEN but = 3
IF num = 2 THEN but = 4
IF num = 3 THEN but = 5

IF MOUSEAXIS(but) THEN RETURN TRUE
ENDFUNCTION


// Update keyboard state
FUNCTION KeyHitUpdate:
GLOBAL gKeyDown[], gKeyState[]
LOCAL  k, i
    // First Time call/ zum ersten Mal hier
    IF BOUNDS(gKeyDown[],0)=0
        DIM gKeyDown[256]
        DIM gKeyState[256]
    ENDIF

    // For each key / für jede Taste
    FOR i=0 TO 255
        k = KEY(i)
        // Key is pressed / Taste ist gedrückt
        IF k
            IF gKeyDown[i]
                gKeyState[i]=1
            ELSE
                gKeyDown[i]=1
                gKeyState[i]=2
            ENDIF
        ELSE
            // Key is not pressed / Taste nicht gedrückt

            // Has key been pressed before?
            // War die Taste gedrückt?
            IF gKeyDown[i]
                gKeyDown[i] = 0
                gKeyState[i] = -1
            ELSE
                gKeyState[i]=0
            ENDIF
        ENDIF
    NEXT
ENDFUNCTION


FUNCTION GetKeyStat: nkey//  0 = not pressed; 1 = pressed; 2 = just pressed; -1 = release event
    RETURN gKeyState[nkey]
ENDFUNCTION

FUNCTION KeyHit: nkey
IF GetKeyStat(nkey) = 2 THEN RETURN TRUE
ENDFUNCTION

FUNCTION KeyDown: nkey
IF GetKeyStat(nkey) = 1 THEN RETURN TRUE
ENDFUNCTION
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

Kitty Hello

Neu, Neu, Neu: LOADANIM/DRAWANIM (mach das net doppelt ;) )

Schranz0r

Sehr geil Gernot, nur eins gefällt mir nicht !
Das man angeben muss, x und y bei DRAWANIM...quasi immer eine doppelte For-Schleife braucht!
Könnte man das nicht auch intern Regeln?
Oder brauchst du das, da du ja ein ANIM-Image immer auf eine ID von Sprites legst?
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

Kitty Hello

Äh... Willst Du die Kacheln immer auf 0,0 zeichnen?

Schranz0r

Ok ich seh schon irgendwas versteh ich da wohl nicht ganz!

LOADANIM datei$, id%, w%, h%

Die id% ist die StartID(SpriteSlot) der Zählung, oder die SpriteID die immer um 1 erhöht wird(Sprich id% = frame0, id%+1 wär dann frame1 usw)?

EDIT:

OK du benutzt nur eine SpriteID, Sehr gut :D !
Wie wärs wenn LOADANIM die Anzahl der Tiles zurückliefert?
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

Kitty Hello

Also - loadanim läd nur "1" Sprite. Das muss man dann mit DRAWANIM zeichnen.
Ich bau später noch eine Funktion, die ein Sprite zerschnipseln kann und 1000 Sprites erzeugt.