Autor Beitrag
adrian92
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 06.06.13 20:12 
hallo zusammen!

ich habe folgendes Problem:

ich habe eine picturebox, welche sich über meine oberfläche bewegt( von links nach rechts über 10000 pixel lang) auf dieser sind schwarzumrandete hindernisse. diese sollen von einer 2 picturebox umgangen werden. nun zu meinem problem:

zu allererst hatte ich einmal vor, dass die picturebox nicht einfach durch diese hindernisse hindurchfliegt.

dies wollte ich dadurch lösen, dass die picturebox nicht durch die schwarze fläche "gehen"kann
folgender code:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Bitmap suchbild = (Bitmap)flur;

for (int x = suchfenster.X; x < suchfenster.X + suchfenster.Width; x++)
    for (int y = suchfenster.Y; y < suchfenster.Y + suchfenster.Height; y++)
        if (x >= 0 && y >= 0 && x < suchbild.Width && y < suchbild.Height)
        {
            farbe = suchbild.GetPixel(x, y);
            if (farbe.G < 100 && farbe.B < 100)
                bumm = true;
        }

return bumm;

jedoch funktioniert dies nicht für die picturebox die durch die oberfläche läuft sondern nur für das hintergrundbild(backgroundimage)

hoffe ich konnte mein problem einigermaßen verständnisvoll erklären
mit freundlichen grüßen
adrian

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4805
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 09.06.13 17:48 
Hallo adrian92 :welcome:

da bisher noch kein anderer geantwortet hat, scheinst du dein Problem wohl doch nicht eindeutig genug beschrieben zu haben. ;-)
Vllt. solltest du noch erklären, was deine Variable suchfenster ist (bzw. welche Werte du übergibst)? Und was genau bei dir nicht funktioniert?

Für diesen Beitrag haben gedankt: adrian92
Aggrasso
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16
Erhaltene Danke: 1



BeitragVerfasst: So 09.06.13 19:04 
@Th69

Also so wie ich das jetzt verstanden hab willst du eine kollisionsabfrage machen.
Und die eine picturebox1 kann sich frei in einer andern picturebox2 bewegen.

Es werden nur die "hindernisse" im Background Bild erkannt (picturebox2), aber (picturebox1) erkennt nicht den rand von (picturebox2) ?

Ist es soweit richtig ?

Für diesen Beitrag haben gedankt: adrian92
adrian92 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: So 09.06.13 21:19 
zu ersteinmal danke für die antworten:

versuche es nochmal eindeutiger zu beschreiben:

ich will ein spiel programmieren, bei dem ein objekt(picturebox1) eine strecke(picturebox2) durchläuft, auf dieser sind hindernisse denen man mitden pfeiltasten ausweichen muss, nun wollte ich zuallererst einmal eine kollisionsabfrage hinzufügen. diese wie oben geschrieben funktioniert aber leider nur für das backgroundimage der form 1 nicht aber für picturebox 2.

hoffe es ist klarer geworden was ich vorhabe :D

gruß adrian
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: So 09.06.13 21:40 
Eine Kollisionsabfrage würde ich über die Koordinaten erledigen.

Zu aller erst ist das relativ einfach:

Zitat:
if (HindernisBox.Location.X - FliegerBox.Location.X < 10) GebeWarnung();
if (HindernisBox.Location.X - FliegerBox.Location.X <= 0) Kollision();


(Ich weiß nicht, ob der Code so funktioniert, ich hab das dumpfe Gefühl, mich bei Eigenschaften-Namen geirrt zu haben, aber ich denke, das reicht aus zum Verständnis)

Das meldet, wenn der Spieler mit dem Gefährt frontal gegen das Hindernis fliegt.


Nun soll auch geprüft werden, ob die unter und obere Kante nicht gegen das Hindernis fliegt und dazu nimmst du die Y-Koordinaten.

Wenn das Objekt unter dem Hindernis durch fliegt, musst du darauf achten, dass die Position des Hindernisses bei der linken oberen Ecke liegt und umgerechnet werden muss, auf die linke untere Ecke.
Wenn es über das Hindernis fliegt, hast du das gleiche Problem, nur bei dem Flieger-Objekt.

Du musst also die Y-Koordinaten der richtigen Kanten berechnen und dann die Differenz bilden.
Ist sie sehr gering, fliegt der Flugkörper sehr nahe, ist sie 0 der kleiner, dann hats gekracht.



Diese Herangehensweise erhebt keinen Anspruch auf Einfachheit, aber ich würde glatt wetten, dass jede ähnliche Funktion irgendwo genauso funktioniert, ob nun in einer Methode eines Frameworks verborgen, oder selber programmiert.
Vielleicht gibt es schon passende Methoden, doch ich kenne sie nicht. Suchen würde ich dann allerdings nicht im .NET-Framework, sondern in XNA, was für zweidimensionale und dreidimensionale Spiele gemacht ist und da braucht es sicherlich auch mal Kollisionsabfragen. ^^


Zuletzt bearbeitet von Palladin007 am So 09.06.13 21:47, insgesamt 2-mal bearbeitet

Für diesen Beitrag haben gedankt: adrian92
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4805
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 10.06.13 08:17 
Hallo adrian92,

was du erreichen willst, das habe ich schon verstanden. Meine Frage bezog sich konkret auf deinen Code (der für sich ersteinmal in Ordnung aussieht). Die Frage ist also konkret: Mit welchen Werten rufst du diese Methode auf? Ich nehme an, daß bei dir die Inhalte von suchfenster falsch sind.
Am besten du debuggst deinen Code, um dir die Variableninhalte mal anzeigen zu lassen.

P.S. @Palladin007: deinen letzten Beitrag habe ich - auf deinem Wunsch hin - gelöscht.
Und der Threadersteller hat aber nur ein Bild vorliegen (auf dem die Hindernisse eingezeichnet sind) und nicht als einzelne Objekte.

Und @Aggrasso: du meinst wohl eher "@adrian92" ;-)
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 10.06.13 09:17 
Da du Koordinaten vergleichst ist es vielleicht nochmal hilfreich darauf hinzuweisen das sich die Koordinaten eines Controls immer auf den Container/Parent eines Controls beziehen nicht auf die Form.

Wenn du sagst deine Vergleiche funktionieren mit dem Backgroundimage der Form dann vermute ich mal hast du dir deine Vergleiche so ausgedacht das sie die Koordinaten relativ zum 0-Punkt der Form darstellen. Vermutlich ist dem aber nicht so da du vielleicht die Pictureboxen untereinander zugewiesen hast?
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: Mo 10.06.13 12:50 
Danke an Th69



Er hat die Hindernisse nur auf dem Hintergrundbild eingezeichnet?
Ok, dann funktioniert das natürlich nicht ...
Würde ich allerdings auch ändern, denn dann könnte man die Hindernisse zufällig platzieren lassen ^^


Wenn es aber eingezeichnet bleiben soll, dann wäre es doch sinnvoller, vor der "Fahrt" die Position der Hindernisse zu suchen in in der Form zu speichern.

Ich meine mich zu erinnern, dass es hier mal ein Thema gab, das auf einem Bild nach einzelnen Formen sucht, da waren es Kreise.
Leider hab ich das nicht mehr gefunden und verstanden hatte ich das auch nicht.

Da kann ich daher nicht mehr helfen :/