《Head First C#》外星人入侵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

《Head First C#》外星人入侵WPF编写源码的更多相关文章
- 通过解读 WPF 触摸源码,分析 WPF 插拔设备触摸失效的问题(问题篇)
在 .NET Framework 4.7 以前,WPF 程序的触摸处理是基于操作系统组件但又自成一套的,这其实也为其各种各样的触摸失效问题埋下了伏笔.再加上它出现得比较早,触摸失效问题也变得更加难以解 ...
- Java开发在线考试系统 使用ssh框架编写源码
开发工具: Eclipse, Tomcat, MySql 1. 登录页面登录功能, 输入用户名与密码, 选择角色, 滑动箭头拉到最右边才可以点击登录 2. 学生角色登录 ...
- 2014年4月份第2周51Aspx源码发布详情
HFC代码转化工具源码 2014-4-8 [VS2010]源码描述:HFC代码转化工具源码 1.主要实现HTML代码转化为C#或者JS代码,为我们平时编码节省时间. 2.把代码复制到面板上,通过右键 ...
- TextView 的新特性,Autosizing 到底是如何实现的? | 源码分析
一.前言 Hi,大家好,我是承香墨影! 前两天聊了一下 Autosizing 的使用,反映还不错.毕竟是这种能解决实际问题的新 Api,确实在需要的时候,用起来会很顺手. 简单回顾一下,Autosiz ...
- c#源码如何生成托管代码块
1.使用编程语言编写源码--->编程语言的编译器(面向Clr)---->生成IL代码和元数据(包含:代码中声名的类和成员 以及所引用的成员) 2.IL就被称之为托管代码,因为有Clr管理者 ...
- Spark Streaming updateStateByKey案例实战和内幕源码解密
本节课程主要分二个部分: 一.Spark Streaming updateStateByKey案例实战二.Spark Streaming updateStateByKey源码解密 第一部分: upda ...
- 源码管理--llorch的Visual Studio基本教程(四)
通用的演示样例说明: 本系列博客仅仅讨论工具的基础,不讨论不论什么语言. 甚至不讨论快捷键:-) 能够用鼠标就完毕本教程 IDE默认指代的是Visual Studio 2013 Community E ...
- WPF学习开发客户端软件-任务助手(已上传源码)
本人纯属WPF新手,布局和WPF的开发水平相当欠缺,从个人来说,还是比较喜欢WPF的,有人说WPF是界面加上WINFORM,我不这样认为,WPF与WINFORM主要的不同在于数据绑定. 这个软件虽 ...
- 图片按日期分类和查看程序(WPF开发)(附源码)
手机方便了我们的生活,可以随时随地拍摄.越来越多的图片堆砌在电脑里.看到杂乱无章的图片,实在感到头痛.手动整理太复杂.基于此,我写了一个小程序,可以将图片按日期整理和查看.按日期查看图片,回忆过去的点 ...
随机推荐
- 【oracle】PLS-00103: 出现符号 "end-of-file"
begin xxxxx end; 修改xxxxx为xxxxx:就好了
- Django信号机制相关解释与示例
Django 信号# django自带一套信号机制来帮助我们在框架的不同位置之间传递信息.也就是说,当某一事件发生时,信号系统可以允许一个或多个发送者(senders)将通知或信号(signals)发 ...
- Spring 中的观察者模式
一.Spring 中观察者模式的四个角色 1. 事件(ApplicationEvent) ApplicationEvent 是所有事件对象的父类.ApplicationEvent 继承自 jdk 的 ...
- HashMap如何在Java中工作?
通过优锐课学习笔记分享,我们可以看到HashMap问题在工作面试中很常见. 这也是HashMaps在Java内部如何工作的一些深入说明,分享给大家参考学习. HashMap在内部如何工作已成为几乎所有 ...
- 38条技巧优化PHP代码,来复习总结下吧
1.如果一个方法能被静态,那就声明他为静态的,速度可提高1/4; 2.echo的效率高于print,因为echo没有返回值,print返回一个整型; 3.在循环之前设置循环的最大次数,而非在在循环中; ...
- 【HTML】---常用标签(1)
Html常用标签(1) 重新整理学习下前端知识从Html标签开始.我们先看HTML 骨架格式: <!DOCTYPE html> <!--这句话就是告诉我们使用哪个html版本--&g ...
- C#函数的递归
using System; namespace ConsoleApp3 { class Program { static void Main(string[] args) { ); Console.W ...
- Java并发专题
——参考于码农求职小助手公众号 1.并行和并发有什么区别? 1. 并行是指两个或者多个事件在同一时刻发生:而并发是指两个或多个事件在同一时间间隔发生: 2. 并行是在不同实体上的多个事件,并发是在同一 ...
- [PHP] 解决php中上传大文件的错误
修改nginx配置文件,下面这个参数client_max_body_size 110M; 修改php配置文件中下面两个参数在php.ini中找到下面两个配置,配置项给改大,如果找不到php.ini的位 ...
- ORA-29861: 域索引标记为 LOADING/FAILED/UNUSABLE
解决方法:select idx_name,idx_status from ctxsys.ctx_indexes;需要重建同步全文索引:alter index 索引名 rebuild online ...