ImageRectCollide ersetzen
Übersicht

BobbleboyBetreff: ImageRectCollide ersetzen |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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]
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]
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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) |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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. ![]() |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Bobbleboy |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() beantwortest hiermit meine eingangsfrage: Zitat: genaue kollision eines einzellnen pixels mit einem bild würde mir auch weiter helfen! .
|
||
![]() |
TimBo |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() ![]() |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
Bobbleboy |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
http://img189.imageshack.us/im...gamewa.jpg | ||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
vielen dank für die antwort.
ich werde sie beherzigen. |
||
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
wow ich bin überwältigt von der hilfsbereitschaft | ||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group