Ich mache ein basiertes Fensterspiel in C# und kann kein einfaches Bitmap für den Bildschirm erstellen. Ich habe ein Panel über den Bildschirm, und ich möchte in der Lage sein, um es zu zeichnen, so dass ich mit dem folgenden Code:C# -Bitmap - Parameter ist nicht gültig
public partial class GameWIndow : Form
{
public GameWIndow()
{
InitializeComponent();
}
private void panel1_Paint(object sender, PaintEventArgs e)
{
Bitmap buffer;
buffer = new Bitmap(Width, Height);
Task.Factory.StartNew(() =>
{
using (Graphics g = Graphics.FromImage(buffer))
{
g.FillRectangle(new SolidBrush(Color.PaleGoldenrod), 10, 10, 100, 100);
}
this.Invoke(new Action(() =>
{
this.BackgroundImage = buffer;
}));
});
}
wenn dieser läuft es gibt mir den Fehler „Parameter ist ungültig“ für die Linie
buffer = new Bitmap(Width, Height);
Breite und Höhe sind 900 und 700 bzw. beide Ganzzahlen.
Wenn das Problem ist, dass ich das völlig falsch mache, was wäre ein besserer Weg, dies zu schaffen.
-------- ------- bearbeiten
Ich habe auf Ihre Kommentare geschaut und es scheint, dass das, was ich oben getan sehr schrecklich ist, so habe ich versucht, einen anderen Ansatz, und Ich bin mir nicht sicher, ob das viel besser ist.
private Game game;
private Thread renderThread;
private Stopwatch stopwatch = new Stopwatch();
public GameWindow()
{
InitializeComponent();
//Starts game
game = new Game();
//Starts rendering
this.DoubleBuffered = true;
renderThread = new Thread(new ThreadStart(draw));
renderThread.Start();
}
//Runs when screen is asked to refresh
private void panel1_Paint(object sender, PaintEventArgs e)
{
//Sends graphics to game class where it draws game
game.draw(e.Graphics);
}
private void draw()
{
stopwatch.Start();
while (true)
{
//If 1/60th of a sec has passed
if (stopwatch.ElapsedMilliseconds > 1000D/60D)
{
stopwatch.Restart();
Invalidate();
}
}
}
Der obige Code nicht korrekt ausgeführt wird, bin ich nicht ganz sicher, warum, und wenn jemand dabei helfen könnte, würde ich das schätzen. Aber meine Hauptfrage ist nicht, wie man es beheben kann, aber ob dies sogar eine effektive oder "richtige" Art ist, zu zeichnen.
Das Problem ist wahrscheinlich, dass Sie das völlig falsch machen. Ich weiß nicht genau, warum Sie diesen Fehler erhalten, aber das Ändern der GUI von einem anderen Thread als dem, auf dem er erstellt wurde, ist verboten. (Bei näherer Betrachtung ist das definitiv nicht der Grund, warum Sie diesen Fehler erhalten, aber die Regel gilt immer noch.) – adv12
Was möchten Sie tun? Das sieht ein bisschen verdächtig aus. Die 'PaintEventArgs' enthalten bereits eine Instanz von' Graphics', auf die Sie zeichnen sollten. – vcsjones
Wenn Sie den doppelt gepufferten Stil für dieses Steuerelement aktivieren, können Sie einfach den Ereignisbehandlungscode "Paint" auf einfachste Weise schreiben. –