Forum | | | | | 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
|
| | | | |
| | | 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
|
| | | | |
| | 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 |
| | | | |
| | 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 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! |
| | | | |
|
répondreOptions du sujet | 753 Views |
Themeninformationencet Thema hat 3 participant: |