咨詢電話:023-6276-4481
熱門文章
電 話:023-6276-4481
郵箱:broiling@qq.com
地址:重慶市南岸區(qū)亞太商谷6幢25-2
這個游戲還算比較大的,所以我打算分幾篇文章來介紹。本節(jié)先介紹基礎(chǔ)的P1的實現(xiàn)。其實對游戲有所了解的都知道格斗游戲算是游戲類型中比較難編寫的,無論是邏輯還是復(fù)雜的技能控制還有碰撞檢測都是比較復(fù)雜的,所以我盡量做到完美。
[csharp] view plain copy
<Canvas Name="MyCanvas" ></Canvas>
首先我們在主界面選取的布局是Canvas的布局,為什么呢,因為這個布局在我們家在圖片資源的時候是非常方便的,可以準確的控制位置,便于我們進行屬性動畫的制作。(如果這里不懂可以先自己百度學(xué)習(xí)WPF的布局學(xué)習(xí),其中Grid,Canvas,StackPanel,DockPanel等都是比較重要的,后面我會更新相關(guān)的文章)。然后定義一個Image的對象當(dāng)作P1:
下面我們就來看如何進行主角的加載,我們知道在一般的格斗游戲中,角色都不是靜止的站立的,都是會晃動的,也就以為著我們必須加載成動畫的樣子。
下面我們來學(xué)習(xí)在WPF中的動畫是怎么實現(xiàn)的:
1.時間容器的方式(TimeLine可能更準確的翻譯是時間線,但是我更喜歡時間容器的翻譯)
因為這種方式是規(guī)定一個時間段,這就是時間容器的容量,然后把動作加入進這個時間容器,最后再把這個時間容器加載進入就可以實現(xiàn)動畫效果了,這種一般是實現(xiàn)屬性動畫。什么叫做屬性動畫呢,首先我們知道每個對象都有各種的屬性,比如說個按鈕的大?。ㄟ@就叫做屬性),按鈕的位置(這就叫做屬性),按鈕的顏色等等。所以屬性動畫就是在一個規(guī)定的時間內(nèi)動態(tài)的實現(xiàn)對象屬性變化的動畫。
[csharp] view plain copy
public partial class MainWindow : Window
{
Rectangle rect;
public MainWindow()
{
InitializeComponent();
rect = new Rectangle();
rect.Stroke = Brushes.Black;
rect.Fill = Brushes.Red;
//這兩句一定要有,雖然沒有在默認的情況下是加載到(0,0)但是沒有這兩句設(shè)置這個屬性,在下面
rect.SetValue(Canvas.LeftProperty,0D);
rect.SetValue(Canvas.TopProperty,0D);
rect.Height = 100;
rect.Width = 100;
MyCanvas.Children.Add(rect);
}
private void MyCanvas_MouseDown(object sender, MouseButtonEventArgs e)
{
Point MoveTO = new Point();
MoveTO = e.GetPosition(MyCanvas);
//故事畫板,上面可以同時裝載多個時間容器
Storyboard MyStory = new Storyboard();
//X軸的移動
DoubleAnimation MyXAnimation = new DoubleAnimation(MoveTO.X, TimeSpan.FromMilliseconds(2000));
Storyboard.SetTargetProperty(MyXAnimation, new PropertyPath(Canvas.LeftProperty));
MyStory.Children.Add(MyXAnimation);
MyStory.Begin(rect);
//Y軸的移動
DoubleAnimation MyYAnimation = new DoubleAnimation(MoveTO.Y, TimeSpan.FromMilliseconds(2000));
Storyboard.SetTargetProperty(MyYAnimation, new PropertyPath(Canvas.TopProperty));
MyStory.Children.Add(MyYAnimation);
MyStory.Begin(rect);
}
這段代碼是實現(xiàn)鼠標點擊方塊就動畫的移動到點擊的位置,但是如果你只是這樣寫你會發(fā)現(xiàn)一個問題,只在你點擊方塊的內(nèi)部會產(chǎn)生移動而在點擊外面是沒有效果的,為什么呢?因為我們加入Canvas的時候,如果不對其進行操作是只認為只有當(dāng)前控件占領(lǐng)的區(qū)域有效。解決辦法有:
1.在Xaml中加入一個無效的背景色那么就可以實現(xiàn)效果了。
[csharp] view plain copy
<Canvas Name="MyCanvas" Background="White" MouseDown="MyCanvas_MouseDown"/>
2.那就不用Canvas中的鼠標點擊函數(shù),而用窗體的鼠標點擊函數(shù)。這兩種方法的實現(xiàn)效果都是一樣的,當(dāng)然屬性動畫是不止DoubleAnimation的還有其他的屬性,比如PointAnimation等(不過一般都可以用DoubleAnimation來組合),想要深入了解可以上微軟的官網(wǎng)看相關(guān)的文檔(當(dāng)然我后續(xù)也會更新)。
以上的動畫效果我們學(xué)會了的話,那我們就可以完成主角的走動了,沒錯,很簡單吧!主角的走動只不過是圖片的位置的移動罷了,和上面的矩形是一個效果。但是光有角色的走動好似不行的,我們還需要在走動的時候不停的實現(xiàn)畫面的走動效果,還有技能效果。那么下面我們來介紹第二種動畫產(chǎn)生的方法。
2.定時器產(chǎn)生的動畫。
在WPF中定時器有Timer和DispatcherTimer兩種定時器,但是建議最好使用DispatcherTimer這個定時器。如果學(xué)過可視化編程并且進行過計時器使用的應(yīng)該都知道是個什么東西。顧名思義就是在一個規(guī)定的時間內(nèi)不停的觸發(fā)一個動作,在WPF里面就是在規(guī)定的時間間隔調(diào)用一個函數(shù),完成一個規(guī)定的動作。
[csharp] view plain copy
public MainWindow()
{
InitializeComponent();
Spirit = new Image();
Canvas.SetLeft(Spirit,0D);
Canvas.SetBottom(Spirit,150D);
MyCanvas.Children.Add(Spirit);
ResourceAdd();
//站立的計時器
DispatcherTimer StandTimer = new DispatcherTimer();
StandTimer.Interval = TimeSpan.FromMilliseconds(80);
StandTimer.Tick += new EventHandler(StandTimer_Tick);
StandTimer.IsEnabled = true;
StandTimer.Start();
計時器如果要不停的關(guān)停開啟的話我建議在加載函數(shù)或者這個函數(shù)里面申請,或者申請為全局變量。因為這樣可以避免我們在其他函數(shù)里面不停的申請,防止造成不可控制的錯誤,這樣我們只需要設(shè)置其IsEnable屬性或者調(diào)用Stop()函數(shù)即可控制計時器的關(guān)停和開啟。
[csharp] view plain copy
private void StandTimer_Tick(Object sender,EventArgs s)
{
if (!Is_Using_Skill)
{
switch (Go_Type)
{
case 0: //站立
{
for (int i = 0; i < Stand_Total_Count; i++)
{
if (i == Stand_Real_Count)
{
Spirit.Source = Stand[i];
Stand_Real_Count++;
if (Stand_Real_Count == Stand_Total_Count)