私は現在、古典的なアーケード ゲームの Asteroids を C# WPF でプログラミングして、練習を積んでいます。解決できないように見える問題に遭遇しました。
小惑星を生成し、すべてのゲーム オブジェクトを含むキャンバス要素に追加しているときに、問題が発生しています。
プレイヤーの船の位置などを更新するメソッドに沿って、20 ミリ秒ごとに呼び出される generateAsteroids メソッドがあります。generateAsteroids メソッドは、さまざまな計算 (関数内のコメント) を実行して、asteroidCollection リストに追加する小惑星の数を決定します。これはすべてうまくいきます。
この問題は、小惑星の Polygon オブジェクトをゲーム キャンバスに追加しようとすると発生します。
次のエラーが表示されます。
これが何を意味するのか理解できました (私は思います)。すべての小惑星オブジェクトは「小惑星」と呼ばれていますが、これは明らかに理想的ではありません。調査したところ、その場でオブジェクトの変数名を動的に作成できないことがわかりました。
ポリゴンがキャンバスに追加されるたびに、ポリゴンに動的な名前を付けようとしました。
この問題を知っている人は、私を助けてもらえますか?
関連すると思われるすべてのコードを追加しました。さらに表示する必要がある場合はお知らせください。
ありがとう
C#:
public void drawAsteroid(Asteroid theAsteroid)
{
// entityShape is a Polygon object
theAsteroid.entityShape.Name = "asteroid" + this.asteroidsAdded.ToString();
theAsteroid.entityShape.Stroke = Brushes.White;
theAsteroid.entityShape.StrokeThickness = 2;
theAsteroid.entityShape.Points = theAsteroid.getEntityDimensions();
gameCanvas.Children.Add(theAsteroid.entityShape);
}
// Called every 20 milliseconds by method that updates the game canvas. Possibly quite inefficient
public void generateAsteroids()
{
// Number of asteroids to add to the collection = the length of the game so far / 3, then subtract the amount of asteroids that have already been added
int asteroidNum = Convert.ToInt32(Math.Ceiling((DateTime.Now - gameStartTime).TotalSeconds / 3));
asteroidNum -= asteroidsAdded;
for (int i = 0; i <= asteroidNum; i ++)
{
asteroidCollection.Add(new Asteroid());
this.asteroidsAdded += 1;
}
foreach (Asteroid asteroid in asteroidCollection)
{
drawAsteroid(asteroid);
}
}
XAML:
<Window x:Name="GameWindow" x:Class="AsteroidsAttempt2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Width="1000" Height="1000" HorizontalAlignment="Left" VerticalAlignment="Top" Loaded="GameWindow_Loaded">
<Canvas x:Name="GameCanvas" Focusable="True" IsEnabled="True" HorizontalAlignment="Left" Height="1000" VerticalAlignment="Top" Width="1000" KeyDown="GameCanvas_KeyDown" KeyUp="GameCanvas_KeyUp">
<Canvas.Background>
<ImageBrush ImageSource="D:\CPIT\BCPR283\Asteroids\Asteroids\AsteroidsAttempt2\Resources\SpaceBackground.jpg" Stretch="Fill"/>
</Canvas.Background>
</Canvas>