目录
@(外星人入侵(WPF编写))
引言
自学的C#,看了几本教材讲的都是程序代码,网上找的也有视屏,但都比较老了。只会打些代码为不晓得为什么要这样打感觉很别扭,在朋友的推荐下先选择了这本《Head First C#》先大致的了解下C#。
这本书的第一章我就遇见了问题,要装IDE选的是VS2012 for win8的,这完全和我的系统不配我是用的VS2017+win10,想着应该是一样的,但是没有找到windows store,我寻思着估计我只安装了for .NET没有安装windows平台通用的那个环境,要是选择在安装那个环境的话12G空间,懒得装。书上说明了使用WPF可以打大部分代码,那就将就着用吧!书上给了参考PDF的下载网址可是用*也连不上,打了前缀发现进了他们公司的主站。估计网址换了把,CSDN上也没找到那个PDF资源。自己瞎琢磨着来吧,这个博客是个记录,希望对你有用。
前期工作
- 打开VS,创建WPF窗体;
- 照书上一步一步来搭建界面,基本一样
-
搭建好了我们就来写代码,代码里面有点不一样我会说明的
代码编写
注意事项:
- 引用的地方:这里你会发现没有using windows.UI.Xaml;之类的引用。这是你没安装他的环境因而没有这些动态库。
解决方法:用using System.Windows.*,就行,你会发现其实去掉UI,Xaml其他字段都一样。- 关于事件里面没有PointerPressed和PointerMoved等等这个它可以发布到平台上平板也要用估计是他们把事件给优化了,不过不用慌,看得懂英文的就可以类推不就是个鼠标按压事件和鼠标移动事件吗?照着我们有的事件来就行。
解决方法:使用MouseDown和MouseMoved代替其他事件一样。- PlayArea_MouseMove函数里面有个Point的语句,是不是按照书上敲又报错了!这个我也不晓得为啥给可能还是环境的问题吧!.NET的WPF确实没有那几个函数。不过仔细读下就可以理解是获取PlayArea里面的鼠标位置,进行鼠标位置判断的。网上查了下WPF获取鼠标位置的几种方法这发现使用这种更合适跟简单,还不用像书上那样进行鼠标的转换,用e.GetPosition(playArea);直接就使用的是相对与playArea的鼠标位置。
解决办法:使用e.GetPosition()其他的倒没有什么问题,有问题留言,如果我可以帮助你的话。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
using System.Windows.Threading;
namespace SaveHuman
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
Random random = new Random();
DispatcherTimer enemyTimer = new DispatcherTimer();
DispatcherTimer targetTimer = new DispatcherTimer();
bool humanCaptured = false;
public MainWindow()
{
InitializeComponent();
enemyTimer.Tick += EnemyTimer_Tick;//2019.10.30 22点21分
enemyTimer.Interval = TimeSpan.FromSeconds(2);//2秒增加一个敌人
targetTimer.Tick += TargetTimer_Tick;
targetTimer.Interval = TimeSpan.FromSeconds(.1);//0.1秒执行一次
}
/// <summary>
/// 进度条计时器
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TargetTimer_Tick(object sender, EventArgs e)
{
progressBar.Value += 1;
if (progressBar.Value >= progressBar.Maximum)
{
EndTheGame();
}
}
/// <summary>
/// 游戏结束
/// </summary>
#region 游戏结束
private void EndTheGame()
{
if (!playArea.Children.Contains(gameoverText))
{
enemyTimer.Stop();
targetTimer.Stop();
humanCaptured = false;
starbutton.Visibility = Visibility.Visible;
playArea.Children.Add(gameoverText);
}
}
#endregion
/// <summary>
/// 添加敌人的计时器
/// </summary>
private void EnemyTimer_Tick(object sender, EventArgs e)
{
AddEnemy();
}
/// <summary>
/// 点击Star开始游戏
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Starbutton_Click(object sender, RoutedEventArgs e)
{
StarGame();
}
/// <summary>
/// 开始游戏初始化
/// </summary>
private void StarGame()
{
human.IsHitTestVisible = true;
humanCaptured = false;
progressBar.Value = 0;
starbutton.Visibility = Visibility.Collapsed;
playArea.Children.Clear();
playArea.Children.Add(target);
playArea.Children.Add(human);
enemyTimer.Start();
targetTimer.Start();
}
/// <summary>
/// 添加敌人
/// </summary>
private void AddEnemy()
{
ContentControl enemy = new ContentControl();
enemy.Template = Resources["EnemyTemplate"] as ControlTemplate;
AnimateEnemy(enemy, 0, playArea.ActualWidth - 100, "(Canvas.Left)");
AnimateEnemy(enemy, random.Next((int)playArea.ActualHeight - 100), random.Next((int)playArea.ActualHeight - 100), "(Canvas.Top)");
playArea.Children.Add(enemy);
enemy.MouseEnter += Enemy_MouseEnter;
}
/// <summary>
/// 鼠标进入敌人
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Enemy_MouseEnter(object sender, MouseEventArgs e)
{
if (humanCaptured)
{
EndTheGame();
}
}
/// <summary>
/// 动画函数
/// </summary>
/// <param name="enemy"></param>
/// <param name="from"></param>
/// <param name="to"></param>
/// <param name="propertyToAnimate"></param>
private void AnimateEnemy(ContentControl enemy, double from, double to, string propertyToAnimate)
{
Storyboard storyboard = new Storyboard() { AutoReverse = true, RepeatBehavior = RepeatBehavior.Forever };
DoubleAnimation animation = new DoubleAnimation()
{
From = from,
To = to,
Duration = new Duration(TimeSpan.FromSeconds(random.Next(4, 6)))
};
Storyboard.SetTarget(animation, enemy);
Storyboard.SetTargetProperty(animation, new PropertyPath(propertyToAnimate));
storyboard.Children.Add(animation);
storyboard.Begin();
}
/// <summary>
/// 人类是否到达目的地的判断
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Target_MouseEnter(object sender, MouseEventArgs e)
{
if(targetTimer.IsEnabled && humanCaptured)
{
progressBar.Value = 0;
Canvas.SetLeft(target, random.Next(100, (int)playArea.ActualWidth - 100));
Canvas.SetTop(target, random.Next(100, (int)playArea.ActualHeight - 100));
Canvas.SetLeft(human, random.Next(100, (int)playArea.ActualWidth - 100));
Canvas.SetTop(human, random.Next(100, (int)playArea.ActualHeight - 100));
humanCaptured = false;
human.IsHitTestVisible = true;
}
}
/// <summary>
/// 鼠标在游戏区域移动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void PlayArea_MouseMove(object sender, MouseEventArgs e)
{
if (humanCaptured)
{
//获取鼠标相对于palyArea的位置,无需书上的转换这是wpf与windows Store的不同
//对于这个不理解可以把playArea改为null试试看看区别就晓得了
Point pointerProsition = e.GetPosition(playArea);
if((Math.Abs(pointerProsition.X-Canvas.GetLeft(human))>human.ActualWidth*3) || (Math.Abs(pointerProsition.Y - Canvas.GetTop(human)) > human.ActualHeight * 3))
{
humanCaptured = false;
human.IsHitTestVisible = true;
}
else
{
Canvas.SetLeft(human, pointerProsition.X - human.ActualWidth / 2);
Canvas.SetTop(human, pointerProsition.Y - human.ActualHeight / 2);
}
}
}
/// <summary>
/// 鼠标拖着人类离开游戏区域
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void PlayArea_MouseLeave(object sender, MouseEventArgs e)
{
if (humanCaptured)
{
EndTheGame();
}
}
/// <summary>
/// 鼠标左键点击人类的事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Human_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
if (enemyTimer.IsEnabled)
{
humanCaptured = true;
human.IsHitTestVisible = false;
//Console.WriteLine("鼠标按下选中状态:" + humanCaptured);
}
}
}
}
只要努力没有什么困难可以难倒你,加油骚年!
————————————————————————————————Boting_ISME