title author date CreateTime categories
win10 uwp 商业游戏
lindexi
2018-08-10 19:16:50 +0800
2018-2-13 17:23:3 +0800
Win10 UWP

本文告诉大家去做一个商业游戏,游戏很简单,几乎没有什么技术。

游戏的开始,需要添加框架库,于是引用我自己写的库。

首先是创建一个启动页面,这个页面是显示启动的。

在显示启动的时候,是需要加载游戏需要使用的资源,如果觉得这时需要控制进度条,就需要使用注入的方法,给他知道现在的进度,不过我现在不去做这里,于是就很简单的代码做出来启动页面。

现在的启动页还是空的,但是先不管他。

然后开始写一个欢迎页面,也就是开始游戏、继续、帮助等的页面,暂时先不做。

但是写了这么多,都不需要在 MainPage 写一个代码,现在就到了在 MainPage 开始写代码,这时的代码就是添加一个 Frame 作为跳转,和一个菜单。当然菜单现在还没东西,只是需要添加到这里。

看下,现在已经创建了两个页面。一个是启动页,一个是欢迎页。

接着开始做游戏的主页面,请注意,在写的时候,一个页面都是对应一个视图。可以看到在写的时候,不需要去管两个页面之间的逻辑。当然现在也无法管。

可以知道游戏的主页面需要有仓库、买东西的店铺、买东西的地方和工厂。

那么需要想游戏是如何玩的。

因为这个游戏是我昨天看到买菜的人说的,我就想去做一个。

首先物品有很多,而且可以通过工厂把低级的物品转为高级的物品。

物品包括

种子
小米
麦
面
面包
番薯
矿石
铁
铜
木头
石
矿
碳
煤
锄头
椅子
桌子
雕刻刀
大刀
弓箭

如果还有想到其他的物品,欢迎告诉我。不过在看完之前,请不要很快的告诉我,你希望添加那些物品,请在知道游戏如何玩之后在告诉我,你喜欢的物品。

物品是包括当前价格和市场价格,其中当前价格是不变的,而市场价格是会在 80%-120% 之间波动。

开始说游戏的商店是如何卖东西的,游戏使用的商店是可以通过市场买东西,然后把东西买个买东西的人。商店可以有很多个,当然,现在做的只有一个。商店存在信誉,商店来的客人数是不固定,和商店所在地方和商店信誉有关。如果一个地方人很多那么来商店的人会很多。如果商店信誉很好,来商店的人很多。

一个买东西的人,会告诉商店他买的是有哪些,数量,希望买的价格。买的价格就是市场价格,市场价格总是变化,需要在每个时间决定是否买入。

所以商店的输入按钮现在就有了一个,下一时间,也就是在这个时间是否有买东西的人过来,是否决定要从市场买东西。

所以点击一下按钮,就可以获得当前有多少个买东西的过来,处理完之后在去市场买东西。

买东西的人过来,就会说他现在需要买什么,当然游戏一开始不会立刻就出现高级的人来买比较大的东西。来买东西的人是有分等级的,也就是他有多少钱,于是按照钱判断他现在可以买多少东西。

如果商店存在他可以买的东西,如商店现在有东西

种子 2
小米 10
麦   10
面   2

他想买东西是

种子 1
小米 2
麦   3

于是刚好都可以买入,于是顾客就会给满分,因为他想要的商店可以买到所有他想要的东西。于是商店加信誉1。

一个人总的带来信誉 是这样计算,他想要的商品价格可以获得数

 var s = 买东西人买东西加起来的所有价值 var a = 商店提供商品总价格带来信誉 = 2 * a / s - 1

如果只能满足买东西人一半的需要,那么不会带来任何的信誉提升。

于是在点击下一时间,就开始计算有多少买东西的人,他们有多少钱,所以需要物品这个类给出他可以被改变的概率,通过他的钱就可以算出。于是物品需要的属性就可以得到,物品名、物品需要多少钱,物品总量。现在物品的总量可以不计算。

来买东西的人有这些属性,所有的钱,级别。买的东西。级别就是商店有多少信誉在可以吸引这个买东西的人,这里写为一个列表

但是开始先做一个简单的程序,之后在添加比较多功能。

界面

游戏的界面很重要,但是我就写一个简单的界面。我先给界面的截图,可以看到这个界面很简单,就是一个列表和一些按钮

列表有个问题,如何做表头,实际我也没办法,于是用了下面的代码

                <ListView Grid.Row="1" ItemsSource="{x:Bind View.PropertyStorage}"SelectedItem="{Binding CarloPiperIsaacProperty,Mode=TwoWay}"><FrameworkElement.Resources><Style TargetType="TextBlock"><Setter Property="HorizontalAlignment" Value="Center"></Setter></Style></FrameworkElement.Resources><ListView.ItemContainerStyle><Style TargetType="ListViewItem"><Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter></Style></ListView.ItemContainerStyle><ListView.Header><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="30*"></ColumnDefinition><ColumnDefinition Width="15*"></ColumnDefinition><ColumnDefinition Width="15*"></ColumnDefinition><ColumnDefinition Width="15*"></ColumnDefinition></Grid.ColumnDefinitions><TextBlock Text="名称"></TextBlock><TextBlock Grid.Column="1" Text="价格"></TextBlock><TextBlock Grid.Column="2" Text="仓库拥有"></TextBlock><TextBlock Grid.Column="3" Text="买入价钱"></TextBlock></Grid></ListView.Header><ListView.ItemTemplate><DataTemplate x:DataType="view:Property"><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="30*"></ColumnDefinition><ColumnDefinition Width="15*"></ColumnDefinition><ColumnDefinition Width="15*"></ColumnDefinition><ColumnDefinition Width="15*"></ColumnDefinition></Grid.ColumnDefinitions><FrameworkElement.Resources><Style TargetType="TextBlock"><Setter Property="HorizontalAlignment" Value="Center"></Setter></Style></FrameworkElement.Resources><TextBlock Text="{x:Bind Name}"></TextBlock><TextBlock Grid.Column="1" Text="{x:Bind Price,Mode=OneWay}"></TextBlock><TextBlock Grid.Column="2" Text="{x:Bind Num,Mode=OneWay}"></TextBlock><TextBlock Grid.Column="3" Text="{x:Bind AshliLyverGeraldo,Mode=OneWay}"></TextBlock></Grid></DataTemplate></ListView.ItemTemplate></ListView>

上面代码为了让列表不压缩宽,于是就需要使用 ItemContainerStyle ,请看代码

                 <ListView.ItemContainerStyle><Style TargetType="ListViewItem"><Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter></Style></ListView.ItemContainerStyle>

为了让列表所有文字都居中,不想写给每个文字,但是列表之外的文字就不居中,于是修改列表内文字的居中就可以使用下面代码

<FrameworkElement.Resources><Style TargetType="TextBlock"><Setter Property="HorizontalAlignment" Value="Center"></Setter></Style></FrameworkElement.Resources>

这样在列表内的文字就会居中,而列表外的文字就不会居中。

如果在列表使用 x:bind 那么需要使用 DataType 来告诉绑定的类型,所以需要数据的类型是什么,不然就无法通过。所以在写列表之前还需要定义好数据,于是让我来告诉大家这个游戏需要的数据。

然后就需要开始绑定进去了,不过这时发现游戏需要的数据很简单,暂时我就不继续写代码,如果需要代码,请看 VarietyHiggstGushed

添加图标

可以看到,上面的界面没有图标,看起来不好看,所以需要给他添加一些图标。图标可以到 http://www.iconfont.cn/ 下载,在这里下载需要注意版权问题,不过我的这个在下载的时候就有看了,好像是不需要给钱。

首先把图片放在 Assest 文件夹,然后就可以设置出来了。

            <Grid><StackPanel Orientation="Horizontal"HorizontalAlignment="Right"><FrameworkElement.Resources><Style TargetType="StackPanel"><Setter Property="Margin" Value="10,10,10,10"></Setter></Style></FrameworkElement.Resources><StackPanel Orientation="Horizontal"><Image Source="ms-appx:///Assets/天.png" Height="20" Width="20"></Image><TextBlock Text="天数"></TextBlock><TextBlock Text="{x:Bind View.PinkieDuchesneGeraldo,Mode=OneWay}"></TextBlock></StackPanel><StackPanel Orientation="Horizontal"><Image Source="ms-appx:///Assets/仓库.png" Height="20" Width="20"></Image><TextBlock Text="仓库容量"></TextBlock><TextBlock Text="{x:Bind View.JwStorage.Transit,Mode=OneWay}"/><TextBlock Text="/"></TextBlock><TextBlock Text="{x:Bind View.JwStorage.TransitStorage,Mode=OneWay}"></TextBlock></StackPanel><StackPanel Orientation="Horizontal"><TextBlock Text="金钱"></TextBlock><TextBlock Text="{x:Bind View.JwStorage.TranStoragePrice,Mode=OneWay}"></TextBlock></StackPanel></StackPanel></Grid>

可以看到图片的写法 Source 的值是使用ms-appx,这里就是从资源获得,如果希望知道这个代码是如何写,我有博客win10 uwp 访问解决方案文件 里面就告诉大家如何写。

注意需要设置图片的大小,可以运行程序,然后开始设置,这样界面就可以看到修改,但是需要保存才可以看到。

可以看到原来的代码是 VarietyHiggstGushed 买东西的界面看起来不好

下面就需要修改这个,修改为一个好看的

可以使用 ContentDialog 弹出一个好看的界面

那么如何做这个界面,简单的方法是做一个用户控件,这个控件的界面很简单,但是后台需要写一些属性,这个属性就是买入的当前,买入最大值,对应还有卖出的。

于是这个界面的后台代码就是几个属性,还有在设置 ViewModel 时更新属性

  public sealed partial class JediahPage : UserControl{public JediahPage(){this.InitializeComponent();}public StorageModel ViewModel{get { return _viewModel; }set{_viewModel = value;//最大可以买NewLansheehyBrunaSharon = (int) Math.Floor(_viewModel.JwStorage.TranStoragePrice /_viewModel.CarloPiperIsaacProperty.Price);var sresidue = _viewModel.JwStorage.TransitStorage - _viewModel.JwStorage.Transit;NewLansheehyBrunaSharon = NewLansheehyBrunaSharon > sresidue ? sresidue : NewLansheehyBrunaSharon;AimeeLansheehyBrunaSharon = _viewModel.CarloPiperIsaacProperty.Num;}}public static readonly DependencyProperty NewLansheehyBrunaSharonNumProperty = DependencyProperty.Register("NewLansheehyBrunaSharonNum", typeof(int), typeof(JediahPage), new PropertyMetadata(default(int)));public int NewLansheehyBrunaSharonNum{get { return (int) GetValue(NewLansheehyBrunaSharonNumProperty); }set { SetValue(NewLansheehyBrunaSharonNumProperty, value); }}public static readonly DependencyProperty NewLansheehyBrunaSharonProperty = DependencyProperty.Register("NewLansheehyBrunaSharon", typeof(int), typeof(JediahPage), new PropertyMetadata(default(int)));public int NewLansheehyBrunaSharon{get { return (int) GetValue(NewLansheehyBrunaSharonProperty); }set { SetValue(NewLansheehyBrunaSharonProperty, value); }}public static readonly DependencyProperty AimeeLansheehyBrunaSharonNumProperty = DependencyProperty.Register("AimeeLansheehyBrunaSharonNum", typeof(int), typeof(JediahPage), new PropertyMetadata(default(int)));public int AimeeLansheehyBrunaSharonNum{get { return (int) GetValue(AimeeLansheehyBrunaSharonNumProperty); }set { SetValue(AimeeLansheehyBrunaSharonNumProperty, value); }}public static readonly DependencyProperty AimeeLansheehyBrunaSharonProperty = DependencyProperty.Register("AimeeLansheehyBrunaSharon", typeof(int), typeof(JediahPage), new PropertyMetadata(default(int)));private StorageModel _viewModel;public int AimeeLansheehyBrunaSharon{get { return (int) GetValue(AimeeLansheehyBrunaSharonProperty); }set { SetValue(AimeeLansheehyBrunaSharonProperty, value); }}public event EventHandler Close;private void NewLansheehy(object sender, RoutedEventArgs e){ViewModel.LansheehyBrunaSharon = NewLansheehyBrunaSharonNum;ViewModel.NewLansheehyBrunaSharon();Close?.Invoke(this, null);}private void AimeeLansheehy(object sender, RoutedEventArgs e){ViewModel.LansheehyBrunaSharon = AimeeLansheehyBrunaSharonNum;ViewModel.AimeeLansheehyBrunaSharon();Close?.Invoke(this, null);}private void MnewBruna(object sender, RoutedEventArgs e){NewLansheehyBrunaSharonNum = NewLansheehyBrunaSharon;}private void MaimeeBruna(object sender, RoutedEventArgs e){AimeeLansheehyBrunaSharonNum = AimeeLansheehyBrunaSharon;}private void CloseButton_OnClick(object sender, RoutedEventArgs e){Close?.Invoke(this, null);}}

界面代码很简单

    <Grid ><Grid Margin="10,10,10,10"><Grid.RowDefinitions><RowDefinition Height="auto" /><RowDefinition Height="64*" /></Grid.RowDefinitions><Grid><Button FontFamily="Segoe MDL2 Assets" Content="" HorizontalAlignment="Right"Click="CloseButton_OnClick"></Button></Grid><Grid Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center"><Grid><Grid.RowDefinitions><RowDefinition Height="64*" /><RowDefinition Height="auto" /><RowDefinition Height="auto" /><RowDefinition Height="100*" /></Grid.RowDefinitions><Grid><TextBlock Text="{x:Bind ViewModel.CarloPiperIsaacProperty.Name}"></TextBlock></Grid><Grid Grid.Row="1"><StackPanel Orientation="Horizontal"><Image Source="ms-appx:///Assets/仓库.png" Height="20" Width="20"></Image><TextBlock Text="仓库拥有:"></TextBlock><TextBlock Text="{x:Bind ViewModel.CarloPiperIsaacProperty.Num}"></TextBlock></StackPanel></Grid><Grid Width="300" Grid.Row="2"><StackPanel Orientation="Horizontal"><TextBlock Text="$"></TextBlock><TextBlock Text="买入价格"></TextBlock><TextBlock Text="{x:Bind ViewModel.CarloPiperIsaacProperty.AshliLyverGeraldo,Converter={StaticResource ConverDoubleStr}}"></TextBlock></StackPanel><StackPanel Orientation="Horizontal"HorizontalAlignment="Right"><TextBlock Text="$"></TextBlock><TextBlock Text="市场价格"></TextBlock><TextBlock Text="{x:Bind ViewModel.CarloPiperIsaacProperty.Price}"></TextBlock></StackPanel></Grid><Grid Grid.Row="3"><Grid.RowDefinitions><RowDefinition Height="74*" /><RowDefinition Height="85*" /></Grid.RowDefinitions><Grid><Grid.ColumnDefinitions><ColumnDefinition Width="307*" /><ColumnDefinition Width="auto" /></Grid.ColumnDefinitions><Slider Margin="10,10,10,10"Value="{x:Bind NewLansheehyBrunaSharonNum,Mode=TwoWay,Converter={StaticResource ResourceKey=Convert}}"Maximum="{x:Bind NewLansheehyBrunaSharon}"></Slider><StackPanel Grid.Column="1" Orientation="Horizontal"><Button Content="max" Click="MnewBruna"></Button><Button Content="买入" Click="NewLansheehy"></Button></StackPanel></Grid><Grid Grid.Row="1"><Grid.ColumnDefinitions><ColumnDefinition Width="59*" /><ColumnDefinition Width="auto" /></Grid.ColumnDefinitions><Slider Margin="10,10,10,10"Value="{x:Bind AimeeLansheehyBrunaSharonNum,Mode=TwoWay,Converter={StaticResource Convert}}"Maximum="{x:Bind AimeeLansheehyBrunaSharon}"></Slider><StackPanel Grid.Column="1" Orientation="Horizontal"><Button Content="max" Click="MaimeeBruna"></Button><Button Content="卖出" Click="AimeeLansheehy"></Button></StackPanel></Grid></Grid></Grid></Grid></Grid></Grid>

可以看到需要两个转换器,一个是把字符串转 double 一个是显示 double 保留小数后两位,这个实现很简单,我就不说了。那么接下来就是使用这个界面,使用方法请看下面。

            var temp = new JediahPage(){ViewModel = View,};ContentDialog contentDialog = new ContentDialog(){Content = temp,IsPrimaryButtonEnabled = false,IsSecondaryButtonEnabled = false,};temp.Close += (s, args) => contentDialog.Hide();await contentDialog.ShowAsync();

主要注意把 close 事件写在显示前,然后去掉默认的按钮。

大概这样就可以运行了,其他的代码不是重要的,所以就不说啦。现在我把游戏发在微软商店,点击下载。

这就是商业游戏 1.0.75 ,在这个版本发布之后,还会继续开发,但是就不在这篇文章更新了。

下面是相关文章

  • win10 uwp 商业游戏

  • win10 uwp 商业游戏 1.1.5

  • win10 uwp 商业游戏 1.2.1

感谢

walterlv

JAKE

落書き https://www.pixiv.net/member_illust.php?mode=medium&illust_id=64830430

欢迎大家来我的博客,现在csdn的博客文章发布了就不再编辑,如果希望看最新的文章,请到我的博客。本文也发在博客园备份,如果大家有什么建议,请在博客下面评论。

2018-8-10-win10-uwp-商业游戏-相关推荐

  1. win10 uwp 商业游戏 1.1.5

    本文是在win10 uwp 商业游戏 基础上继续开发,添加一些无聊的游戏 因为在发布几个月,下载量很少,小伙伴说游戏就玩不到几分钟就不想玩,于是我就想加入其他游戏 下面我来告诉大家如何在游戏中添加多个 ...

  2. win10 uwp 使用 Microsoft.Graph 发送邮件

    在 2018 年 10 月 13 号参加了 张队长 的 Office 365 训练营 学习如何开发 Office 365 插件和 OAuth 2.0 开发,于是我就使用 UWP 尝试使用 Micros ...

  3. win10 uwp 萤火虫效果

    本文在Nukepayload2指导下,使用他的思想用C#写出来. 本文告诉大家,如何使用 win2d 做出萤火虫效果. 安装 win2d 安装win2d的方法请使用 Nuget 下载的方法,参见:wi ...

  4. win10 uwp 毛玻璃

    原文:win10 uwp 毛玻璃 版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问.如果当前博客图片看不到,请到 http://lindexi.gitee.io 访问博 ...

  5. win10 uwp 打包第三方字体到应用

    原文:win10 uwp 打包第三方字体到应用 有时候我们会把一些特殊字体打包到软件,因为如果找不到我们的字体会变为默认,现在很多字体图标我们用得好,有时候我们的应用会用很漂亮的字体,需要我们自己打包 ...

  6. win10 uwp 线程池

    win10 uwp 线程池 原文:win10 uwp 线程池 如果大家有开发 WPF 或以前的程序,大概知道线程池不是 UWP 创造的,实际上在很多技术都用到线程池. 为什么需要线程池,他是什么?如何 ...

  7. win10 uwp 如何判断一个对象被移除

    win10 uwp 如何判断一个对象被移除 原文:win10 uwp 如何判断一个对象被移除 有时候需要知道某个元素是否已经被移除,在优化内存的时候,有时候无法判断一个元素是否在某个地方被引用,就需要 ...

  8. win10 UWP Controls by function

    Windows的 XAML UI 框架提供了很多控件,支持用户界面开发库. 我现在做的一个中文版的,很多都是照着微软写,除了注释 我们先学微软做一个简单的frame,新建Page,里面放title和跳 ...

  9. win10 uwp 获得元素绝对坐标

    有时候需要获得一个元素,相对窗口的坐标,在修改他的位置可以使用. 那么 UWP 如何获得元素坐标? 我提供了一个方法,可以获得元素的坐标. 首先需要获得元素,如果没有获得元素,那么如何得到他的坐标? ...

  10. win10 uwp 手把手教你使用 asp dotnet core 做 cs 程序

    本文是一个非常简单的博客,让大家知道如何使用 asp dot net core 做后台,使用 UWP 或 WPF 等做前台. 本文因为没有什么业务,也不想做管理系统,所以看到起来是很简单. Visua ...

最新文章

  1. 5G服务可以解决的4个企业WAN挑战 - vecloud
  2. VTK:Cell3D演示用法实战
  3. 动态内存(Dynamic Memory),微软的内存过量分配技术?
  4. 使用多行sql字符串时,要注意不要忽略了空格
  5. CSS之Multi-columns的column-gap和column-rule
  6. android滑动菜单图标,Android实现简单底部导航栏 Android仿微信滑动切换效果
  7. 计算机数据恢复报告单,计算机数据恢复第三章MBR引导分析篇
  8. c语言定义字符数组数码管,数组数码管
  9. 树莓派zero配置打印机
  10. Multidimensional Scaling (MDS)
  11. Modelbuilder快速入门
  12. QEMU中音频模拟工作过程(十)
  13. python调用py文件并传参数_Python 参数传引用还是传值?
  14. CentOS 5.4安装rar
  15. 拓扑排序 codevs 4040 cojs 438
  16. oracle 数据库备份脚本
  17. Fluent Meshing的workflow方法
  18. python实现excel计算_用python实现简单EXCEL数据统计的实例
  19. cocos2d-x 3.2 |飞机大战:碰撞与分数
  20. 三菱GX Developer+GX Simulator进行仿真调试

热门文章

  1. 笔记本电脑运行特别慢怎么解决
  2. Android视频添加时间水印
  3. sql server数据库卡问题排查
  4. 新手安装hadoop教程和个人遇到的错误及解决办法(错误:./hadoop-daemon.sh start journalnode用不了和WARNING: HADOOP_SECURE_DN_USER)
  5. 创业企业如何定制商业模式:把握不同行业生命周期,9大要素集中进行创新【转】...
  6. 天津理工大学计算机学院绩点,天津理工大学花宇杰:平均绩点4.0你该这般青春昂扬...
  7. HM编码器代码阅读(15)——帧间预测之AMVP模式(三)xGetBlkBits函数
  8. 利用python的scrapy框架爬取google搜索结果页面内容
  9. 你好,再见;你好,幸会!
  10. Contest3145 - 2021级新生个人训练赛第37场_A: 奖品