2010-10-10 12 views
0

Je veux créer une sorte de simulation. Il y aura de nombreux sprites flottant autour. Parce que je pense que rendre chaque image mille fois les mêmes primitives qui composent un sprite, sera lent, je veux les rendre une fois dans un bitmap et ensuite montrer ce sprite à chaque image.WPF: Bitmap ne montre pas

Mais cela ne semble pas fonctionner, l'écran reste blanc.

source de mon WPF est trivial:

<Window x:Class="WPFGraphicsTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="800" Width="1000"> 
    <Canvas> 

    </Canvas> 
</Window> 

Et voici mon code:

public partial class MainWindow : Window 
    { 
     Ellipse e; 
     RenderTargetBitmap bmp2; 

     public MainWindow() 
     { 
      InitializeComponent(); 

      e = new Ellipse(); 
      e.Width = 40; 
      e.Height = 40; 
      e.Fill = new SolidColorBrush(Color.FromRgb(0, 0, 200)); 

      ((Canvas)this.Content).Children.Add(e); 
      ((Canvas)this.Content).Measure(new Size(1000, 800)); 
      ((Canvas)this.Content).Arrange(new Rect(new Size(1000, 800))); 

      RenderTargetBitmap bmp2 = new RenderTargetBitmap(40, 40, 96, 96, PixelFormats.Pbgra32); 

      bmp2.Render(e); 
      ((Canvas)this.Content).Children.Remove(e); 
} 


     protected override void OnRender(DrawingContext drawingContext) 
     { 
      base.OnRender(drawingContext); 

      drawingContext.DrawImage(bmp2, new Rect(100,100, 40, 40)); 

     } 
} 

Pourquoi pas ce travail?

Répondre

1

Vous pouvez placer un objet Image sur le canevas, puis utiliser RenderTargetBitmap pour mettre à jour l'image. Par exemple

<Window x:Class="WPFGraphicsTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="800" Width="1000"> 
    <Canvas> 
     <Image Name="frameImage" /> 
    </Canvas> 
</Window> 

Ensuite, vous pouvez mettre à jour l'image comme celui-ci, pour l'exemple, je suis en train de rendre une nouvelle ellipse toutes les 100 ms. Bien sûr, vous devriez mieux gérer les stylos et les pinceaux que ce que je montre ici, c'est juste un exemple pour clarifier la suggestion.

public partial class MainWindow : Window 
    { 
    DispatcherTimer _timer = new DispatcherTimer(); 

    RenderTargetBitmap _renderSurface = 
     new RenderTargetBitmap(100, 100, 96, 96, PixelFormats.Pbgra32); 

    Random _rnd = new Random(); 

    public MainWindow() 
    { 
     InitializeComponent(); 

     _timer = new DispatcherTimer(); 
     _timer.Interval = TimeSpan.FromMilliseconds(100); 
     _timer.Tick += new EventHandler(_timer_Tick); 
     _timer.Start();  
    } 

    void _timer_Tick(object sender, EventArgs e) 
    { 
     DrawingVisual visual = new DrawingVisual(); 
     DrawingContext context = visual.RenderOpen(); 
     int value = _rnd.Next(40); 
     context.DrawEllipse(
     new SolidColorBrush(Colors.Red), 
     new Pen(new SolidColorBrush(Colors.Black), 1), 
     new Point(value, value), value, value); 
     context.Close(); 

     _renderSurface.Render(visual); 
     frameImage.Source = _renderSurface; 
    }  
    } 
+0

Merci pour la réponse, mais votre code rend l'ellipse à chaque image. Je veux rendre l'ellipse une fois dans un bitmap, puis chaque image dessine juste le bitmap. – codymanix

+0

@codymanix, en utilisant cet exemple, vous pouvez obtenir le bitmap à rendre. Fondamentalement, le code dans le _timer_Tick est ce que vous devez rendre à l'image bitmap. Si vous voulez le faire une seule fois, vous pouvez décaler ce code de la fonction _timer_Tick. J'ai simplement inclus cela dans l'exemple afin que vous puissiez voir que la mise à jour de l'image bitmap est affichée à l'écran. –

+0

OK merci, ça va marcher. Mais cela signifie que je dois créer un objet Image pour chaque sprite que je veux dessiner. N'est-il pas possible de dessiner des images à la volée? Quel était le problème avec mon code, n'est-ce pas censé fonctionner? – codymanix