ANIMCOLL() funktioniert nicht.

Previous topic - Next topic

D2O

Hi, im fogenden code sollte es eine Collision mit dem rechten bild geben, aber auch nur
wenn Frame 2 (das dritte bild) angezeigt wird.
Hier bekomme ich aber permanent eine Collision gemeldet?
Genauso mit dem linken bild, hier wird nur Frame 0  gezeichnet und eine collision auf frame 2 geprüft,
trotzdem gibts ne Collision.
Code (glbasic) Select
// --------------------------------- //
// Project: Ani_bug
// Start: Saturday, April 12, 2008
// IDE Version: 5.227


SETTRANSPARENCY RGB(0,0,0)
LOADANIM "1.png",1,64,64
LOADANIM "2.png",2,64,64

a = 0
temp = 0
time = 0

WHILE TRUE
time = GETTIMERALL()
MOUSESTATE mx,my,b1,b2

DRAWANIM 2,0,100,100
DRAWANIM 2,a,200,100
IF (time-temp) > 100
temp = time
INC a,1
ENDIF
IF a > 10 THEN a = 0

DRAWANIM 1,0,mx,my

PRINT ANIMCOLL(1,0,mx,my,2,2,100,100),10,10
PRINT ANIMCOLL(1,0,mx,my,2,2,200,100),30,10


SHOWSCREEN
WEND
Hier gibts das ganze Paket zum Download:
http://www.deuteriumoxid.com/glbasic/Ani_bug.zip
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

Da musst Du bei ANIMCOLL statt 1,0 eben 2,a machen. Oder... äh.
Also - ich versteh das Problem nicht.

D2O

Quote from: GernotFrischDa musst Du bei ANIMCOLL statt 1,0 eben 2,a machen. Oder... äh.
Also - ich versteh das Problem nicht.
Blub %&$%  jetzt versteh ich Dich nicht.

Ich möchte das nur eine collision angezeigt wird wenn vom 2. Bild der 3. Frame angezeigt wird.
Es wird aber, egal was für ein Frame ich benutze eine Collision angezeigt.
Vieleicht bin ich im momemt etwas bergriffstuzig.
Und einer ändert den code mal so das es funktioniert;)

Hier nochmals der Code, leicht verändert.
Code (glbasic) Select
SETTRANSPARENCY RGB(0,0,0)
LOADANIM "1.png",1,64,64
LOADANIM "2.png",2,64,64

GLOBAL a = 0 // Counter für die Animation

WHILE TRUE
time = GETTIMERALL()
MOUSESTATE mx,my,b1,b2


DRAWANIM 2,a,200,100 // Das Animierte Bild anzeigen
// a bestimmt den Frame


IF (time-temp) > 250 // jede 20 millisec. a um 1 erhöhen
temp = time
INC a,1
ENDIF
IF a > 10 THEN a = 0 // Sicherheits abfrage damit nur
// die vorhandenen Frames angezeigt werden



DRAWANIM 1,0,mx,my // Bild an die Mousecoordinaten geheftet


// Hier Dürfte nur eine 1 zurückgegeben werden wenn das Bild1 an der Mouse
// mit dem 3.Frame vom Bild2 Collidiert.
// es wird aber immer, egal welcher Frame benutzt wird eine Collision angezeigt!??

PRINT ANIMCOLL(1,0,mx,my,2,2,200,100),30,10


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

NEIN!
ANIMCOLL(1,0,... 2,2,...
gibt zurück, ob Animation 1 mit frame 0 an stelle mx, my (Also Mauspfeil) mit Animation 2, Frame 2 bei 200,100 kollidiert.
Wenn Du nur beim Anzeigen des 3. Frames kollidieren willst must Du:

Code (glbasic) Select
IF a = 3
   PRINT ANIMCOLL(1,0,mx,ym,    2,  3   ,200,100), 30,10
ENDIF
machen.

D2O

Ja, das geht.
Bzw. aus ym ein my machen ;)

Aber so wollte ich das nicht haben.

ANIMCOLL() sollte doch selber ein 1 bei einer kollision zurückliefern und eine 0  bei keiner kollision.
Sie liefert aber immer eine 1 zurück egal welcher Frame das Bild2 hat.
Wenn ich hier ne If abfrage einbauen muss ist doch der vorteil gegenüber SPRCOLL() futsch :(
Dann kann man gleich wieder einzelne tiles laden und die überprüfen.
Oder nicht?
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

Äh... Moment. Ich glaube Du hast was nicht ganz kapiert. ANIMCOLL _ist_ SPRCOLL, nur dass Du zu der LOADANIM-ID zusätzlich den Frame-ID angeben musst. Wenn Du was mit DRAWNIM zeichnest, dann hat der ANIMCOLL davon keine Ahnung.
Oder verstehe ich Dich falsch? Bin jetzt bisserl verwirrt.

D2O

Ah, ok.

Jetzt wirds klar.
Also muss ich ne extra abfrage machen.
Ich war nun voll überzeugt, das ANIMCOLL speziell nur ein True zurückliefert wenn das Frame selber collidiert.

Es sollte in etwas so funktionieren wie es z.B in BB gehandhabt wird:
Wert=IMAGESCOLLIDE (Bild1, X1, Y1, Frame1, Bild2, X2, Y2, Frame2)
Dort wir nur eine Collision zurück geliefert wenn der Tatsächliche Frame von Bild 1 mit dem Frame von Bild 2 collidiert.

Schade dass das nicht so ist, wäre vieleicht ein vorschlag/wunsch :)

Ok, in diesem fall muss ich da anderes rangehen.
Danke.
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

In BB ist der IMAGESCOLLIDE doch so, dass er weiß wo/wie ein Ding steht, oder?
In GLBasic st das nur eine Kollisionsabfrage der Pixel von Bild1 mit Bild2.

D2O

Quote from: GernotFrischIn BB ist der IMAGESCOLLIDE doch so, dass er weiß wo/wie ein Ding steht, oder?
In GLBasic st das nur eine Kollisionsabfrage der Pixel von Bild1 mit Bild2.
Hmm, meinst Du ne BOXcollision über die Position?
Dann nein, hier wird auch pixelgenau geprüft.
Wie das aber genau intern gehandhabt wird weis ich auch nicht, vieleicht hat das auch mit diesem Entitysytem zu tun.
Oder es erden hier die einzelnen Frames intern in einer liste oder array gespeichert.

Hier mal ein beispiel wie ich es gelöst hatte, es ist nicht so schön aber es funktioniert :)
Schön wäre es wenn sowas intern passiert.

Die Gfx gibts hier.
http://www.deuteriumoxid.com/glbasic/tile.bmp
http://www.deuteriumoxid.com/glbasic/tile2.png

Code (glbasic) Select
// --------------------------------- //
// Project: Loadanim_v7
// Start: Monday, January 28, 2008
// IDE Version: 5.150



// Code example :

GLOBAL player1 AS Tsprite
GLOBAL player2 AS Tsprite


player1= loadimage("tile.bmp",32,32,18)
player2 = loadimage("tile2.png",128,64,18)
//
GLOBAL a
WHILE TRUE
time = GETTIMERALL()
MOUSESTATE mx,my,b1,b2




DRAWSPRITE player2.pic[a],100,100
DRAWSPRITE player1.pic[0],mx,my

SHOWSCREEN



PRINT spranicoll (player1.pic[0],player1.pic[0],mx,my,player2.pic[a],player2.pic[5],100,100),0,300


IF (time-temp) > 250 // jede 250 millisec. a um 1 erhöhen
temp = time
INC a,1
ENDIF
IF a > 17 THEN a = 0


WEND
/////////// Code example End







FUNCTION spranicoll : pic1,frame1,posx1,posy1,pic2,frame2,posx2,posy2

LOCAL l_out = 0



IF pic1 = frame1 AND pic2 = frame2
l_out = SPRCOLL (pic1,posx1,posy1,pic2,posx2,posy2)
ENDIF

RETURN l_out

ENDFUNCTION





//--------------------------------loadimage---------------------------
//  file Path, tile wight, tile high, tile pay down

FUNCTION loadimage AS Tsprite:l_path$,l_tilex,l_tiley,l_anzahl
    STATIC s_counter  
    STATIC s_ctrl
                IF s_ctrl = 0
                    s_counter = 1000 //Ab 1000 damit überschneidungen mit loadsprite nicht vorkommen
                    s_ctrl = 1
                ENDIF
        //-------------
    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 Tsprite //für die aufnahme der Tiles
    LOCAL l_showload // Variablen für Ladebalken
    LOCAL l_prozent
    l_showload = 100/l_anzahl

    image.tilex = l_tilex
    image.tiley = l_tiley
    image.frame = l_anzahl -1


    LOCAL l_posx,l_posy     // Variablien für Grundposition auf die sich die Verschiebung berechnet| x = 0 | y = 0
    LOCAL l_i                 // für die for schleife
    LOCAL countertemp


        REDIM image.pic[l_anzahl]

            countertemp = s_counter    //Index Temporär speichen um später den Speicher wieder freizu geben
            LOADSPRITE l_path$,countertemp //image laden
            GETSPRITESIZE countertemp,l_x,l_y    //Image grösse ermitteln

                l_x = INTEGER(l_x/l_tilex)
                l_y = INTEGER(l_y/l_tiley)



                     LOADSPRITE l_path$,countertemp
                         INC s_counter,1  //index um 1 erhöhen


            FOR l_i = 0 TO l_anzahl-1

                    IF l_xcount < l_x
                            l_posx = (-l_tilex*l_xcount)
                            ELSE
                                l_xcount = 0
                                l_posx = (-l_tilex*l_xcount)
                                INC l_ycount,1
                    ENDIF

                    IF l_ycount < l_y
                            l_posy = (-l_tiley*l_ycount)
                            ELSE
                                INC l_ycount,1
                                l_posy = (-l_tiley*l_ycount)
                    ENDIF
                    DRAWRECT 0,0,l_tilex,l_tiley,RGB(255,0,128) ///<<<<<<<< FIX :)
                    DRAWSPRITE countertemp,l_posx,l_posy
                    GRABSPRITE s_counter,0,0,l_tilex,l_tiley
                    BLACKSCREEN
                   
                    ///Ladebalken---------------
                    INC l_prozent,l_showload
                       PRINT INTEGER(l_prozent)+"% geladen",1+l_prozent,80
                          DRAWRECT 0, 100, 1*l_prozent, 20, RGB(0, 255, 255) //Türkis

                    ///-----------------------------
                   
                   
                    SHOWSCREEN //__________________________________________
                   
                   
                        image.pic[l_i] = s_counter
                    INC l_xcount,1
                    INC s_counter,1
            NEXT

                LOADSPRITE "",countertemp  //Speichfreigenen
               
                RETURN image

ENDFUNCTION




// Dieser Type wir gebraucht um aus der function loadimage ein array als rückgabe wert zu nutzen
// er könnte auch für die bild positionen usw. erweitert werden
TYPE Tsprite
pic[]
x //positionen
y
tilex // Tilegrösse
tiley
frame //anzahl der frames
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

Kitty Hello

Sorry, aber ich kapier echt nicht warum Du das so kompliziert machst. Schranzor - Du kannst doch BB. Weißt Du wo unsere Verständigungsprobleme sind?

Schranz0r

http://www.blitzbase.de/befehle2d/imagescollide.htm

Versteh auch net das Problem?!

BB:
Code (glbasic) Select
Wert=IMAGESCOLLIDE (Bild1, X1, Y1, Frame1, Bild2, X2, Y2, Frame2)GLB:
Code (glbasic) Select
col# = ANIMCOLL(ani1#,frame1#, x1#,y1#, ani2#,frame2#, x2#,y2#)für mich das selbe in grün :)

Einen vorschlag hätte ich aber noch Gernot

LOADANIM sollte die Frameanzahl returnen.
Oder ein GETANIMFRAMES um die genaue Anzahl der Frames zu bekommen.
Weil wenn man über das Ziel(Frames) kommt, dann kommen nurnoch halbe Bilder/komische abgeschnitte Sachen.


EDIT:

Ich glaub ich weiss wieso ^^
Wie Gernot schon sagte weiss das Programm nicht das du den nächsten Frame drin hast , und somit weiss das ANIMCOLL auch net!
So ist für mich ANIMCOLL unbrauchbar, das könnte man dann ja gleich mit einer IF frame = 5 AND BOXCOLL(tile,x,y,tile2,x2,y2); tuwas = 1; ENDIF z.B machen ....
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

animcoll is doch pixelgenaue kollision von 2 animations-stufen.

Schranz0r

Ja Gernot, aber nich für einzelne/feststehende Frames.
Wie willst du prüfen ob das Sprite auf der Mouse X/Y  auch wirklich das Sprite auf Frame 3 z.B berührt?
Ich habs net hin bekommen.
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

Ja... bin ich jetzt bekloppt!?
Code (glbasic) Select
LOADANIM "hund_laufen", 0,32,32
LOADANIM "laterne_blinken", 1,32,128

ANIMCOLL 0,hund_animation, hund_x, hund_y, 1, laterne_blinken, laterne_x, laterne_y
...oder ist da ein Bug drin?

Schranz0r

Gernot :)
 
Nicht alle Frames prüfen, sondern nur einen z.B frame 7 vom hund_laufen mit voller animation von laterne_blinken!
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