0

グループの描画に関する問題を理解するのに問題があります。私は最初のwpfプロジェクトであるwpfでマップエディターを作成しており、描画グループを検索/遊んでいます。

左側に一連のタイルがあり、アプリの起動時にスプライトのフォルダーに基づいて入力されます。それらはすべて、私が設定したルールに従ってレイアウトされます(各32ピクセルで1行あたり3セットのタイル)。以下の例:

    private void RefreshTileList()
    {
        // For now load in all textures as possible tiles
        DrawingGroup dGroup = new DrawingGroup();
        Rect r = new Rect();
        r.X = 0.0;
        r.Y = 0.0;
        r.Width = Settings.Default.TileThumbWidth;
        r.Height = Settings.Default.TileThumbHeight;
        foreach (WPFTexture tex in imgFind.TileTextures)
        {
            ImageDrawing iDraw = new ImageDrawing(tex.src, r);

            dGroup.Children.Add(iDraw);

            r.X += r.Width;
            if (r.X > r.Width * Settings.Default.TileThumbMaxColumns)
            {
                r.X = 0.0;
                r.Y += r.Height;
            }
        }

        // Make a drawing image and send it to the Image in canvas
        DrawingImage drawImage = new DrawingImage(dGroup);
        tileImage.Source = drawImage;
    }

次に、タイルが動的に配置されることを除いて、まったく同じことを実行したい別のキャンバスの画像コントロール。これが私がこれまでに持っているものです:

    private void AreaDrawingCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        if(curSelIndex > -1 && curSelIndex < imgFind.TileTextures.Count)
        {
            BitmapSource tileSrc = imgFind.TileTextures[curSelIndex].src;

            Point mousePos = e.GetPosition(sender as Canvas);
            Size size = new Size(tileSrc.Width, tileSrc.Height);
            Rect r = new Rect(mousePos, size);
            ImageDrawing iDraw = new ImageDrawing(tileSrc, r);

            areaDrawGroup.Children.Add(iDraw);

        }
    }

そして、これがareaDrawGroupを使用するものの初期化です。

        // Setup drawing for area
        DrawingImage areaDrawImage = new DrawingImage(areaDrawGroup);
        areaImage.Source = areaDrawImage;
        areaImage.Stretch = Stretch.None;
        AreaDrawingCanvas.Children.Add(areaImage);

描画グループのpoint(0、0)にあるデッドイメージを追加せずに、イメージコントロールをクリックした場合。奇妙な場所にオフセットされます。左上の位置に向かってさらにクリックし続けると、他のすべてのタイルをシフトしながら、タイルを描画する場所が修正されます。

私の質問は、良いタイリングの例をどこで見つけることができるか、または何を間違えたのかということです。他の画像が配置されている場所を修正するためにデッドイメージを追加することは、私が見逃した単純なものへの本当に悪いハックのように見えるためです。

4

1 に答える 1

0

これが今のところこれを解決するために私がしたことです。私はi7を持っていて、drawingvisualsのリストを使用しました。問題ありません。ある時点で、1つの描画ビジュアルを使用して、各画像を同じビジュアルに追加する必要があると思いました。それに関する問題は、タイルを追加した場合、レンダリングを再度開いて、すべての描画をやり直す必要があることです。しゃっくりがないので、その方法に時間を使わないことにしました。

コピーして貼り付けるコードは次のとおりです。

  1. フレームワーク要素を派生させるクラスを作成し、見られるようにオーバーライドを追加します

    public class AreaDrawingEdit:FrameworkElement {public VisualCollection Visuals {get; セットする; } const double COLLISION_OPACITY = 0.8;

    public AreaDrawingEdit()
    {
        Visuals = new VisualCollection(this);
    }
    
    public void AddRenderTile(DrawingTile tile)
    {
        // Add the tile visual 
        tile.visual = new DrawingVisual();
        InvalidateTile(tile);
        Visuals.Add(tile.visual);
    
        // Add in collision visual
        tile.colVol.visual = new DrawingVisual();
        InvalidateCollisionVol(tile.colVol);
        Visuals.Add(tile.colVol.visual);
    }
    
    public void RemoveRenderTile(DrawingTile tile)
    {
        Visuals.Remove(tile.visual);
        Visuals.Remove(tile.colVol.visual);
    }
    
    public void InvalidateTile(DrawingTile tile)
    {
        // Set up drawing rect for new tile
        Rect r = new Rect(tile.pos, new Size(tile.tileTex.src.PixelWidth, tile.tileTex.src.PixelHeight));
    
        DrawingContext dc = tile.visual.RenderOpen();
        dc.DrawImage(tile.tileTex.src, r);
        dc.Close();
    }
    
    public void InvalidateCollisionVol(CollisionVol vol)
    {
        Rect r = new Rect(vol.pos, vol.size);
    
        DrawingContext dc = vol.visual.RenderOpen();
        dc.PushOpacity(COLLISION_OPACITY);
        dc.DrawImage(vol.src, r);
        dc.Pop();
        dc.Close();
    }
    
    protected override int VisualChildrenCount
    {
        get { return Visuals.Count; }
    }
    
    protected override Visual GetVisualChild(int index)
    {
        if (index < 0 || index >= Visuals.Count)
        {
            throw new ArgumentOutOfRangeException();
        }
    
        return Visuals[index];
    }
    

    }

  2. 作成したフレームワーク要素をxamlファイルのどこかに追加します。lessthan local:AreaDrawingEdit Canvas.Left = "0" Canvas.Top = "0" OpacityMask = "Black" x:Name = "areaDrawingEdit" backslashgreaterthan

それを困難な方法で理解するという私の悲惨さへの解決策を楽しんでください。

于 2013-01-29T18:26:26.443 に答える