2013-10-12 108 views
0

我目前正在編寫經典的街機遊戲C#WPF中的小行星來獲得一些練習。 我遇到了一個我似乎無法解決的問題。問題將多個多邊形對象添加到畫布

我在生成小行星並添加到包含所有遊戲對象的canvas元素時遇到了問題。

我有一個generateAsteroids方法,它每20毫秒就會調用一次方法來更新玩家位置等等。 generateAsteroids方法執行各種計算(函數中的註釋)以確定要添加到asteroidCollection列表中的多少個小行星。這一切工作正常。

當我嘗試將小行星Polygon對象添加到遊戲畫布時,問題就出現了。

我得到以下錯誤:「ArugementException是未處理由用戶代碼:指定的可視已經是另一個Visual的孩子或CompositionTarget的根」

現在我明白這意味着什麼(我覺得),所有的小行星物體被稱爲「小行星」,這顯然是不理想的,我研究並發現,你不能動態創建對象的變量名。

我已經嘗試給每一個添加到畫布上的動態名稱的多邊形。

任何人都知道這個問題請幫幫我嗎?

我添加了所有我認爲相關的代碼,請讓我知道,如果你需要看到更多。

感謝

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> 

回答

0

drawAsteroid方法您要添加的所有多邊形從asteroidCollection到畫布上的每個呼叫,不管它們是否已經被添加。但是不能將相同的對象兩次添加到WPF面板的Children集合中。這就是爲什麼你會得到例外(它與Name無關)。

更改您這樣的代碼:

if (!gameCanvas.Children.Contains(theAsteroid.entityShape)) 
{ 
    gameCanvas.Children.Add(theAsteroid.entityShape); 
} 

當然的代碼仍然缺乏邏輯,從不再包含在asteroidCollection畫布刪除多邊形。你還必須補充一點。


而且你也不需要設置多邊形的Name對象可言,除非你想用自己的名字後訪問它們。