2012-04-02 7 views
0

Hey Leute, ich dachte, das wäre eine 1 Sekunde Sache, momentan habe ich ein Tileset für ein 2D Spiel und je nach Terrain nennt man diese Fliesensätze. und die Fliesensätze sind farbcodiert pink ist das Material und blau ist das Material neben der Fliese.XNA verändert 200 oder so die Anzahl der Pixel

so weit, wenn das Gelände wechselt oder wenn ich lade, zeichne ich die Kacheln auf dem Bildschirm und alle neuen Kacheln, wenn ich mich bewege. das ist alles in Ordnung und funktioniert sehr gut, aber wenn ich wie 50 Grasfliesen, die von Rosa zu Grün geändert werden müssen und 75 Schmutzfliesen, die von Rosa zu Grau geändert werden müssen, habe ich ein Problem.

es erscheint nur die erste Kachel wird geändert, dann jede andere Kachel vor oder vor dieser Kachel hat die gleiche Farbe wie die erste Farbe.

geben Sie krank ein Beispiel in Code, was im

Color[] storePixels = new Color[50 * 50]; 

for(int y = 0; y < 100; y ++) 
{ 
    for(int x = 0; x < 100; x++) 
    { 
     tileTexture[y,x].GetData(storePixels); 

     for(int i = 0; i < storePixels.Length; i ++) 
     { 
       if(tileMaterial[y,x] == "DIRT") 
       { 
        storePixels[i] = new Color(100,100,100); 
       } 
       if(tileMaterial[y,x] == "GRASS") 
       { 
        storePixels[i] = new Color(0,255,0); 
       } 
     } 
     tileTexture[y,x].SetData(storePixels); 
    } 
} 

Für mich tun ich, warum diese nicht funktionieren nicht sehen kann. ich nehme an, vielleicht muss ich die storePixels zurücksetzen, die ich versucht habe, aber es gründet nicht, wenn sein Gras oder Grau, wenn sein Schmutz ist.

Bitte lassen Sie mich wissen, wenn Sie wissen, warum dies nicht danken Ihnen für Ihre Zeit arbeitet und danken Ihnen im Voraus :)

OK! i es heraus im das gleiche Bild in meinem Inhalt Ordner

for(int y = 0; y < 100; y ++) 
{ 
    for(int x = 0; x < 100; x ++) 
    { 
     tileTexture[y,x] = Content.Load<Texture2D>("tile"); 
    } 
} 

so jetzt rufen wir bekommen somewere wissen wir, warum das Problem cuassed wird, wie ich die Texture2D durch SetData() ändern es tatsächlich ändert diese Fliese Texture2D direkt und alles andere, was es anruft, wird sich immer ändern.

ich kann es nicht in einer Schleife aufrufen, ich rufe es nur beim Start an Ich könnte versuchen, eine Kopie der Textur2D zu speichern und sie dann zu ändern.

Ich weiß nicht, hat jemand weitere Lösungen, um dieses Problem zu lösen? Dank für Ihre Zeit :)

Antwort

0

Dieser Code ist eine schlechte Idee ...

Sie können mit nur einem weißen Textur arbeiten ...

WhiteTex = new Texture2D(GraphicsDevice,1,1); 
WhiteTex.SetData<Color>(new Color[] {Color.White }; 

Sie Fliesen auf diese Weise ziehen kann ...

Enum MaterialTypes { Dirt, Grass } 
static readonly Dictionary<int, Color> MaterialTypeToColor = new Dictionary() { {0, new Color(100,100,100)}, {1, new Color(0,255,0) }}; 

for(int y = 0; y < 100; y ++) 
{ 
    for(int x = 0; x < 100; x++) 
    {    
     batch.Draw(whiteTex, new Rectangle(x*50,y*50, 50,50), null, (MaterialTypeToColor[ (int) tileMaterial[y,x]]); 
    } 
} 
+0

zeichnet der Zeichencode jedes texture2D im y, x - Array zum Beispiel für (int y = 0; y <100; y ++) {für (int x = 0; x <100; x ++) {spriteBatch.Draw (tileTexture [y, x], Rechteck, Color.White); – user1109013

+0

Ich habe versucht, eine spezifische storePixel Farbe für jede Textur2D, die Ausgabe im empfangen zu verwenden, ich sage es nur um zu zeichnen und zu ändern Kachel 0,0 aber es ändert sich zufällig 4,4 5,9 8,1 1,1 und wie 70% der anderen Kacheln zufällig jedes Mal. Ich verbrachte einen ganzen Tag damit, diesen Fehler ohne Erfolg zu beheben, und ich dachte, dass ich entweder etwas vermisse oder XNA kein Raster aus vielen Kacheln ziehen kann – user1109013

0
for(int y = 0; y < 100; y++) 
{ 
    for(int x = 0; x < 100; x++) 
    { 
     spriteBatch.Draw(tileTexture[y,x],rectangle,Color.White); 
    } 
} 

das ist, wie ich meine Gitter am Zeichnung