ImageRectCollide ersetzen

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

Bobbleboy

Betreff: ImageRectCollide ersetzen

BeitragSo, Dez 27, 2009 5:23
Antworten mit Zitat
Benutzer-Profile anzeigen
der befehl "ImageRectCollide" erzeugt des öfteren mav's, die sufu hat nichts ergeben...

ja mir is bewusst, das das thema in den faqs "behandelt" wird, jedoch nur für rects overlap und nicht collide. rects overlap ist immer true, wenn das rechteck im bild drin ist, auch wenn es "nur" mit der maskimage farbe zusammengestoßen ist.

genaue kollision eines einzellnen pixels mit einem bild würde mir auch weiter helfen!

hier der code in dem ich es benutze, falls er relevant sein sollte. (nur ein ausschnitt, nicht der gesamte code, sollte was fehlen, liefer ich gerne nach xD )

BlitzBasic: [AUSKLAPPEN]

;___________gegner
For z = Each zomb
;___________wegfinden
;___________bei space zu bob
If KeyDown(57)
z\x=a\x
z\y=a\y
End If
;___________koordinaten von nase etc.
naseb=1
naseh=1
z\nasex = z\x+(z\xspeed*4)
z\nasey = z\y+(z\yspeed*4)
If Sqr((z\zielx-z\x)^2+(z\ziely-z\y)^2) > 2
z\winkel=ATan2((z\ziely-z\y),(z\zielx-z\x))
If z\winkel <0
z\winkel=z\winkel +360
End If
z\xspeed#=z\s# * Cos(z\winkel)
z\yspeed#=z\s# * Sin(z\winkel)
z\x = z\x + z\xspeed#
z\y = z\y + z\yspeed#
End If
;___________ziel der zombies
z\zielxtemp = a\x
z\zielytemp = a\y
If Sqr((z\zielx-z\x)^2+(z\ziely-z\y)^2) < 2
z\zielx = z\zielxtemp
z\ziely = z\zielytemp
EndIf
If ImageRectCollide(map, 1, 1, Rect, z\nasex,z\nasey,naseb,naseh)
k=5
n=1
i=0
Repeat
i=i+1
n=n*(-1)
z\nasex = z\x+Cos(z\winkel+n*i)*k
z\nasey = z\y+Sin(z\winkel+n*i)*k
If i=360
i=0
k=k+1
EndIf
Until ImageRectCollide(map, 1, 1, Rect, z\nasex,z\nasey,naseb,naseh)=0
z\zielx = z\nasex
z\ziely = z\nasey
End If
;___________wegfinden ende
w2=ATan2((z\zielytemp-z\y),(z\zielxtemp-z\x))/5
If w2 <0
w2=w2+72
EndIf
DrawImage zombieturn(w2),z\x,z\y


Edit anstatt doppelpost:
liege ich richtig mit der annahme, das man dies nur bewerkstelligen könnte, indem man das bild scannt und als array speichert, um dann damit eine kollision zu prüfen?
sollte ich es hinbekommen, werde ich den ersatzcode hier posten.

2ter edit statt doppelpost:
hab die nacht durchgedacht und hier ist mein bisheriger code:
BlitzBasic: [AUSKLAPPEN]

AppTitle("kollision")
timer = CreateTimer(60)
Graphics 500,200,0,2
SetBuffer BackBuffer()

Global b= LoadImage("b.bmp")
Global b2 = LoadImage("b2.bmp")
MidHandle b
MidHandle b2

Dim map(1,1)

tilemapping(b,1);wie ermittel ich die maskcolor, bzw was ist die maskcolor "schwarz" als integerwert? hab hier einfach eine 1 genommen, damit das programm erstmal läuft!
While Not KeyDown(1)
Cls


For u=1 To 10
For p=1 To 10
Print map (u,p) ;map(u,p) ist bei mir immer 0
Next
Next



Flip 0
WaitTimer timer
Wend
End

Function tilemapping(bild,maskcolor)
y=ImageHeight(bild)
x=ImageWidth(bild)
tilebreite = 10
tilehohe = 10
tileX=x/tilebreite ;in meinem beispiel ist das ungefähr 13, das bild ist quadratisch
tileY=y/tilehohe
Dim map(tilex,tiley)
Cls
DrawImage bild ,0,0
LockBuffer
For i=1 To tilex ;sind diese "for next" schleifen sinnvoll?
For j=1 To tiley
For b = 0 To tilebreite
For h = 0 To tilehohe
If ReadPixelFast(b,h) <> maskcolor ;ist diese if bedingung richtig?
map(i,j)=1
Else
map(i,j)=0
EndIf
Next
Next
Next
Next
UnlockBuffer
Cls
Return
End Function


ich gehe jetzt schlafen, ich hoffe jemand erbahnt sich mir und beantortet mir meine kommentare im code, oder bringt mir auf andersartig die erleuchtung.

Nicdel

BeitragSo, Dez 27, 2009 10:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn ich nach ImagesCollide suche ist das das 6. Ergebnis:
https://www.blitzforum.de/foru...hp?t=27025
Da sind auch Ersatzfunktionen drin.
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7
 

Bobbleboy

BeitragMo, Dez 28, 2009 2:13
Antworten mit Zitat
Benutzer-Profile anzeigen
Nicdel hat Folgendes geschrieben:
Wenn ich nach ImagesCollide suche ist das das 6. Ergebnis:
https://www.blitzforum.de/foru...hp?t=27025
Da sind auch Ersatzfunktionen drin.


siehe

Zitat:
ja mir is bewusst, das das thema in den faqs "behandelt" wird, jedoch nur für rects overlap und nicht collide. rects overlap ist immer true, wenn das rechteck im bild drin ist, auch wenn es "nur" mit der maskimage farbe zusammengestoßen ist.
 

BIG BUG

BeitragMo, Dez 28, 2009 3:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Du musst einfach ein bisschen tiefer in besagtem Thread kucken, da ist auch eine Ersatzfunktion für ImagesCollide.
B3D-Exporter für Cinema4D!(V1.4)
MD2-Exporter für Cinema4D!(final)

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Dez 28, 2009 3:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Bobbleboy hat Folgendes geschrieben:
ja mir is bewusst, das das thema in den faqs "behandelt" wird, jedoch nur für rects overlap und nicht collide. rects overlap ist immer true, wenn das rechteck im bild drin ist, auch wenn es "nur" mit der maskimage farbe zusammengestoßen ist.

Das ist falsch, da in dem besagtem FAQ kein Ersatz für RectsOverlap sondern ImagesVollide gesprochen wird. Es ist zwar kein ''Ersatz'' dafür im technischem Sinn, aber in einem Spiel eine bessere Alternative als das ''Original'' mit ImagesCollide.

In der FAQ wird erklärt, dass eine genau pixelgenaue Kollisionsabfrage nonsen ist. Ein Spiel soll in erster Linie Spaß machen, und wenn dann pingelig auf jeden Pixel Bezug genommen wird, schalte ich schon meistens gleich ab. Für ein wohlhabendes Spiel ist die FAQ ideal anzuwenden. Sogar dann besser, als wenn es keine Probleme mit ImagesCollide geben würde.

- - -

Für die Kollisionsabfrage eines Pixels auf einem Bild kann man mit ReadPixel arbeiten. Pixelposition minus die Position des Bildes, und schon hat man den Farbcode der, wenn er ungleich Maskimage ist, als Kollision gewertet werden sollte.

Solltest du nun auf die grandiose Idee gekommen sein, einen eigenen ImagesCollide -Funktionsersatz zu schreiben, dann sei dir gesagt, dass kaum einer seine volle Systemrecourcen für ein billiges Spiel verbraten möchte. Auch ''fühlt'' sich so ein Spiel nicht so gut. Also nimm den Rat an und mach es wie bei der FAQ erklärt wurde.
Wink
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Bobbleboy

BeitragMo, Dez 28, 2009 4:55
Antworten mit Zitat
Benutzer-Profile anzeigen
die kollisions abfrage brauche ich nicht für ein jump and run game. es ist für einen bot, der sich in der map bewegen soll, die ich vorher lade.

mir ist bewusst das bei einem supermario klon eine pixelgenaue kollisions sinnlos ist.

danke für die antwort mit dem readpixel, hätt man ja eigenlich selbst dra kommen könnnen Very Happy
beantwortest hiermit meine eingangsfrage:

Zitat:
genaue kollision eines einzellnen pixels mit einem bild würde mir auch weiter helfen!
.

TimBo

BeitragMo, Dez 28, 2009 12:16
Antworten mit Zitat
Benutzer-Profile anzeigen
du könntest noch deinen Roboter mit Vektoren (also mit Lines) ummalen.
Wenn du dann noch die Map mit diesen Lines ummalst, dann könntest du LineIntersect benutzen.
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.
 

Bobbleboy

BeitragMo, Dez 28, 2009 21:16
Antworten mit Zitat
Benutzer-Profile anzeigen
die map mit lines ummalen?
geplant ist ein bot, der durch verschiedene level laufe kann, die von anderen gezeichnet sind.
also er kann nicht viel, nur darauf zulaufen und im besten fall eine wand umgehen, aber ich bin stolz auf ihn Very Happy

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMo, Dez 28, 2009 22:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Bot ist ein etwas besserer normale Computergegner der sonst so durch die Gegend rumhüpft. Ein Spiel ob 2D von der Seite (z.B. Mario) oder topdown (z.B. Pacman) unterscheidet nicht wirklich die Notwendigkeit eines Unterschiedes bei der Kollisionsabfrage. Wirklich!

Wenn dein Bot nun nicht eine drehende Ungestallt eines Länglichen etwas ist, dann würde ich die FAQ noch einmal komplett durchlesen und dabei den Unterschied des Beschriebenen Mario auf eine Pacman -Sicht außer Acht lassen. Ansonsten wäre eine Linienkollision die Alternative. Diese jedoch erfordert einiges an Mehraufwand bei der Programmierung und wird nur in seltenen Fällen bessere Resultate liefern (drehende Ungestallt eines Länglichen etwas zum Beispiel).

Sonst kannst du hier auch mal ein Screencapture einpflegen, damit uns allen klar wird was nun das Ziel zur Lösung deines Problems ist. Denn dann kann man dir auch am besten helfen. Sind ja nicht nur Idioten hier im Forum unterwegs. Wink Von den Leuten die hier bisher versucht haben dir zu helfen sind schon gute Leute denen ich eine qualifizerte Aussage in diesem Bereich durchaus zutraue. Also mit Screen gehts ganz einfach einfacher und schneller. Exclamation
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Bobbleboy

BeitragDi, Dez 29, 2009 16:44
Antworten mit Zitat
Benutzer-Profile anzeigen
http://img189.imageshack.us/im...gamewa.jpg

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDi, Dez 29, 2009 17:18
Antworten mit Zitat
Benutzer-Profile anzeigen
ok, also das Problem ist, du benutzt offensichtlich ein geladenes Bild als Hintergrund, auf welches nun eine Kollisionsabfrage gemacht werden soll. Das eigendliche Problem dabei ist, wenn man nun ImagesCollide benutzen würde, das der arme Computer nun für jeden Bot einzelnd jedes Frame mit fast einer Million Pixel * Bot Breite * Höhe überprüfen muß. So werden keine Spiele gemacht, da man ein schnellen Rechner dafür benötigt, der sonst mit den neusten Entwiklungen aus der kommerziellen Ebene noch klar kommt.

Lösung: Erstelle deine Map mittels einzelner Tiles. Das könnten zum Beispiel 32x32 kleine Tiles sein. Auf der selben Ebene kommt dann eine unsichtbare Kollisionsmap 1/0, auf welche dann eine Kollision berechnet werden kann. Selbst beim benutzen vom ImagesCollide müsste man so vorgehen, um Recourcen zu sparen. Die Zeit wo immer weiter die Rechnerleistung ansteigt ist, seit es die Netbooks gibt, auf einem Schlag auf ein Minimum gesunken. Das gilt es zu berücksichtigen. Ansonsten hätte ich auch kaum Lust mein neuen Rechner rauchen zu sehen, bei einem so einfachen 2D-Spiel.

Eine statische Tilemap ist im übrigen mit 5 Codezeilen gezeichnet. Zusätzlich braucht man 7 Zeilen Code zum laden einer Tilemap. Ein einfacher Editor ist mit ~50 Zeilen Code geschrieben. Dieser kann dann Maps laden und speichern.

Eine scrollende Tilemap die ganze Tiles abscrollt ist mit nur zwei Zusatzvariablen gemacht.

Eine pixelgenau scrollende Tilemap wird allerdings etwas komplizierter, aber bleibt im Rahmen.

- - -

Hast du dann eine Tilemap gemacht, kannst du die Bot/Spieler -Positionen direkt auf der Tilemap gegenrechnen. Dazu überprüfst du dann nur noch die 4 möglichen Tiles auf Kollisions eines Bots, was bei Tiles von 32x32 nur 64x53 Pixel gegen ein Bot geprüft wird. Der Rechner und die Spieler werden es dir danken.

Über Tilemaps gibt es hier im Forum viel Wissenswertes. Ansonsten wird dir auch hier gerne weiter geholfen. Aber ich persönlich kann dir nur davon abraten mit einem geladenem Bild so ein Spiel zu machen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Bobbleboy

BeitragMi, Dez 30, 2009 5:10
Antworten mit Zitat
Benutzer-Profile anzeigen
vielen dank für die antwort.
ich werde sie beherzigen.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragMi, Dez 30, 2009 9:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich wunder mich grad selbst über meine schlechte Aussagekraft im vorherigen Beitrag. Und da ich das so nicht stehen lassen kann, will ich mal ein Beispielcode abgeben, der das beschriebene sehr vereinfacht veranschaulicht.

Code: [AUSKLAPPEN]
Graphics 1024,768,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(58)

Dim Map(31,23)

Local MX,MY
Local X,Y


;ZUFALLSMAP/ERSTELLEN
For Y=0 To 23
   For X=0 To 31
      Map(X,Y)=Rand(255)
   Next
Next


While Not KeyHit(1)
   
   MX=MouseX()-16
   MY=MouseY()-16
   
   ;MAP/ZEICHNEN
   For Y=0 To 23
      For X=0 To 31
         Color Map(X,Y),0,0
         Rect X*32,Y*32,32,32,1
      Next
   Next
   
   ;FIGURPOSITION/EINZEICHNEN
   Color 255,255,0
   Rect MX,MY,32,32,1
   
   ;ZU/PRÜFENDE/KOLLISIONSEINGRENZUNG
   Color 255,255,255
   For Y=0 To 1
      For X=0 To 1
         Rect (X+MX/32)*32,(Y+MY/32)*32,32,32,0
      Next
   Next
   
   WaitTimer Timer
   Flip 0
   Cls
Wend
End

Oder auch ein etwas anderer möglicher Lösungsweg:

Code: [AUSKLAPPEN]
Graphics 1024,768,0,2
SetBuffer BackBuffer()

Local Timer=CreateTimer(58)

Dim Map(31,23)

Local MX,MY
Local X,Y


;ZUFALLSMAP/ERSTELLEN
For Y=0 To 23
   For X=0 To 31
      If Rand(9)>7 Then Map(X,Y)=Rand(255)
   Next
Next


While Not KeyHit(1)
   
   MX=MouseX()
   MY=MouseY()
   
   ;MAP/ZEICHNEN
   For Y=0 To 23
      For X=0 To 31
         If Map(X,Y)>0 Then
            Color Map(X,Y),0,0
            Rect X*32,Y*32,32,32,1
         End If
      Next
   Next
   
   ;FIGURPOSITION/EINZEICHNEN
   Color 255,255,0
   Rect MX-32,MY,64,1,1
   Rect MX,MY-32,1,64,1
   
   ;KOLLISIONSERKENNUNG
   If Map(MX/32,MY/32)>0 Then
      Color 255,255,255
      Rect (MX/32)*32,(MY/32)*32,32,32,0
   End If
   
   WaitTimer Timer
   Flip 0
   Cls
Wend
End

Beide Codes sind selständig Lauffähig. Jedoch ist der erste eher was für ImageRectCollide, ImageRectOverlap oder RectsOverlap. Der zweite Code zeigt eine Punktkollision auf die Maptiles.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D
 

Bobbleboy

BeitragMi, Dez 30, 2009 11:02
Antworten mit Zitat
Benutzer-Profile anzeigen
wow ich bin überwältigt von der hilfsbereitschaft

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group