XNA - Gedrehtes Rechteck
- Allgemein
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von SystemUnknow.
-
-
-
-
Ich hab hier Code für Rect Erkennung mit anschließender per Pixel..
Nur ganz verstanden hab ich den noch nicht bezüglich
Vector3
Matrix
Matrix.transform
Werde mich morgen mal einlesen (brauche auch per Pixel) und hoffe ich kapier es
Falls nicht wäre ich an einem Eintrag in deinem Blog über dieses Thema interessiert
Hier der Code:
VB.NET-Quellcode
- // Person
- Rectangle personRectangle =
- new Rectangle((int)personPosition.X, (int)personPosition.Y,
- personTexture.Width, personTexture.Height);
- // Build the block's transform
- Matrix blockTransform =
- Matrix.CreateTranslation(new Vector3(-blockOrigin, 0.0f)) *
- // Matrix.CreateScale(block.Scale) * would go here
- Matrix.CreateRotationZ(blocks[i].Rotation) *
- Matrix.CreateTranslation(new Vector3(blocks[i].Position, 0.0f));
- // Calculate the bounding rectangle of this block in world space
- Rectangle blockRectangle = CalculateBoundingRectangle(
- new Rectangle(0, 0, blockTexture.Width, blockTexture.Height),
- blockTransform);
- // The per-pixel check is expensive, so check the bounding rectangles
- // first to prevent testing pixels when collisions are impossible.
- if (personRectangle.Intersects(blockRectangle))
- {
- // Check collision with person
- if (IntersectPixels(personTransform, personTexture.Width,
- personTexture.Height, personTextureData,
- blockTransform, blockTexture.Width,
- blockTexture.Height, blockTextureData))
- {
- personHit = true;
- }
- }
- public static bool IntersectPixels(Rectangle rectangleA, Color[] dataA,
- Rectangle rectangleB, Color[] dataB)
- {
- // Find the bounds of the rectangle intersection
- int top = Math.Max(rectangleA.Top, rectangleB.Top);
- int bottom = Math.Min(rectangleA.Bottom, rectangleB.Bottom);
- int left = Math.Max(rectangleA.Left, rectangleB.Left);
- int right = Math.Min(rectangleA.Right, rectangleB.Right);
- // Check every point within the intersection bounds
- for (int y = top; y < bottom; y++)
- {
- for (int x = left; x < right; x++)
- {
- // Get the color of both pixels at this point
- Color colorA = dataA[(x - rectangleA.Left) +
- (y - rectangleA.Top) * rectangleA.Width];
- Color colorB = dataB[(x - rectangleB.Left) +
- (y - rectangleB.Top) * rectangleB.Width];
- // If both pixels are not completely transparent,
- if (colorA.A != 0 && colorB.A != 0)
- {
- // then an intersection has been found
- return true;
- }
- }
- }
- // No intersection found
- return false;
- }
Quelle: Leider k.A. hab den Code schon lange, müsste aber Microsoft(c) sein. -
Eistee schrieb:
VB.NET-Quellcode
- //Person
- Rectangle personRectangle =
- new Rectangle((int)personPosition.X, (int)personPosition.Y,
- personTexture.Width, personTexture.Height);
- // Build the block's transform
- Matrix blockTransform =
- Matrix.CreateTranslation(new Vector3(-blockOrigin, 0.0f)) *
- // Matrix.CreateScale(block.Scale) * would go here
- Matrix.CreateRotationZ(blocks[i].Rotation) *
- Matrix.CreateTranslation(new Vector3(blocks.Position, 0.0f));
- // Calculate the bounding rectangle of this block in world space
- Rectangle blockRectangle = CalculateBoundingRectangle(
- new Rectangle(0, 0, blockTexture.Width, blockTexture.Height),
- blockTransform);
Hier blick ich nicht ganz durch (das andere kenn ich schon ;)). Man kann doch in einem Rectangle kein transformiertes (sprich rotiertes) Rectangle abspeichern?! -
Soweit ich das verstanden habe wird da einfahc ein Rechteck um das Transformierte Objekt gelegt und damit geprüft.
Nach jeder Transformation wird das Rechteck neu um das Objekt gelegt, darauf folgt immer die Rechteck-Rechteck Prüfung und wenn diese Interagieren, wird innerhalb dieser Fläche auf die Transparenz getestet. -
-
-
-
-
TheoTechnic schrieb:
Achso Dann bleibt nur noch das Problem, wie ich die Texture2D drehe
Hab damit noch nciht gearbeitet und auch nur überflogen und bin mir nicht sicher
aber wird hier unter "Build the block's transform" (Edit habs mal übersetzt ^^) das 2D Sprite nicht gedreht?
Position ist Vector3 und damit kannste die z-achse manipulieren um so das Sprite zu drehen.
Also wenn ich mich nicht ganz irre. Code:
Esit:
Ich such heute abend mal das ganze Projekt raus.
Denn es scheit so als ob da noch etwas fehlt.
VB.NET-Quellcode
- // Das Sprite2D drehen
- Matrix blockTransform =
- Matrix.CreateTranslation(new Vector3(-blockOrigin, 0.0f)) *
- // Matrix.CreateScale(block.Scale) * would go here
- Matrix.CreateRotationZ(blocks[i].Rotation) *
- Matrix.CreateTranslation(new Vector3(blocks[i].Position, 0.0f));
- // Berechnen des Rechtecks für das gedrehte Sprite2D
- Rectangle blockRectangle = CalculateBoundingRectangle(
- new Rectangle(0, 0, blockTexture.Width, blockTexture.Height),
- blockTransform);
-
jvbsl schrieb:
alle pixel auslesen in array schreiben und dann einfach rotieren, Polarkoordinaten dürften helfen(Wobei das eigt. dasselbe ist wie aus der Schule Trigonometrie - 9te Klasse?!)...
Dafür müsste man halt in der 9. Klasse sein
@ Eistee: Wie kann ich jetzt aber meine Texture2D mit dem Matrix verändern? Steh grad ein bisschen auf dem Schlauch -
HAHAH
Ich liebe XNA, ist einfach das beste!
Um 2D Sprites zu drehen einfach 3 Parameter mehr angeben! Der Hammer!
spriteBatch.Draw(Sprite, TargetRect, SourceRect, Color.White, Winkel, Origin, SpriteEffects.None), Layer)
Winkel = Muss in Radiant angegeben werden!
Origin = Punkt um den gedreht werden soll! Wird als Vector2 angegeben!
SpriteEffects = Hier kann man den Sprite Horizointal oder Vertikal kippen!
Layer = Standart ist 0.0f
Tipp: Zum umrechnen von Winkel in Radiant: Winkel = MathHelper.ToRadians(90) '90° Winkel wird in Radiant umgerechnet.
Ein Hoch auf das XNA Framework -
ich frage mich echt, wie ihr beide mit XNA arbeitet, wenn ihr nicht mal die Parameter der Draw-Funktion kennt
Skybird schrieb:
Das sind ja Ubisoftmethoden hier !
-
-
Also ich habe noch nie mehr wie die Color Parameter gebraucht
Und ich finde die Klamotten erst wenn ich dannach suche!
wie man die Texture2D für die pixelgenaue Kollision drehen kannnicht, wie man sie gedreht darstellt -.-
Das eine baut doch auf dem anderen auf!
1. Sprite wird rotiert dargestellt
2. Rechteck drum
3. Wenn Rechteck vom Spieler sich mit Rechteck vom AutoXY berührt
Wird das Feld für die Per Pixel ermittelt
Dan mit 2 For Next wird jeder Pixel der mit sich interagierenden Objekte auf die Transparenz überprüft.
Wenn eins der beiden Pixel nicht zu 100% Transparent ist, hat es gekracht.
Da sind zwar noch ein paar Schritte dazwischen wie z.B. das Color Array mit den Daten der 2 Objekte füllen und so weiter, aber das kannste am Projekt selber besser erkennen. Vorallem weil ich mir nicht zu 100% sicher bin ob ich alles 'richtig' verstanden habe.
Im anhand das Projekt (C#).Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Eistee“ ()
-
-
-
-
...dieser tut soll weiter helfen: progware.org/Blog/post/XNA-2D-…ection-with-Rotation.aspx
-
Ähnliche Themen
-
Thomas_Report - - Visual Basic for Applications (VBA)
-
3 Benutzer haben hier geschrieben
- Gast (18)
- vb-checker (1)
- jvbsl (1)