原文:2018-8-10-win10-uwp-商业游戏-

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 ,在这个版本发布之后,还会继续开发,但是就不在这篇文章更新了。

下面是相关文章

感谢

walterlv

JAKE

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

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

2018-8-10-win10-uwp-商业游戏-的更多相关文章

  1. win10 uwp 商业游戏 1.2.1

    上一个游戏已经告诉大家如何写多个游戏,现在继续写这个无聊的游戏 希望大家在看这篇文章之前先看win10 uwp 商业游戏,在这个文章告诉了大家如何创建游戏. 修改数值 可以从上一篇的博客的游戏看到升级 ...

  2. win10 uwp 商业游戏

    本文告诉大家去做一个商业游戏,游戏很简单,几乎没有什么技术 游戏的开始,需要添加框架库,于是引用我自己写的库. 首先是创建一个启动页面,这个页面是显示启动的. 在显示启动的时候,是需要加载游戏需要使用 ...

  3. win10 uwp 商业游戏 1.1.5

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

  4. win10 uwp 萤火虫效果

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

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

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

  6. win10 uwp 列表模板选择器

    本文主要讲ListView等列表可以根据内容不同,使用不同模板的列表模板选择器,DataTemplateSelector. 如果在 UWP 需要定义某些列的显示和其他列不同,或者某些行的显示和其他行不 ...

  7. win10 uwp MVVM 轻量框架

    如果在开发过程,遇到多个页面之间,需要传输信息,那么可能遇到设计的问题.如果因为一个页面内包含多个子页面和多个子页面之间的通信问题找不到一个好的解决方法,那么请看本文.如果因为ViewModel代码越 ...

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

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

  9. win10 uwp 毛玻璃

    毛玻璃在UWP很简单,不会和WPF那样伤性能. 本文告诉大家,如何在 UWP 使用 win2d 做毛玻璃. 毛玻璃可以使用 win2D 方法,也可以使用 Compositor . 使用 win2d 得 ...

  10. win10 uwp 读取保存WriteableBitmap 、BitmapImage

    我们在UWP,经常使用的图片,数据结构就是 BitmapImage 和 WriteableBitmap.关于 BitmapImage 和 WriteableBitmap 区别,我就不在这里说.主要说的 ...

随机推荐

  1. [CodeForces - 1272D] Remove One Element 【线性dp】

    [CodeForces - 1272D] Remove One Element [线性dp] 标签:题解 codeforces题解 dp 线性dp 题目描述 Time limit 2000 ms Me ...

  2. IT兄弟连 HTML5教程 HTML5的基本语法 小结及习题

    小结 一个完整的HTML文件由标题.段落.列表.表格.文本,即嵌入的各种对象所组成,这些逻辑上统一的对象称为元素.HTML文档主体结构分为两部分,一部分是定义文档类型,另一部分则是定义文档主体的结构框 ...

  3. C 语言输出不同颜色字体

    C 语言输出不同颜色字体 \033是8进制,它就是unix下终端转义符ESC(16进制1A,10进制27) ESC[xm 是unix下改变终端输出颜色的命令 所以,如果是红色,则我们定义为\033[0 ...

  4. 【朝花夕拾】Android自定义View篇之(四)自定义View的三种实现方式及自定义属性使用介绍

    前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/10979161.html],谢谢! 尽管Android系统提供了不少控件,但是有很多酷炫效果仍然 ...

  5. Mybatis的原理分析1(@Mapper是如何生效的)

    接着我们上次说的SpringBoot自动加载原理.我们大概明白了在maven中引入mybatis后,这个模块是如下加载的. 可能会有人问了,一般我们的dao层都是通过Mapper接口+Mapper.x ...

  6. 解决NuGet下载太慢的问题

    以下载CefSharp.Wpf v57.0.0版本为例: 1.打开NuGet官网:https://www.nuget.org/ 2.输入CefSharp.Wpf,点击查询,如下所示: 3.确认版本正确 ...

  7. JMeter命令行执行+生成HTML报告

    1.为什么用命令行模式 使用GUI方式启动jmeter,运行线程较多的测试时,会造成内存和CPU的大量消耗,导致客户机卡死: 所以一般采用的方式是在GUI模式下调整测试脚本,再用命令行模式执行: 命令 ...

  8. vue-svgicon基本使用

    在项目开发中,经常会用到svg图标,之前用的都是vue-svg-icon,最近在npm中搜索svg图标解析插件,发现vue-svgicon用的相对较多,对比以下,vue-svgicon用法较为灵活,方 ...

  9. vue小案例--简易评论区

    一.小案例(评论区) 1.流程 (1)分析静态页面.(vue项目创建参考https://www.cnblogs.com/l-y-h/p/11241503.html)(2)拆分静态页面,变成一个个组件. ...

  10. Kafka与RabbitMQ对比

    Infi-chu: http://www.cnblogs.com/Infi-chu/ Kafka是LinkedIn在2012年发布的开源的消息发布订阅系统,他主要用于处理活跃的流式数据.大数据量的数据 ...