Forum | | | | | Habe jetz mal wieder eine Kollisionsroutine mit dem Auto erstellt. Als erstes wird das Kollisionsrechteck mit IntersectRect(rechteck1#,rechteck2#,rechteck3#) abgefragt. Wenn die Variable colli&=1 dann werden die Pixel nach Farbe abgefragt. Fast alles reine Profanbefehle ohne hinterecken. Mit Profan2Cpp wird es echt schnell. Es werden auch die Rechteckdaten ausgegeben welches von den beiden Kollionsrechtecken gebildet wird. Kann man auch noch gut zum Auswerten nehmen.
Dieses bitmap_header ist mir noch ein bisschen zu lang. Wie kann man da was einfaches kurzes reinsetzen? Gibt des dafür noch einen Profanbefehl?
mfg KompilierenMarkierenSeparieren $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) * abs(.biHeight&)
endwith
endproc
Auch wieder die ASM-Routine eingebaut zum Auswerten der Pixelfarbe. Läuft mit Profan2Cpp und dem Xpia: KompilierenMarkierenSeparieren $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&
If 0
AsmStart rgb_farbe
Parameters 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
.while 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
.if al>252
mov eax,255
.break
.endif
mov al,g
.if al>252
mov eax,255
.break
.endif
mov al,r
.if al>252
mov eax,255
.break
.endif
add ecx,4
.endw
AsmEnd(z&)
endif
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,$00f000)
bild_auto&=create(hnewpic,64,64,$00ff00)
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)
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
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&))
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#)
if 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(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) * abs(.biHeight&)
endwith
endproc
|
| | | | |
| | | jetzt habe ich die erweitert auf verschiedene Formen, nicht nur auf ein Viereck Habe es hier mit einem Kreis getestet.
Der Kollisionsblockkreis ist grün fürs Auto. Der Maskenblock davon ist blau, links im Bild zur kontrolle.
Den Maskenblock lese ich in eine Bereichsvariable c#.
Mit dem Profanbefehl intersect(r, r1#, r2#) lese ich als erstes aus , ob ein Block berührt wird. Dann lese ich die Maske aus , wo die Maskenfarbe blau anfängt. Wenn die Maskenfarbe blau gefunden ist, lese ich darüber den Punkt aus ob sich da die farbe des Auto befindet.
Und mit Profan2Cpp ist es eine wahre Wonne, von der Geschwindigkeit her. Wenn man dann wieder eine ASM-Routine zur Auswertung dazwischenhängt wird es noch schneller. KompilierenMarkierenSeparieren $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 Ausführen des Codes stürzt mein 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 ▲ |
| |
| | | Der mag wohl xprofan nicht.... Muss auf 32bit in der Grafik laufen. Ist mit XProfan11.1 erstellt.
Ich tippe, das deiner die OGL-Befehle von XProfan nicht bearbeiten kann. Schau da einmal. Kennst du überhaupt OGL?
auto1.bmp musst du von oben noch reinladen.
Es ist nichts besonderes drin alles harmlose XProfan11-Befehle, außer :
ogl(glReadPixels,0,0,64,64,~ GL_BGRA,~GL_UNSIGNED_BYTE,ogl_ rgb#) ~setDIBits(%hdc,bild_auto&,0,6 4,ogl_rgb#,bmi#,0)
Das mag wohl deiner nicht, mal Roland informieren.
Oder ich kauf dir den Computer ab...zum ersten ...1 Euro.
Ich kann sogar mit Profan2Cpp kompilieren. Habe Borland c 5.5. Läuft Supi... Und wenn Profan2Cpp damit durchläuft, dann ist es wasserdicht.
mfg |
| | | | |
| | Sebastian König | In dem Code ist soweit ich das sehe tatsächlich ein kleiner Fehler, der zu einem Absturz führen kann, aber nicht muss (ich hatte auf das gleiche Problem schon in einem anderen Thread hingewiesen. Hier ist es das KompilierenMarkierenSeparieren mit dem immer ein kleines Stück über die Bereichsgrenze (wert& = groesse&) hinaus gelesen wird...
Konkret: Im letzten Schleifendurchlauf hat &loop den Wert groesse&, das &loop + irgendwas bei den Zugriffen kann dann Probleme machen.
MfG
Sebastian
Nachtrag: Peter Bierbachh
Und mit Profan2Cpp ist es eine wahre Wonne, von der Geschwindigkeit her. [...] Und wenn Profan2Cpp damit durchläuft, dann ist es wasserdicht.
Danke! |
| | | | |
|
AntwortenThemenoptionen | 729 Betrachtungen |
ThemeninformationenDieses Thema hat 3 Teilnehmer: |