原文: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. Java死锁演示

    Java死锁演示 在线程中嵌套获取锁导致死锁.思路,尽量不要嵌套获取锁. package com.mozq.demo.demo; public class DeadLockDemo { private ...

  2. 用dotnet core搭建web服务器(二)路由表与封装

    https://gitee.com/lightsever/netcore_study/tree/master/server02_path 先上代码,首先我们把httpserver封装一下,以后用起来方 ...

  3. salt-api 获取服务器信息,minion批量执行cmd命令

    import requests import json try: import cookielib except: import http.cookiejar as cookielib # 使用url ...

  4. C语言程序设计100例之(19):欢乐的跳

    例19   欢乐的跳 题目描述 一个n个元素的整数数组,如果数组两个连续元素之间差的绝对值包括了[1,n-1]之间的所有整数,则称之符合“欢乐的跳”,如数组1 4 2 3符合“欢乐的跳”,因为差的绝对 ...

  5. Redis入门(三)-Redis的安装及操作key的命令介绍

    前两节对Redis做了一些详细的介绍,那么接下来开始我们就正式进入Redis的学习阶段. 安装Redis Windows下安装redis非常方便, 下载压缩包解压即可使用. 链接:https://pa ...

  6. 当h5页面图片加载失败后,给定一个默认图

    本文主要讨论页面中图片加载失败后替换默认图片的几种方式 重点来了:一定要记住error事件不冒泡. 相关的知识点:jquery的ready方法.$("img").error().i ...

  7. 前端vuex基础入门

    vuex简介 是一个专门为vue.应用程序开的状态管理模式 它采用集中式存储管理应用的所有组件的状态 (类似于全局变量) 并以相应的规则保证以一种可预测的方式发生改变(相应式变化) 应用场景 多个视图 ...

  8. .netcore 中使用开源的AOP框架 AspectCore

    AspectCore Project 介绍 什么是AspectCore Project ? AspectCore Project 是适用于Asp.Net Core 平台的轻量级 Aop(Aspect- ...

  9. $和jquery的关系

    $和jquery的关系 $其实是jQuery的别名 一般直接使用$符号 在许多JavaScript库中都会有$作为标记.如果同时使用多个JavaScript库时难免会出现冲突. 解决方法:重新设置jQ ...

  10. jeesite3环境部署时初始化数据库注意问题

    ---恢复内容开始--- 首先要修改jeesite.properties下数据库连接方式,注意选择自己的数据库 其次在pom.xml文件中修改对应的数据库连接方式 最后运行db文件夹下的init-db ...