2009-06-18 8 views
3

Springe in die Welt der WPF-benutzerdefinierten Steuerelemente und fragte mich, wie der beste Weg zum Entwerfen eines HexGrid-Steuerelements wäre? Denke an dein liebstes Tischkriegsspiel. oder, ebenso wahrscheinlich, dein Lieblingsvideospiel, das den Entwurf von einer stolzen Geschichte der Tischkriegspiele stiehlt.WPF "hex grid" -Komponente

Das zugrunde liegende Modell setzt eine wichtige Methode, als Teil einer Map-Klasse:

Hex GetHex(int x, int y, int z)*; 

Hex enthält alle relevanten Daten (im Moment, ein Terrain-Enumeration, 1 abbildet: 1 auf eine Hintergrundfarbe; klein anfangen ...).

Möglicherweise relevant Constraints:
Karte ändert sich nicht in Größe & Hex Datenänderungen bei sehr vorhersehbar Zeiten (immer als direkte Reaktion auf Benutzeraktionen).

Idealerweise wird die Komponente erweitert, um ihren Container sauber zu füllen, und kann direkt in XAML deklariert werden.

Was ich suche, ist eine skizzenhafte Übersicht dessen, was ich tun muss, um dies zu bauen, nicht eine fertige Komponente.

* Ich war zwar ziemlich clever mit diesem Adressierungsschema, aber anscheinend bin ich late to the party.

Antwort

1

EDIT: Hier ist ein Link zu Pete's Projektseite, die ein Hex-Rastermuster hat. http://blois.us/Projects.html Es gibt ein Pathfinding-Beispiel, das ein Projekt namens Pathfinding zeigt, das ein Hex-Grid hat und wahrscheinlich denselben Basiscode wie Minesweeper verwendet. Ich habe es noch nicht angeschaut. Es ist Silverlight 3 und muss möglicherweise aktualisiert werden. Minesweeper war ziemlich elegant.

Ralph

ORIGINAL: Es gab eine Probe für Silverlight 2 von Peter blois einer hexagonalen Version von Minensuchboot.

Es enthielt Quellcode. Er hatte eine sehr elegante Methode, dies zu tun, indem er den Measureoverride überschrieb und einen Override am Netz anordnete. Mouseovers usw. hat gut funktioniert. Es gab bemerkenswert wenig Code.

Ich kann das Projekt nicht im Web mehr finden, obwohl Google einen schalen Link, um es mit der Suche nach Sechseck Minensuchboot Silverlight-Quellcode hat blois

Peter Blois einen aktuellen Blog unter der unten genannten Adresse hat, so Sie könnten versuchen, ihn hier zu kontaktieren ...

Viel Glück und sag mir, wie es geht, werde ich etwas ähnliches sein.

+1

Leider reagieren die Links mit '404'. Diese Antwort ist jetzt im Grunde nutzlos. – IAbstract

+0

Versuchen Sie https://web.archive.org/web/20141217013339/http://blois.us/ Die Fußzeile hat ein Like zu seiner E-Mail-Adresse –

+0

Es gibt eine andere Frage in der SO.GameDevelopment Abschnitt, die dieses Problem jetzt beheben: http://gamedev.stackexchange.com/questions/2338/clickable-hex-grid-in-c-net –

0

Meiner Meinung nach ist es in WPF vernünftiger, ein HexGrid als Panel und nicht als UserControl zu entwerfen. Panels haben keine visuelle Darstellung und müssen nur Kindelemente richtig anordnen (im Falle von HexGrid - in einem Wabenmuster). Diese Kinderelemente sollten wiederum eine sechseckige Form haben.

Ein Beweis eines Konzepts: mein Hexgrid Projekt (zu groß, um hier zu posten)

CodeProject article

GitHub repository

HexList: Selektor Itemscontrol, die auf einem Hexgrid Panel Artikel in HexItem Behälter zeigt

HexGrid: Panel, das untergeordnete Elemente anordnet ein Wabenmuster

HexItem: Sechseck-förmigen Content

Beispiel für die deklarative Verwendung:

<hx:HexList Name="HexColors" Orientation="Vertical" 
      Grid.Row="1" 
      Padding="10" 
      SelectedIndex="0" 
      Background="{Binding Path=SelectedItem.Background, RelativeSource={RelativeSource Self}}" 
      RowCount="5" ColumnCount="5"> 
    <hx:HexItem Grid.Row="0" Grid.Column="1" Background="#006699"/> 
    <hx:HexItem Grid.Row="0" Grid.Column="2" Background="#0033CC"/> 
    <hx:HexItem Grid.Row="0" Grid.Column="3" Background="#3333FF"/> 
    <!--...--> 
    <hx:HexItem Grid.Row="4" Grid.Column="1" Background="#CC9900"/> 
    <hx:HexItem Grid.Row="4" Grid.Column="2" Background="#FF3300"/> 
    <hx:HexItem Grid.Row="4" Grid.Column="3" Background="#CC0000"/> 
</hx:HexList> 

hex color selector

Ich verstehe, dass die Frage ein Oldie, aber meine Lösung teilen nur im Fall