Français
Forum

Neue Kollisionsdemo

 
Habe jetz la fois wieder une Kollisionsroutine avec dem voiture erstellt.
comme erstes wird cela Kollisionsrechteck avec IntersectRect(rechteck1#,rechteck2#,rechteck3#) abgefragt.
si qui Variable colli&=1 ensuite volonté qui Pixel pour la couleur abgefragt.
presque alles reine Profanbefehle sans hinterecken.
avec Profan2Cpp wird es vraie vite.
Es volonté aussi qui Rechteckdaten ausgegeben welches de den beiden Kollionsrechtecken gebildet wird.
peux on aussi encore bien zum Auswerten prendre.

cet bitmap_header c'est moi encore un bisschen trop long.
comment peux on là quoi simple kurzes reinsetzen? Gibt des pour encore une Profanbefehl?

mfg
KompilierenMarqueSéparation
 $H Windows.ph
declare x1!,y1!,dx!,dy!,winkel!,y&,z&,z1&,z2&,z3&,groesse&
declare hWin&,hwin1&,hintergr&,hintergr1&,block&,hintergrauto&
declare width&,height&,ende&,bild_auto&,wert&
declare bmi# ,ogl_rgb#,b#,rechteck1#,rechteck2#,rechteck3#
declare xb1&,yb1&,xb2&,yb2&,xd&,yd&,colli&,xx1&,yy1&
groesse&=64*64*4
dim b#,groesse&
dim ogl_rgb#,groesse&
wert&=groesse&
ende&=1
Window 20,20-800,600
Cls @RGB(220,220,220)
hWin& = @Create(text, %hwnd, Test1, 10, 10, 64,64)
hWin1& = @Create(text,%hwnd, Test2, 200, 10,500,500)
hintergr&=create(hnewpic,500,500,$00ffff)
hintergr1&=create(hnewpic,500,500,$00ffff)
block&=create(hnewpic,64,64,$00ff00)
bild_auto&=create(hnewpic,64,64,$00ff00)
STRUCT rect = x&,y&,w&,h&
DIM rechteck1#, rect
DIM rechteck2#, rect
DIM rechteck3#, rect
oGL(Init, hwin&, 0,0, 0, 0)
oGL(PosMode, 1)
bild_auto& = Create(hnewPic,64,64,0 )
var tex.auto& = oGL(LoadTextureBMP,auto1.bmp,1)
mcls 64,64
height&=64
width&=64
bitmap_header
drawglscene
drawglscene
oglzubmp
dx!=100
dy!=100
drawscene

WHILE ende&

    sleep 1

    if isKey(81)

        winkel!=winkel!+1.0
        drawglscene
        oglzubmp
        drawscene

    endif

    if isKey(69)

        winkel!=winkel!-1.0
        drawglscene
        oglzubmp
        drawscene

    endif

    if isKey(87)

        y1!=Sin((-winkel!)/180.0*pi())*2
        x1!=Cos((-winkel!)/180.0*pi())*2
        dx!=dx!-x1!
        dy!=dy!-y1!
        drawglscene
        oglzubmp
        drawscene

    endif

    if isKey(83)

        y1!=Sin((-winkel!)/180.0*pi())*2
        x1!=Cos((-winkel!)/180.0*pi())*2
        dx!=dx!+x1!
        dy!=dy!+y1!
        drawglscene
        oglzubmp
        drawscene

    endif

    collision
    StartPaint %hwnd
    DrawText 10,300,(Format$(######0      ,colli&))
    DrawText 10,320,(Format$(######0      ,z&))
    DrawText 10,350,w +(Format$(######0      ,xd&))
    DrawText 70,350,h +(Format$(######0      ,yd&))
    DrawText 10,380,x +(Format$(######0      ,rechteck1#.x&))
    DrawText 70,380,y +(Format$(######0      ,rechteck1#.y&))
    DrawText 10,410,x1 +(Format$(######0      ,rechteck1#.w&))
    DrawText 70,410,y1 +(Format$(######0      ,rechteck1#.h&))
    endpaint

ENDWHILE

end

proc collision

    With rechteck1#

        .x& = 0
        .y& = 0
        .w& = 0
        .h& = 0

    EndWith

    With rechteck2#

        .x& = dx!
        .y& = dy!
        .w& = dx!+64
        .h& = dy!+64

    EndWith

    With rechteck3#

        .x& = 300
        .y& = 200
        .w& = 364
        .h& = 264

    EndWith

    colli&=~IntersectRect(rechteck1#,rechteck2#,rechteck3#)
    xb1&=rechteck1#.x&-300
    yb1&=rechteck1#.y&-200
    xb2&=rechteck1#.w&-300
    yb2&=rechteck1#.h&-200
    xd&=xb2&-xb1&
    yd&=yb2&-yb1&

    if colli&=1

        pixelausgabe

    endif

endproc

proc pixelausgabe

    ~GetDIBits(%hdc,hintergrauto&,0,64,b#,bmi#,0)

    whileloop 0,wert&,4

        z&=0
        z1&=byte(b#,&loop)
        z2&=byte(b#,&loop+2)

        if (z1& > 200) or (z2& > 200)

            z&=255
            break

        endif

    endwhile

endproc

proc oglzubmp

    ogl(glReadPixels,0,0,64,64,~GL_BGRA,~GL_UNSIGNED_BYTE,ogl_rgb#)
    ~setDIBits(%hdc,bild_auto&,0,64,ogl_rgb#,bmi#,0)
    startpaint -1
    drawpic bild_auto&,0,0;-1
    endpaint

endproc

proc drawglscene

    OGL(Clear)
    OGL(origin,0,0,-1.11)
    OGL(texture,tex.auto&,1)
    OGL(rotate,0,0,winkel!)
    OGL(quad,0.7,0.7)
    OGL(show)

endproc

proc drawscene

    startpaint hintergr&
    drawpic hintergr1&,0,0;0
    drawpic block&,300,200;0
    mcopybmp 0,0 - 64,64 > dx!,dy!,-1
    endpaint
    startpaint hwin1&
    drawpic hintergr&,0,0;0
    endpaint
    hintergrauto&=create(hpiccopy,hintergr&,300,200,64,64)
    startpaint hwin&
    drawpic hintergrauto&,0,100;0
    endpaint

endproc

proc bitmap_header

    def &BI_RGB 0
    def &DIB_RGB_COLORS 0
    struct BITMAPINFOHEADER =
    biSize&, biWidth&, biHeight&, biPlanes%, biBitCount%, biCompression&,
    biSizeImage&, biXPelsPerMeter&, biYPelsPerMeter&, biClrUsed&, biClrImportant&
    dim bmi#,BITMAPINFOHEADER
    clear bmi#

    with bmi#

        .biSize&        = sizeof(bmi#)
        .biWidth&       = width&
        .biHeight&      = height&
        .biPlanes%      = 1
        .biBitCount%    = 32
        .biCompression& = &BI_RGB
        .biSizeImage&   = ((.biWidth& * .biBitCount%  8 - 1) | 3 + 1) * endwith

endproc


aussi wieder qui ASM-Routine incorporé zum Auswerten qui Pixelfarbe.
Läuft avec Profan2Cpp et dem Xpia:
KompilierenMarqueSéparation
 $H Windows.ph
declare x1!,y1!,dx!,dy!,winkel!,y&,z&,groesse&
declare hWin&,hwin1&,hintergr&,hintergr1&,block&,hintergrauto&
declare width&,height&,ende&,bild_auto&
declare bmi# ,ogl_rgb#,b#,rechteck1#,rechteck2#,rechteck3#
declare xb1&,yb1&,xb2&,yb2&,xd&,yd&,colli&,xx1&,yy1&
groesse&=64*64*4
dim b#,groesse&
dim ogl_rgb#,groesse&

Si 0

    AsmStart rgb_farbe

        Paramètres b#,groesse&
        LOCAL r :BYTE
        LOCAL g :BYTE
        LOCAL b :BYTE
        LOCAL n :DWORD
        mov eax,para2
        mov n,eax
        mov ecx,0
        mov ebx,para1

        .tandis que ecx<=n

            mov al,[ebx+ecx]
            mov r,al
            mov al,[ebx+ecx+1]
            mov g,al
            mov al,[ebx+ecx+2]
            mov b,al
            mov al,b

            .si al>252

                mov eax,255
                .pause

            .endif

            mov al,g

            .si al>252

                mov eax,255
                .pause

            .endif

            mov al,r

            .si al>252

                mov eax,255
                .pause

            .endif

            add ecx,4

        .endw

    AsmEnd(z&)

endif

ende&=1
Fenêtre 20,20-800,600
Cls @RGB(220,220,220)
hWin& = @Créer(text, %hwnd, Test1, 10, 10, 64,64)
hWin1& = @Créer(text,%hwnd, Test2, 200, 10,500,500)
hintergr&=create(hnewpic,500,500,$00ffff)
hintergr1&=create(hnewpic,500,500,$00ffff)
block&=create(hnewpic,64,64,$00f000)
bild_auto&=create(hnewpic,64,64,$00ff00)
oGL(Init, hwin&, 0,0, 0, 0)
oGL(PosMode, 1)
bild_auto& = Créer(hnewPic,64,64,0 )
var tex.auto& = oGL(LoadTextureBMP,voiture1.bmp,1)
STRUCT rect = x&,y&,w&,h&
DIM rechteck1#, rect
DIM rechteck2#, rect
DIM rechteck3#, rect
mcls 64,64
height&=64
width&=64
bitmap_header
drawglscene
drawglscene
oglzubmp
dx!=100
dy!=100
drawscene

WHILE ende&

    sleep 1

    si isKey(81)

        winkel!=winkel!+1.0
        drawglscene
        oglzubmp
        drawscene

    endif

    si isKey(69)

        winkel!=winkel!-1.0
        drawglscene
        oglzubmp
        drawscene

    endif

    si isKey(87)

        y1!=Sin((-winkel!)/180.0*pi())*2
        x1!=Cos((-winkel!)/180.0*pi())*2
        dx!=dx!-x1!
        dy!=dy!-y1!
        drawglscene
        oglzubmp
        drawscene

    endif

    si isKey(83)

        y1!=Sin((-winkel!)/180.0*pi())*2
        x1!=Cos((-winkel!)/180.0*pi())*2
        dx!=dx!+x1!
        dy!=dy!+y1!
        drawglscene
        oglzubmp
        drawscene

    endif

    collision
    Début de peinture %hwnd
    DrawText 10,300,(Format $(######0      ,colli&))
    DrawText 10,320,(Format $(######0      ,z&))
    endpaint

ENDWHILE

end

proc collision

    With rechteck1#

        .x& = 0
        .y& = 0
        .w& = 0
        .h& = 0

    EndWith

    With rechteck2#

        .x& = dx!
        .y& = dy!
        .w& = dx!+64
        .h& = dy!+64

    EndWith

    With rechteck3#

        .x& = 300
        .y& = 200
        .w& = 364
        .h& = 264

    EndWith

    colli&=~IntersectRect(rechteck1#,rechteck2#,rechteck3#)

    si colli&=1

        pixelausgabe

    endif

endproc

proc pixelausgabe

    ~GetDIBits(%hdc,hintergrauto&,0,64,b#,bmi#,0)
    z&=Call(xpia_getprocaddressm(xpia_hmodule&,rgb_farbe),b#,groesse&)

endproc

proc oglzubmp

    ogl(glReadPixels,0,0,64,64,~GL_BGRA,~GL_UNSIGNED_BYTE,ogl_rgb#)
    ~setDIBits(%hdc,bild_auto&,0,64,ogl_rgb#,bmi#,0)
    startpaint -1
    drawpic bild_auto&,0,0;-1
    endpaint

endproc

proc drawglscene

    OGL(Claire)
    OGL(origin,0,0,-1.11)
    OGL(texture,tex.auto&,1)
    OGL(rotate,0,0,winkel!)
    OGL(quad,0.7,0.7)
    OGL(show)

endproc

proc drawscene

    startpaint hintergr&
    drawpic hintergr1&,0,0;0
    drawpic block&,300,200;0
    mcopybmp 0,0 - 64,64 > dx!,dy!,-1
    endpaint
    startpaint hwin1&
    drawpic hintergr&,0,0;0
    endpaint
    hintergrauto&=create(hpiccopy,hintergr&,300,200,64,64)
    startpaint hwin&
    drawpic hintergrauto&,0,100;0
    endpaint

endproc

proc bitmap_header

    def &BI_RGB 0
    def &DIB_RGB_COLORS 0
    struct BITMAPINFOHEADER =
    biSize&, biWidth&, biHeight&, biPlanes%, biBitCount%, biCompression&,
    biSizeImage&, biXPelsPerMeter&, biYPelsPerMeter&, biClrUsed&, biClrImportant&
    dim bmi#,BITMAPINFOHEADER
    clear bmi#

    with bmi#

        .biSize&        = sizeof(bmi#)
        .biWidth&       = width&
        .biHeight&      = height&
        .biPlanes%      = 1
        .biBitCount%    = 32
        .biCompression& = &BI_RGB
        .biSizeImage&   = ((.biWidth& * .biBitCount%  8 - 1) | 3 + 1) * abs(.biHeight&)

    endwith

endproc


13 kB
Hochgeladen:06.03.2009
Downloadcounter62
Download
 
06.03.2009  
 



maintenant habe je qui erweitert sur verschiedene Formen, pas seulement sur un Viereck
Habe es ici avec einem Kreis getestet.

qui Kollisionsblockkreis ist vert pour voiture.
qui Maskenblock en ist bleu, à gauche im Bild zur kontrolle.

Den Maskenblock lese je dans un Bereichsvariable c#.

avec dem Profanbefehl intersect(r, r1#, r2#) lese je comme erstes aus , si un Block berührt wird.
ensuite lese je qui masque aus , wohin qui Maskenfarbe bleu anfängt. si qui Maskenfarbe bleu trouvé ist, lese je par-dessus den Punkt aus si sich là qui la couleur des voiture est.

et avec Profan2Cpp ist es une wahre Wonne, de qui Geschwindigkeit her. si on ensuite wieder une ASM-Routine zur Auswertung dazwischenhängt wird encore plus rapide.
KompilierenMarqueSéparation
 $H Windows.ph
declare x1!,y1!,dx!,dy!,winkel!,y&,z&,z1&,z2&,z3&,groesse&
declare hWin&,hwin1&,hintergr&,hintergr1&,block&,blockhingr&,hintergrauto&
declare width&,height&,ende&,bild_auto&,wert&
declare bmi# ,ogl_rgb#,b#,c#,r1#,r2#
r1# = new(xpRect)
r2# = new(xpRect)
groesse&=64*64*4
dim b#,groesse&
dim c#,groesse&
dim ogl_rgb#,groesse&
wert&=groesse&
ende&=1
Window 20,20-800,600
Cls @RGB(220,220,220)
hWin& = @Create(text, %hwnd, Test1, 10, 10, 64,64)
hWin1& = @Create(text,%hwnd, Test2, 200, 10,500,500)
hintergr&=create(hnewpic,500,500,$00ffff)
hintergr1&=create(hnewpic,500,500,$00ffff)
block&=create(hnewpic,64,64,$000000)
blockhingr&=create(hnewpic,64,64,$000000)
bild_auto&=create(hnewpic,64,64,$00ff00)
startpaint blockhingr&
UsePen 0,1,@RGB(0,0,255)
UseBrush 1,@RGB(0,0,255)
Ellipse 10,10 - 50,50
endpaint
startpaint hwin&
drawpic blockhingr&,10,250;-1
endpaint
startpaint block&
UsePen 0,1,@RGB(0,255,0)
UseBrush 1,@RGB(0,255,0)
Ellipse 10,10 - 50,50
endpaint
oGL(Init, hwin&, 0,0, 0, 0)
oGL(PosMode, 1)
bild_auto& = Create(hnewPic,64,64,0 )
var tex.auto& = oGL(LoadTextureBMP,auto1.bmp,1)
mcls 64,64
height&=64
width&=64
bitmap_header
~GetDIBits(%hdc,blockhingr&,0,64,c#,bmi#,0)
drawglscene
drawglscene
oglzubmp
dx!=100
dy!=100
r2#.posx! = 300
r2#.posy! = 200
r2#.x! = 64
r2#.y! = 64
drawscene

WHILE ende&

    sleep 1

    if isKey(81)

        winkel!=winkel!+1.0
        drawglscene
        oglzubmp
        drawscene

    endif

    if isKey(69)

        winkel!=winkel!-1.0
        drawglscene
        oglzubmp
        drawscene

    endif

    if isKey(87)

        y1!=Sin((-winkel!)/180.0*pi())*2
        x1!=Cos((-winkel!)/180.0*pi())*2
        dx!=dx!-x1!
        dy!=dy!-y1!
        drawglscene
        oglzubmp
        drawscene

    endif

    if isKey(83)

        y1!=Sin((-winkel!)/180.0*pi())*2
        x1!=Cos((-winkel!)/180.0*pi())*2
        dx!=dx!+x1!
        dy!=dy!+y1!
        drawglscene
        oglzubmp
        drawscene

    endif

    if intersect(r, r1#, r2#)=1

        pixelausgabe

    endif

    StartPaint %hwnd
    DrawText 10,200,(Format$(######0      ,z&))
    endpaint

ENDWHILE

end

proc pixelausgabe

    ~GetDIBits(%hdc,hintergrauto&,0,64,b#,bmi#,0)

    whileloop 0,wert&,4

        z&=0
        z1&=byte(c#,&loop)

        if z1& > 240

            z1&=byte(b#,&loop)
            z2&=byte(b#,&loop+2)

            if (z1& > 200) or (z2& > 200)

                z&=255
                break

            endif

        ENDIF

    endwhile

endproc

proc oglzubmp

    ogl(glReadPixels,0,0,64,64,~GL_BGRA,~GL_UNSIGNED_BYTE,ogl_rgb#)
    ~setDIBits(%hdc,bild_auto&,0,64,ogl_rgb#,bmi#,0)
    startpaint -1
    drawpic bild_auto&,0,0;-1
    endpaint

endproc

proc drawglscene

    OGL(Clear)
    OGL(origin,0,0,-1.11)
    OGL(texture,tex.auto&,1)
    OGL(rotate,0,0,winkel!)
    OGL(quad,0.7,0.7)
    OGL(show)

endproc

proc drawscene

    startpaint hintergr&
    drawpic hintergr1&,0,0;0
    drawpic block&,300,200;-1
    mcopybmp 0,0 - 64,64 > dx!,dy!,-1
    r1#.posx! = dx!
    r1#.posy! = dy!
    r1#.x! = 64
    r1#.y! = 64
    endpaint
    startpaint hwin1&
    drawpic hintergr&,0,0;0
    endpaint
    hintergrauto&=create(hpiccopy,hintergr&,300,200,64,64)
    startpaint hwin&
    drawpic hintergrauto&,0,100;0
    endpaint

endproc

proc bitmap_header

    def &BI_RGB 0
    def &DIB_RGB_COLORS 0
    struct BITMAPINFOHEADER =
    biSize&, biWidth&, biHeight&, biPlanes%, biBitCount%, biCompression&,
    biSizeImage&, biXPelsPerMeter&, biYPelsPerMeter&, biClrUsed&, biClrImportant&
    dim bmi#,BITMAPINFOHEADER
    clear bmi#

    with bmi#

        .biSize&        = sizeof(bmi#)
        .biWidth&       = width&
        .biHeight&      = height&
        .biPlanes%      = 1
        .biBitCount%    = 32
        .biCompression& = &BI_RGB
        .biSizeImage&   = ((.biWidth& * .biBitCount%  8 - 1) | 3 + 1) * abs>(.biHeight&)

    endwith

endproc

 
07.03.2009  
 




Jac
de
Lad
Beim Effectuer des Codes stürzt mon System komplet ab.
 
Profan² 2.6 bis XProfan 11.1+XPSE+XPIA+XPRR (und irgendwann XIDE)
Core2Duo E8500/T2250, 8192/1024 MB, Radeon HD4850/Radeon XPress 1250, Vista64/XP
07.03.2009  
 



qui mag wohl XProfan pas....
Muss sur 32bit dans qui Grafik courir.
Ist avec XProfan11.1 erstellt.

je tippe, cela deiner qui OGL-Befehle de XProfan pas Travailler peux.
exposition là einmal.
Kennst du überhaupt OGL?

voiture1.bmp musst du de dessus encore reinladen.

c'est rien besonderes drin alles harmlose XProfan11-Befehle, sauf :

ogl(glReadPixels,0,0,64,64,~ GL_BGRA,~GL_UNSIGNED_BYTE,ogl_ rgb#)
~setDIBits(%hdc,bild_auto&,0,6 4,ogl_rgb#,bmi#,0)

cela mag wohl deiner pas, la fois Roland informer.

ou bien je achat dir den ordinateur ab...zum ersten ...1 Euro.

je peux sogar avec Profan2Cpp kompilieren. Habe Borland c 5.5.
Läuft Supi...
et si Profan2Cpp avec cela durchläuft, ensuite ist es wasserdicht.

mfg
 
07.03.2009  
 




Sebastian
König
dans dem Code ist soweit je cela vois réellement un kleiner faute, qui trop einem Absturz mener peux, mais pas muss (je hatte sur cela gleiche Problem déjà dans einem anderen Fil hingewiesen. ici ist es cela
KompilierenMarqueSéparation
whileloop 0,wert&,4re>
avec dem toujours un kleines Stück sur qui Bereichsgrenze (wert& = groesse&) hinaus gelesen wird...

Konkret: Im letzten Schleifendurchlauf hat &loop la valeur groesse&, cela &loop + irgendwas chez den Zugriffen peux ensuite Probleme faire.

MfG

Sebastian

Nachtrag:
Peter Bierbachh
et avec Profan2Cpp ist es une wahre Wonne, de qui Geschwindigkeit her.
[...]
et si Profan2Cpp avec cela durchläuft, ensuite ist es wasserdicht.


merci!
 
Windows XP, XProfan/Profan² 4.5 bis 11
Profan2Cpp-Homepage:  [...] 
Alte Profan²-Seite:  [...] 
07.03.2009  
 



répondre


Topictitle, max. 100 marque.
 

Systemprofile:

ne...aucune Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

s'il te plaît s'inscrire um une Beitrag trop verfassen.
 

Options du sujet

754 Views

Untitledvor 0 min.
Boroberto04.05.2016
Ernst02.03.2015
Lothar Dannhauer19.06.2012
Deli Beatz09.06.2012

Themeninformationen



Admins  |  AGB  |  Applications  |  Auteurs  |  Chat  |  protection des données  |  Télécharger  |  Entrance  |  Aider  |  Merchantportal  |  Empreinte  |  Mart  |  Interfaces  |  SDK  |  Services  |  Jeux  |  cherche  |  Support

un projet aller XProfaner, qui il y a!


Mon XProfan
Privé Nouvelles
Eigenes Ablageforum
Sujets-La liste de voeux
Eigene Posts
Eigene Sujets
Zwischenablage
Annuler
 Deutsch English Français Español Italia
Traductions

protection des données


Wir verwenden Cookies seulement comme Session-Cookies à cause de qui technischen Notwendigkeit et chez uns gibt es aucun Cookies de Drittanbietern.

si du ici sur unsere Webseite klickst ou bien navigierst, stimmst du unserer Erfassung de Informationen dans unseren Cookies sur XProfan.Net trop.

Weitere Informationen trop unseren Cookies et en supplément, comment du qui Kontrolle par-dessus behältst, findest du dans unserer nachfolgenden Datenschutzerklärung.


d'accordDatenschutzerklärung
je voudrais keinen Cookie