原文: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. lombok深入实践

    官网视频 官网地址:https://projectlombok.org 官网的首页视频演示在eclipse中如何使用Lombok; Project Lombok is a java library t ...

  2. 通过jgit一次性升级fastjson版本

    背景:笔者所在公司经历了三次fastjson的升级,由于集群,工程数量众多,每次升级都很麻烦.因此开发了一个java的升级工具. 功能介绍: 功能介绍:一个jar文件,通过java -jar命令,输入 ...

  3. DOM介绍以及使用方法

    DOM的基本讲解 一.DOM (Document Object Model)文档对象模型 1.有属性有方法 var person = { name:'派大星', fav:function(){ } } ...

  4. git命令教程

    git教程笔记 Git是什么? Git是一个分布式版本控制系统 版本控制方式 集中式版本控制:从版本库中先取得最新的版本,改完之后再上传到版本库中,需要联网 分布式版本控制:每个合作者电脑上都有一个版 ...

  5. SSM框架之Spring(5)JdbcTemplate及spring事务控制

    Spring(5)JdbcTemplate及spring事务控制 ##1.JdbcTmeplate 它是 spring 框架中提供的一个对象,是对原始 Jdbc API 对象的简单封装.spring ...

  6. CSS学习笔记-2D转换模块

    2D转换模块:    1.旋转        1.1格式:            transform:rotate(45deg);        1.2含义:            表示旋转多少度   ...

  7. Docker-核心笔记(含Dockerfile,Compose)

    Docker-核心笔记(含Dockerfile,Compose) 2017/03 Chenxin 参考 https://yeasy.gitbooks.io/docker_practice Docker ...

  8. 转战物联网·基础篇09-选择MQTT协议还是CoAP协议

      前面章节介绍过,MQTT协议和CoAP协议都是物联网中比较流行的协议,都对传输量做了很大的精简,传输开销小,以适应物理网的网络环境.   XMPP协议也有人说是适合物联网通信的,但它是基于XML, ...

  9. Saltstack_实战指南01_系统规划

    1. 实战项目GitHub地址 之前<Saltstack_使用指南>详细讲解了saltstack的使用.那么从这节开始实战讲解,当然不会再像之前那样详细说明了.只是讲一些系统规划之类的信息 ...

  10. mysql主从配置实现一主一从读写分离

    主从介绍Mysql主从又叫Replication.AB复制.简单讲就是A与B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,实现数据实时同步mysql主从是基于binlog,主上需开启bin ...