[GELÖST] ImageCollide2 Probleme mit CreateImage()?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: [GELÖST] ImageCollide2 Probleme mit CreateImage()?

BeitragMo, Jan 25, 2016 20:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich habe da mal eine Frage: Für ein Projekt brauche ich eine Kollisionsabfrage. Diese realisiere ich mit ImagesCollide2(). Beide Bilder, die ich überprüfe, werden mit CreateImage() erstellt und gehen jeweils auf unterschiedliche Rechtecke zurück. Beide Bilder werden nicht angezeigt, was auch so sein soll. Eine Debugprüfung mit malen der Bilder hat ergeben, dass Position und Rotation der Bilder korrekt sind - Trotzdem liefert ImagesCollide2() selbst bei Überlappung beider Bilder False zurück. Die Frage ist: Warum ist das so? Hat ImagesCollide2() ein Problem mit den via CreateImage() erstellten Bildern? Liegt es eventuell an der MaskColor, welche ich auf 255, 0, 255 gestellt habe? Oder am veränderten ImageHandle?
Da ich nicht meinen ganzen Code hier posten kann (er ist immerhin 22 kB groß), hier ein Code, der prinzipiell dasselbe tut BlitzMax: [AUSKLAPPEN]
Type TRect
Field X:Int
Field Y:Int
Field W:Int
Field H:Int
Field HanX:Int
Field HanY:Int
Field Rot:Double
Field Image:TImage

Function Create:TRect(X:Int, Y:Int, W:Int, H:Int)
Local RetVal:TRect = New TRect
RetVal.X = X
RetVal.Y = Y
RetVal.W = W
RetVal.H = H
RetVal.HanX = 0
RetVal.HanY = 0
RetVal.Rot = 0
RetVal.Image = Null
Return RetVal
End Function

Method SetImgHandle(HanX:Int, HanY:Int)
If (HanX < 0 Or HanX >= Self.W) Then Return
If (HanY < 0 Or HanY >= Self.H) Then Return

Self.HanX = HanX
Self.HanY = HanY
End Method

Method SetRot(Rot:Double)
Self.Rot = Rot
If (Self.Rot > 360)
Self.Rot = Self.Rot Mod 360
EndIf
End Method

Method Draw()
Local PrevRot:Double = GetRotation()
SetRotation(Self.Rot)
DrawRect(Self.X, Self.Y, Self.W, Self.H)
SetRotation(PrevRot)
End Method

Method GetImage:TImage()
If (Self.Image = Null)
Self.Image = CreateImage(Self.W, Self.H)
EndIf

SetImageHandle(Self.Image, Self.HanX, Self.HanY)

Return Self.Image
End Method
End Type

SeedRnd(MilliSecs())

Graphics(800, 600)

SetMaskColor(255, 0, 255)

Local Rect1:TRect = TRect.Create(0, 300, 50, 100)
Rect1.SetImgHandle(25, 75)
Rect1.SetRot(Rand(0, 360))

Local Rect2:TRect = TRect.Create(400, 300, 50, 100)
Rect2.SetImgHandle(25, 75)
Rect2.SetRot(Rand(0, 360))

Local Rect1X:Int = 0
Local Rect2X:Int = 0

Local FPS:TTimer = CreateTimer(60)

Repeat
WaitTimer(FPS)
Cls()

If (KeyDown(KEY_A))
If (Rect1X > 0)
Rect1X = Rect1X - 1
EndIf
EndIf
If (KeyDown(KEY_D))
If (Rect1X < 800)
Rect1X = Rect1X + 1
EndIf
EndIf

If (KeyDown(KEY_LEFT))
If (Rect2X > 0)
Rect2X = Rect2X - 1
EndIf
EndIf
If (KeyDown(KEY_RIGHT))
If (Rect2X < 800)
Rect2X = Rect2X + 1
EndIf
EndIf

Rect1.X = Rect1X
Rect2.X = Rect2X

DrawText("Collision: " + ImagesCollide2(Rect1.GetImage(), Rect1.X, Rect1.Y, 0, Rect1.Rot, 1, 1, Rect2.GetImage(), Rect2.X, Rect2.Y, 0, Rect2.Rot, 1, 1), 0, 0)

Rect1.Draw()
Rect2.Draw()

Flip(0)
Until KeyHit(KEY_ESCAPE)
End


P.S.: Meine Grafikkarte ist eine Nvidia Geforce GTX 750 Ti (Ich glaube es gab ja Probleme mit einigen Karten und ImagesCollide2? Oder war das nur in BlitzBasic?)
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
  • Zuletzt bearbeitet von CO2 am Mi, Jan 27, 2016 14:47, insgesamt einmal bearbeitet

Midimaster

BeitragDi, Jan 26, 2016 10:46
Antworten mit Zitat
Benutzer-Profile anzeigen
So wird das nix... Es genügt nicht das Bild mit ImageCreate() zu erstellen. Dies erzeugt nur ein leeres Bild mit den gewünschten Ausmaßen. Es enthält keine Pixel und führt daher auch niemal zu einer erfolgreichen Kollision. Bei ImageCollide() werden nur existierende Pixel gecheckt.
BlitzMax: [AUSKLAPPEN]
SuperStrict
Graphics 600,400

SetColor 255,0,0
Local tri#[]=[0.0,0.0,50.0,50.0,0.0,50.0]
DrawPoly tri
DrawLine 0,0,99,0
DrawLine 99,0,99,50
Global I:TImage=CreateImage(100,100)
GrabImage I,0,0
Cls

Global J:TImage=CreateImage(100,100)
SetColor 0,255,0
DrawOval 50,50,25,25
GrabImage J,0,0
SetColor 255,255,255
Global X%=310,Y%=190
Repeat
Cls
Select True
Case KeyDown(KEY_LEFT)
X=X-1
Case KeyDown(KEY_RIGHT)
X=X+1
Case KeyDown(KEY_UP)
Y=Y-1
Case KeyDown(KEY_DOWN)
Y=Y+1
End Select

DrawImage I,X,Y
DrawImage J,300,150
DrawText "Press Arrow Keys to move the triangle.",50,50
DrawText "Collision: " + ImagesCollide2(I, X, Y, 0, 0, 1, 1, J, 300, 150, 0, 0, 1, 1),50,80
Flip
Until KeyHit (KEY_ESCAPE)
Gewinner des BCC #53 mit "Gitarrist vs Fussballer" http://www.midimaster.de/downl...ssball.exe
 

CO2

ehemals "SirMO"

BeitragDi, Jan 26, 2016 18:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielen Dank, das war die Lösung!

Für alle, die es benötigen, die Methode TRect.GetImage() muss wie folgt aussehen BlitzMax: [AUSKLAPPEN]
'...
Method GetImage:TImage()
If (Self.Image = Null)
Self.Image = CreateImage(Self.W, Self.H)
Local Pix:TPixmap = LockImage(Self.Image)
ClearPixels(Pix, $FFFFFFFF)
UnlockImage(Self.Image)
EndIf

SetImageHandle(Self.Image, Self.HandleX, Self.HandleY)

Return Self.Image
End Method
'...
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group