Manuelles ImagesCollide
Übersicht

![]() |
TravisBetreff: Manuelles ImagesCollide |
![]() Antworten mit Zitat ![]() |
---|---|---|
Für ein zukünftiges Projekt, habe ich schon mal eine neue Kollisionsprüfung entwickelt, die ohne Imagescollide arbeitet.
Dabei wird für jedes Bild ein Array angelegt, welches für jeden Pixel eine Information enthält, ob und wie er bei der Kollisionsabfrage berücksichtigt werden soll. Das hat den Vorteil, dass man die Koordinaten jedes Pixels, das kollidiert bestimmen kann. Außerdem kann man mehrere Arten von Aktionen bei der Bildkollision ausführen, wenn man im Kollisions-Array noch andere Werte als Null und Eins eintragen würde. Außerdem kann man auch die Stärke der Kollision bestimmen, indem man einfach die kollidierten Pixel zählt. Vielleicht kann es ja außer mir noch einer gebrauchen. Mir wird es bei meinem nächsten Projekt jedenfalls sehr hilfreich sein. ![]() Code: [AUSKLAPPEN] Global ResX = 640 Global ResY = 480 Graphics ResX,ResY,16,2 AppTitle "Manuelle Kollision by Travis" Text (ResX/2)-40,ResY/2, "Please wait...": Flip ; --- Spielergrafiken --- SpielerGfx = CreateImage(30,20) SetBuffer ImageBuffer(SpielerGfx) Line 0,0,0,19 Line 0,0,29,10 Line 0,19,29,10 ScaleImage SpielerGfx, .5,.5 Dim Spieler(360) For i = 0 To 359 Spieler(i) = CopyImage(SpielerGfx) RotateImage Spieler(i), i MidHandle Spieler(i) MaskImage Spieler(i), 0,0,0 Next ; --- Spielergrafiken --- ; --- Mapgrafik erstellen --- Global Map = CreateImage(ResX, ResY) SetBuffer ImageBuffer(Map) Color 0,0,200 Rect 0,0,ResX,ResY,1 Color 0,0,0 Oval 0,0,ResX,ResY,1 Color 0,0,200 Rect 50, (ResY/2)-10, ResX-100,20,1 Color 0,0,200 Rect (ResX/2)-10, 50, 20, ResY-100 SetBuffer BackBuffer() ; --- Mapgrafik erstellen --- ; ------ Kollisions Maps für Spieler erstellen ------ ; Maximale Bilddimensionen ermitteln (für Array) For i = 0 To 359 w = ImageWidth(Spieler(i)) h = ImageHeight(Spieler(i)) If w > maxw Then maxw = w If h > maxh Then maxh = h Next Dim KollisionSpieler(360,MaxW,MaxH) Dim KollisionSpielerW(360) Dim KollisionSpielerH(360) For i = 0 To 359 w = ImageWidth(Spieler(i)) h = ImageHeight(Spieler(i)) KollisionSpielerW(i) = w KollisionSpielerH(i) = h For y = 0 To h For x = 0 To w rgb = ReadPixelFast(x,y,ImageBuffer(Spieler(i))) If rgb = -16777216 Then KollisionSpieler(i,x,y) = 0 If rgb <> -16777216 Then KollisionSpieler(i,x,y) = 1 Next Next ; -- zur Kontrolle anzeigen --- VisualSpieler = CreateImage(w,h) LockBuffer ImageBuffer(VisualSpieler) For y = 0 To h For x = 0 To w If KollisionSpieler(i,x,y) = 1 Then WritePixelFast(x,y,$CC0000,ImageBuffer(VisualSpieler)) Next Next UnlockBuffer ImageBuffer(VisualSpieler) SetBuffer BackBuffer() Cls Text 0,0, "Erzeuge Kollisions-Maps für die Spielergrafiken... " + i + "/359" Color 255,000,000: Text 0,15, "Kollisions-Map Spieler" Color 255,255,255: Text 0,30, "Spielerbild" DrawImage Spieler(i), 50,100 DrawImage VisualSpieler, 100-KollisionSpielerW(i)/2, 100-KollisionSpielerH(i)/2 Flip ; -- zur Kontrolle anzeigen --- Next ; ------ Kollisions Maps für Spieler erstellen ------ ; --- Kollisions Map für Hintergrund erstellen --- w = ImageWidth(Map) h = ImageHeight(Map) Dim KollisionMap(w,h) LockBuffer ImageBuffer(Map) For y = 0 To h For x = 0 To w rgb = ReadPixelFast(x,y,ImageBuffer(Map)) If rgb = -16777216 Then KollisionMap(x,y) = 0 If rgb <> -16777216 Then KollisionMap(x,y) = 1 Next Next UnlockBuffer ImageBuffer(Map) ; --- Kollisions Map für Hintergrund erstellen --- ; --- Spieler erstellen --- Type Spieler Field x#,y#,sx#,sy#,winkel End Type s.spieler = New spieler s\x = 200 s\y = 120 s\winkel = 270 ; --- Spieler erstellen --- ; --- Hauptschleife --- SetBuffer BackBuffer() Repeat Cls DrawImage Map, 0, 0 UpdateSpieler() If KeyHit(57) Then s\sy = 0: s\sx=0 ; SPACE - Spieler anhalten Text 0,0, "Use arrow keys to move. Use Space to stop." Flip 1 Until KeyHit(1) End ; --- Hauptschleife --- ; --- Spieler aktualisieren --- Function UpdateSpieler() s.spieler = First spieler ; Beschleunigen If KeyDown(200) Then s\sx# = s\sx# + Cos(s\winkel) * .01 s\sy# = s\sy# + Sin(s\winkel) * .01 EndIf ; Abbremsen If KeyDown(208) Then s\sx# = s\sx# - Cos(s\winkel) * .01 s\sy# = s\sy# - Sin(s\winkel) * .01 EndIf ; Links If KeyDown(203) Then s\winkel = s\winkel - 2 EndIf ; Rechts If KeyDown(205) Then s\winkel = s\winkel + 2 EndIf ; Winkelkorrektur If s\winkel < 0 Then s\winkel = 359 If s\winkel > 359 Then s\winkel = 0 ; Bewegung s\x# = s\x# + s\sx# s\y# = s\y# + s\sy# ; Bildschirmgrenzen If s\x < 0 Then s\x = ResX If s\x > ResX Then s\x = 0 If s\y < 0 Then s\y = ResY If s\y > ResY Then s\y = 0 ; Schiff anzeigen DrawImage Spieler(s\winkel), s\x, s\y ; Kollisionsabfrage For y = 0 To KollisionSpielerH(s\winkel)-1 For x = 0 To KollisionSpielerW(s\winkel)-1 If x+s\x-(KollisionSpielerW(s\winkel)/2) > 0 And x+s\x-(KollisionSpielerW(s\winkel)/2) < ResX Then ; Keine ungültigen Werte im Array prüfen If y+s\y-(KollisionSpielerH(s\winkel)/2) > 0 And y+s\y-(KollisionSpielerH(s\winkel)/2) < ResY Then ; Keine ungültigen Werte im Array prüfen If KollisionSpieler(s\winkel, x, y) = 1 Then If KollisionMap(x+s\x-KollisionSpielerW(s\winkel)/2, y+s\y-KollisionSpielerH(s\winkel)/2) = 1 Then Text 100,270, "(es wird nur ein Kollisionspunkt pro Bild angezeigt)" Text 150,240, "KOLLISION AM SPIELERBILD: " + x + " " + y Text 150,250, "KOLLISION AM MAPBILD : " + (x+s\x-KollisionSpielerW(s\winkel)/2) + " " + (y+s\y-KollisionSpielerH(s\winkel)/2) Color 0,255,0:Plot (x+s\x-KollisionSpielerW(s\winkel)/2), (y+s\y-KollisionSpielerH(s\winkel)/2) ; Kollisionspunkt im Bild anzeigen Goto NurEinKoordinatenPaarErmitteln EndIf EndIf EndIf EndIf Next Next ; Kollisionsabfrage .NurEinKoordinatenPaarErmitteln End Function ; --- Spieler aktualisieren --- [mod] CodeTags gefixt. BladeRunner[/mod] |
||
www.funforge.org
Ich hasse WASD-Steuerung. Man kann alles sagen, man muss es nur vernünftig begründen können. |
judosBetreff: fehler |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
bei mir löst dieses programm immer ein fehler aus :
blitzcc hat in kernel32.dll einen fehler verursacht... warum erscheint bei mir diese Fehler meldung ??? |
||
![]() |
Mooch |
![]() Antworten mit Zitat ![]() |
---|---|---|
For y = 0 To h
For x = 0 To w rgb = ReadPixelFast(x,y,ImageBuffer(Spieler(i))) If rgb = -16777216 Then KollisionSpieler(i,x,y) = 0 If rgb <> -16777216 Then KollisionSpieler(i,x,y) = 1 Next Next ist falsch (auf manchen systemen funzt es) For y = 0 To h-1 For x = 0 To w-1 rgb = ReadPixelFast(x,y,ImageBuffer(Spieler(i))) If rgb = -16777216 Then KollisionSpieler(i,x,y) = 0 If rgb <> -16777216 Then KollisionSpieler(i,x,y) = 1 Next Next so gehts bestimmt auch auf judos pc ![]() |
||
Pentium IV 3.0Ghz; nVidia Geforce 6800;
Microsoft Windows XP Home SP2; BlitzBasic 3D .:: Sites ::. .:: http://www.fl4sh-clan.de/ ::. |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group