win10 uwp 商业游戏 1.1.5

2023-04-20,,

本文是在win10 uwp 商业游戏 基础上继续开发,添加一些无聊的游戏

因为在发布几个月,下载量很少,小伙伴说游戏就玩不到几分钟就不想玩,于是我就想加入其他游戏

下面我来告诉大家如何在游戏中添加多个游戏。包括数据共用,导航

开始问到小伙伴,他说这个游戏因为玩到后面发现可以买的东西很多,于是就不能继续玩。商店没有限制用户可以买多少的东西,所以就买最贵的,游戏就很简单了,买一下最贵的东西,等到他升价再卖出去。所以看起来很简单,他就不想玩了,于是为了添加游戏的难度,我就先添加商店可以卖出数

商店可以卖出数

为了让游戏比较好玩,就添加了商店的一个东西最多的可以买入和卖出,但是买入和卖出的值需要在买入的时候添加卖出的值,所以就给一个值,表示市场需要的。如果买入了,那么市场需要的就增加,如果卖出了,市场需要就减少。

假设一个商品在一天的市场需要数是 UgetkmeOulajjz ,假设这个值是 100 ,通过随机提供的数量 KadzufmVtvnpn 获得商店还剩下多少这个商品。于是可以买入的数量就是 KadzufmVtvnpn ,可以卖出的数量就是 (UgetkmeOulajjz - KadzufmVtvnpn)

这样对一个商品不停买卖也是做不到的,虽然可以买价格最高的商品,但是因为限制了商品的 UgetkmeOulajjz ,所以最后可以买入的数量也是有限的。

UgetkmeOulajjz 的数值开始是随机生成,在 10-100 左右。

多个游戏

现在还可以添加新的功能,如打怪,大概钱到了 10000 就可以开始买灵石,然后进去特殊的游戏。

这时需要界面可以使用多个页面

先创建一个页面 KdgqelPocuesyvPage 和他的抽线 KdgderhlMzhpModel,因为使用了框架所以需要让 KdgderhlMzhpModel 继承 ViewModelMessage 。需要 KdgqelPocuesyvPage 添加指定的 ViewModel

先到 IckixyYofiModel 跳转到 KdgderhlMzhpModel ,然后在这里添加界面,先添加一些测试的按钮,用于跳转

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="89*"/>
<RowDefinition Height="11*"/>
</Grid.RowDefinitions> <Grid>
<ListView >
</ListView>
</Grid>
<Grid Grid.Row="1"> <Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="317*"/>
<ColumnDefinition Width="690*"/>
<ColumnDefinition Width="493*"/>
</Grid.ColumnDefinitions>
<Button Content="跳转测试 跳转到页面1" Margin="10,10,10,10"
HorizontalAlignment="Stretch"></Button>
<Button Grid.Column="1" Content="跳转测试 跳转到页面2" Margin="10,10,10,10"
HorizontalAlignment="Stretch"></Button>
<Button Grid.Column="2" Content="跳转测试 跳转到页面3" Margin="10,10,10,10"
HorizontalAlignment="Stretch"></Button>
</Grid>
</Grid>
</Grid>

中间的 ListView 就来绑定按钮,绑定的按钮参见:win10 UWP ListView

添加列表

如果需要绑定ListView ,需要先创建一个类型,这个类型直接包括显示的文字和跳转的页面等,这里先显示文字

    public class YcftxgEcgs
{
public string YwkLjuakc { get; set; }
}

跳转的页面使用 KmulfmFshszg ,这样就可以在 ViewModel 添加一个列表

        public ObservableCollection<YcftxgEcgs> VsibgyegZkyi { get; set; } = new ObservableCollection<YcftxgEcgs>();

然后在构造函数创建内容

        public KdgderhlMzhpModel()
{
for (int i = 0; i < 100; i++)
{
VsibgyegZkyi.Add(new YcftxgEcgs("按钮" + i));
}
}

在界面使用绑定的代码

       <ListView d:DataContext="{d:DesignInstance viewModel:KdgderhlMzhpModel,d:IsDesignTimeCreatable=True}"
HorizontalAlignment="Stretch"
ItemsSource="{x:Bind ViewModel.VsibgyegZkyi}">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<ItemsWrapGrid Orientation="Horizontal"></ItemsWrapGrid>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ListView.ItemContainerStyle> <ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Button Content="{Binding}"></Button>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

可以看到下面的界面

但是按钮按下的时候需要告诉上一层的消息,这时可以使用发送消息方法

在 ViewModel 添加一个属性,这个属性可以告诉界面按钮点击

    public string PngvnwIjpy
{
get { return _pngvnwIjpy; }
set
{
_pngvnwIjpy = value;
OnPropertyChanged();
}
} private string _pngvnwIjpy;

在 YcftxgEcgs 添加点击事件

        public void SloafemulWugxhrd()
{
IxfmHlsg?.Invoke(this, null);
} public event EventHandler IxfmHlsg;

然后需要修改 ViewModel 的方法

        public KdgderhlMzhpModel()
{
for (int i = 0; i < 100; i++)
{
var whzmnTstbq = new YcftxgEcgs("按钮" + i);
whzmnTstbq.IxfmHlsg += (s, e) => PngvnwIjpy = ((YcftxgEcgs) s).YwkLjuakc;
VsibgyegZkyi.Add(whzmnTstbq);
}
}

在界面绑定,创建一个文本


<ListView.ItemTemplate>
<DataTemplate x:DataType="viewModel:YcftxgEcgs">
<Grid>
<Button Content="{x:Bind YwkLjuakc}" Click="{x:Bind SloafemulWugxhrd}"></Button>
</Grid>
</DataTemplate>
</ListView.ItemTemplate> <TextBlock Text="{x:Bind ViewModel.PngvnwIjpy,Mode=OneWay}"></TextBlock>

这时点击就可以看到文本显示点击按钮

导航

现在可以添加导航界面,在上面的界面,下面就是各个不同的游戏,上面是游戏的界面。

先在 ViewModel 跳转修改为进入游戏

            Navigate(typeof(TvrwgrnNnuModel), null);

然后在新建游戏或打开游戏的时候,跳转到导航界面

打开 TvrwgrnNnuModel ,把里面的 StorageModel 替换为 KdgderhlMzhpModel,这样就可以打开导航界面

导航现在只有商店和仓库,之后有其他的导航再这里加入

因为现在的 KdgderhlMzhpModel 也需要有跳转,所以把他继承 NavigateViewModel 然后在页面跳转添加下面代码

       CombineViewModel(Application.Current.GetType().GetTypeInfo().Assembly);
AllAssemblyComposite(Application.Current.GetType().GetTypeInfo().Assembly);

这样就可以获得页面和处理

在导航界面添加框架,然后给 ViewModel ,请看代码

            <Frame x:Name="VjagWrgesebmy"></Frame>

            ViewModel = (KdgderhlMzhpModel) e.Parameter;
ViewModel.Content = VjagWrgesebmy;
DataContext = ViewModel;
base.OnNavigatedTo(e);

但是因为 ViewModel 是先跳转然后再进入页面,所以不可以在 KdgderhlMzhpModel 跳转的时候进入游戏,需要添加函数 UmfqawovKaxkrdrg 设置跳转的之后进行跳转

        public void UmfqawovKaxkrdrg()
{
//进行跳转
Navigate(typeof(StorageModel), null);
}
            ViewModel = (KdgderhlMzhpModel) e.Parameter;
ViewModel.Content = VjagWrgesebmy;
ViewModel.UmfqawovKaxkrdrg();
DataContext = ViewModel;

这样就可以在点击新建游戏的时候看到跳转到市场

下面开始写一个新的游戏,叫修炼,这个游戏很简单,就是点击添加修为,暂时就这个。因为今天的 VS 炸了,所以暂时没有使用 UWP 也打不开之前的游戏,所以就重新写一个。

修炼游戏

下面告诉大家如何写修炼游戏,这是一个挂机游戏,需要用户不停点击。

游戏很简单,估计看一下就知道怎么做。

定义接口

人物有属性,修为。通过修为可以用来提升技能、自己的属性。而修为可以使用点击来获得,所以不停的点击的游戏。

那么先写一个人物接口,因为还不知道人物类需要什么东西,如何加上商业游戏,所以就写接口,定义接口的好处是可以通过别的地方给使用地方值。这样不依赖实现是比较好的。

假如换了个游戏,而这个游戏没有这里想要的人物类,如何加上原有游戏的?通过接口就可以。

    interface IDfeppzyTmofs
{ }

人物接口需要实现,所以写一个类来实现,最后这个类是不需要的


class TdsumTzwok : IDfeppzyTmofs
{ }

人物类需要属性表示修为,因为这个值可能很大,所以就不使用 int ,请看下面

    interface IDfeppzyTmofs
{
long KtrKvmvvnj { set; get; }
}

这时在 TdsumTzwok 使用 Resharper 自动添加属性

    class TdsumTzwok : IDfeppzyTmofs
{
public long KtrKvmvvnj { get; set; }
}

创建界面

然后开始写 ViewModel ,这里只需要一个 ViewModel

    class HnlcDbtdhsdjModel:ViewModelMessage
{
public override void OnNavigatedFrom(object sender, object obj)
{ } public override void OnNavigatedTo(object sender, object obj)
{ }
}

同时创建页面

    [ViewModel(ViewModel = typeof(HnlcDbtdhsdjModel))]
public partial class HnlcDbtdhsdjPage : Page
{
public HnlcDbtdhsdjPage()
{
InitializeComponent();
}
}

然后定义技能,技能包括有升级修为的技能和升级属性的技能

定义属性

暂时人物的属性就设置为力量、防御、精神力、魔力…… 好像很多的值

在网上找到的推荐是

STR力量(攻击力)
AGI敏捷
VIT耐力(防御力)
INT智力(魔法攻击力防御力)
DEX命中
LUK幸运
悟性

在国产游戏找到的属性

气血——角色当前生命值/角色当前生命值上限/角色总生命值上限,气血值为0时角色死亡
法力——角色当前法力值/角色当前法力值上限/角色总法力值上限,施放技能需要消耗法力
怒气——角色当前怒气值/角色总怒气值,施放绝技需要消耗怒气值
根骨——影响气血上限、怒气、气血回复速度、怒气回复速度
精力——影响法力上限、怒气、法力回复速度、怒气回复速度
力量——影响最小物理攻击、最大物理攻击、物理防御
智力——影响最小法术攻击、最大法术攻击、法术防御
敏捷——影响物理命中、法术命中、物理躲避、法术躲避
修炼——加入帮会后,可在帮会书院处进行修炼来增加修炼等级
修为——在师门训练师处用经验、银两和银票提升技能等级可提升修为等级
幸运——影响怪物死亡时物品的掉落,幸运值高更大概率掉落好物品
格挡——影响完全抵消本次物理攻击的几率,格挡越高,完全抵消本次物理攻击的概率越大
破盾——影响无视格挡的几率,破盾越高无视格挡的几率越高
物理攻击、法术攻击——玩家的两项攻击值,攻击值越大对人或怪的伤害越大
物理防御、法术防御——玩家的两项防御值,防御值越大受到的伤害越低
物理躲避、法术躲避——玩家的两项躲避值,数值越大躲避他人攻击的成功率越大
物理致命、法术致命——玩家的两项致命值,数值越大施放技能时打出致命一击的概率越大
物理命中、法术命中——玩家的两项命中值,数值越大杀人或怪时失手的概率越低

现在就不写这么多,先写力量、防御、精神力、魔力的值

  interface IDfeppzyTmofs
{
long KtrKvmvvnj { set; get; } /// <summary>
/// 力量
/// </summary>
int KhbfhHtuxwwrn { set; get; } /// <summary>
/// 防御
/// </summary>
int KahdxouTrifmznz { set; get; } /// <summary>
/// 精神力
/// </summary>
int SnmTiet { get; set; } /// <summary>
/// 魔力
/// </summary>
int DyjgSjdbgm { set; get; }
}

同时在人物类也需要写这个代码,不过不到2秒,我就写好了

  class TdsumTzwok : IDfeppzyTmofs
{
public long KtrKvmvvnj { get; set; }
public int KhbfhHtuxwwrn { get; set; }
public int KahdxouTrifmznz { get; set; }
public int SnmTiet { get; set; }
public int DyjgSjdbgm { get; set; }
}

接着在 ViewModel 写人物属性

    class HnlcDbtdhsdjModel : ViewModelMessage
{ /// <summary>
/// 获取设置 人物
/// </summary>
public IDfeppzyTmofs KppnuhKxkpxdee
{
set
{
_kppnuhKxkpxdee = value;
OnPropertyChanged();
}
get => _kppnuhKxkpxdee;
} private IDfeppzyTmofs _kppnuhKxkpxdee; public override void OnNavigatedFrom(object sender, object obj)
{ } public override void OnNavigatedTo(object sender, object obj)
{ }
}

这是使用代码片做出来的,关于代码片,请看resharper 自定义代码片

定义技能

写了属性还需要写技能,技能 DexqurhctSjyfozae ,包括了修为和属性,技能都可以升级,技能可以通过修为拿到。第一个技能是点击一次获得1技能。升级需要10修为,升1级,点击一次添加一点修为。

看起来这个代码很简单

先定义技能基类 DexqurhctSjyfozae ,技能包括当前的值,升级需要多少修为,升级之后可以做什么

    internal abstract class DexqurhctSjyfozae
{
/// <summary>
/// 当前的值
/// </summary>
public double DklvubnuiTeqch { get; set; } /// <summary>
/// 升级需要多少修为
/// </summary>
public double DmyikbmfDeb { get; set; } public string HnukhltvKfdrpokjz { get; set; } /// <summary>
/// 升级之后做什么
/// </summary>
public abstract void DqqTsb();
}

先做一个类来继承,这个类是点击添加修为

    class HisjfnnzSqsbtuuqq:DexqurhctSjyfozae
{
public HisjfnnzSqsbtuuqq()
{
HnukhltvKfdrpokjz = "点击添加修为"; DmyikbmfDeb = 10; DklvubnuiTeqch = 1;
} public override void DqqTsb()
{
DklvubnuiTeqch += 1;
}
}

可以看到点击添加修为的时候,发现不知道怎么把修为给人添加。所以需要构造添加 IDfeppzyTmofs ,这样点击的时候才可以添加添加修为

        public IDfeppzyTmofs Dfeppzy { get; }

        public HisjfnnzSqsbtuuqq(IDfeppzyTmofs dfeppzy)
{
Dfeppzy = dfeppzy; HnukhltvKfdrpokjz = "点击添加修为"; DmyikbmfDeb = 10; DklvubnuiTeqch = 1;
}

但是点击如何写?实际上需要一个点击接口,所有继承点击的都需要使用

 interface IKdgvtziaSfs
{
void DdwTynktxyx();
}

下面使用 HisjfnnzSqsbtuuqq 继承 IKdgvtziaSfs ,在点击的时候添加修为

  public class HisjfnnzSqsbtuuqq : DexqurhctSjyfozae, IKdgvtziaSfs
{
public HisjfnnzSqsbtuuqq(IDfeppzyTmofs dfeppzy)
{
Dfeppzy = dfeppzy; HnukhltvKfdrpokjz = "点击添加修为"; DmyikbmfDeb = 10; DklvubnuiTeqch = 1;
} public IDfeppzyTmofs Dfeppzy { get; } public override void DqqTsb()
{
DklvubnuiTeqch += 1;
} public void DdwTynktxyx()
{
Dfeppzy.KtrKvmvvnj += (long)Math.Floor(DklvubnuiTeqch);
}
}

开始写游戏

现在已经准备好了,下面就是写游戏的时候

在 ViewModel 添加一个列表,表示技能

        public ObservableCollection<DexqurhctSjyfozae> DexqurhctSjyfozae
{
set
{
_dexqurhctSjyfozae = value;
OnPropertyChanged();
}
get => _dexqurhctSjyfozae;
} private ObservableCollection<DexqurhctSjyfozae> _dexqurhctSjyfozae;

在跳转添加创建人物、技能

        public override void OnNavigatedTo(object sender, object obj)
{
KppnuhKxkpxdee = new TdsumTzwok();
var hisjfnnzSqsbtuuqq = new HisjfnnzSqsbtuuqq(KppnuhKxkpxdee); DexqurhctSjyfozae = new ObservableCollection<DexqurhctSjyfozae>()
{
hisjfnnzSqsbtuuqq,
};
}

因为现在的代码比较乱,所以我把所有代码写出来

    public class HnlcDbtdhsdjModel : ViewModelMessage
{
/// <summary>
/// 获取设置技能
/// </summary>
public ObservableCollection<DexqurhctSjyfozae> DexqurhctSjyfozae
{
set
{
_dexqurhctSjyfozae = value;
OnPropertyChanged();
}
get => _dexqurhctSjyfozae;
} private ObservableCollection<DexqurhctSjyfozae> _dexqurhctSjyfozae; /// <summary>
/// 获取设置 人物
/// </summary>
public IDfeppzyTmofs KppnuhKxkpxdee
{
set
{
_kppnuhKxkpxdee = value;
OnPropertyChanged();
}
get => _kppnuhKxkpxdee;
} private IDfeppzyTmofs _kppnuhKxkpxdee; public HnlcDbtdhsdjModel()
{ } public override void OnNavigatedFrom(object sender, object obj)
{ } public override void OnNavigatedTo(object sender, object obj)
{
KppnuhKxkpxdee = new TdsumTzwok();
var hisjfnnzSqsbtuuqq = new HisjfnnzSqsbtuuqq(KppnuhKxkpxdee); DexqurhctSjyfozae = new ObservableCollection<DexqurhctSjyfozae>()
{
hisjfnnzSqsbtuuqq,
};
}
}

命名在我自己写的时候都是有做好的,但是因为是发出来的,所以命名都使用工具替换,所以大家看到的命名都是很不符合英文。

界面

先让大家看一下界面

界面很简单,我直接写代码。大家也看到这个代码使用的 WPF 写的,因为现在VS无法编译UWP,所以我就先使用 WPF 来做游戏

需要在主页面添加下面的代码让游戏可以到这里

        var hnlcDbtdhsdjPage = new HnlcDbtdhsdjPage();
var hnlcDbtdhsdjModel = new HnlcDbtdhsdjModel();
hnlcDbtdhsdjModel.NavigatedTo(this, null);
hnlcDbtdhsdjPage.ViewModel = hnlcDbtdhsdjModel;
hnlcDbtdhsdjPage.DataContext = hnlcDbtdhsdjModel;
ShlwjKzwfkuhrz.Navigate(hnlcDbtdhsdjPage);

这里的 ShlwjKzwfkuhrz 就是写在界面的 Frame ,在 WPF 需要设置隐藏上面的按钮,因这个按钮很差

下面就是游戏的界面,可以看到界面之后一个 ListView 作为显示技能和人物信息

<Page x:Class="TpwlxnpDfyecpeoh.View.HnlcDbtdhsdjPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:TpwlxnpDfyecpeoh.View"
xmlns:viewModel="clr-namespace:TpwlxnpDfyecpeoh.ViewModel"
xmlns:tpwlxnpDfyecpeoh="clr-namespace:TpwlxnpDfyecpeoh"
mc:Ignorable="d"
d:DesignHeight="600" d:DesignWidth="1000"
Title="HnlcDbtdhsdjPage">
<Page.Resources>
<Style x:Key="HztDmaer" TargetType="TextBlock">
<Setter Property="Margin" Value="10,10,10,10"></Setter>
</Style>
</Page.Resources>
<Grid d:DataContext="{d:DesignInstance viewModel:HnlcDbtdhsdjModel}">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid>
<Grid HorizontalAlignment="Right">
<StackPanel Margin="10,10,10,10" Orientation="Horizontal">
<TextBlock Text="当前修为"></TextBlock>
<TextBlock Text="{Binding KppnuhKxkpxdee.KtrKvmvvnj,Mode=OneWay}"></TextBlock>
</StackPanel>
</Grid>
</Grid>
<Grid Grid.Row="1">
<ListView ItemsSource="{Binding DexqurhctSjyfozae}" HorizontalAlignment="Stretch"
BorderBrush="Transparent" BorderThickness="0"
HorizontalContentAlignment="Stretch">
<ListView.ItemContainerStyle>
<Style TargetType="ListViewItem">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListViewItem}">
<Border x:Name="Bd" Padding="{TemplateBinding Padding}" SnapsToDevicePixels="true">
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ListView.ItemContainerStyle>
<ListView.ItemTemplate>
<DataTemplate DataType="tpwlxnpDfyecpeoh:DexqurhctSjyfozae">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="5*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
<ColumnDefinition Width="1*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Grid>
<TextBlock Style="{StaticResource HztDmaer}" Text="{Binding HnukhltvKfdrpokjz}"></TextBlock>
</Grid>
<Grid Grid.Column="1">
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource HztDmaer}" Text="当前的值"></TextBlock>
<TextBlock Style="{StaticResource HztDmaer}" Text="{Binding DklvubnuiTeqch}"></TextBlock>
</StackPanel>
</Grid>
<Grid Grid.Column="2">
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource HztDmaer}" Text="升级需要修为"></TextBlock>
<TextBlock Style="{StaticResource HztDmaer}" Text="{Binding DmyikbmfDeb}"></TextBlock>
</StackPanel>
</Grid>
<Grid Grid.Column="3">
<Button Margin="10,10,10,10" Content="升级"></Button>
</Grid>
<Grid Grid.Column="4">
<Button Margin="10,10,10,10" Content="点击"></Button>
</Grid>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</Grid>
</Page>

点击升级

界面做完之后需要让按钮点击可以绑定后台,但是可以看到,界面绑定的值没有刷新,因为之前写属性都是没有通知,所以界面的属性都没有刷新,为了让界面可以刷新,所以需要修改属性的值

    class TdsumTzwok : NotifyProperty, IDfeppzyTmofs
{
private long _ktrKvmvvnj = 0;
private int _khbfhHtuxwwrn = 1;
private int _kahdxouTrifmznz = 1;
private int _snmTiet = 1;
private int _dyjgSjdbgm = 1; public TdsumTzwok()
{
} public long KtrKvmvvnj
{
get { return _ktrKvmvvnj; }
set
{
_ktrKvmvvnj = value;
OnPropertyChanged();
}
} public int KhbfhHtuxwwrn
{
get { return _khbfhHtuxwwrn; }
set
{
_khbfhHtuxwwrn = value;
OnPropertyChanged();
}
} public int KahdxouTrifmznz
{
get { return _kahdxouTrifmznz; }
set
{
_kahdxouTrifmznz = value;
OnPropertyChanged();
}
} public int SnmTiet
{
get { return _snmTiet; }
set
{
_snmTiet = value;
OnPropertyChanged();
}
} public int DyjgSjdbgm
{
get { return _dyjgSjdbgm; }
set
{
_dyjgSjdbgm = value;
OnPropertyChanged();
}
}
}

实际上人物的属性可以不做设置,因为可以通过更新人物属性来更新。

    public abstract class DexqurhctSjyfozae : NotifyProperty
{
/// <summary>
/// 当前的值
/// </summary>
public double DklvubnuiTeqch
{
get => _dklvubnuiTeqch;
set
{
_dklvubnuiTeqch = value;
OnPropertyChanged();
}
} /// <summary>
/// 升级需要多少修为
/// </summary>
public double DmyikbmfDeb
{
get => _dmyikbmfDeb;
set
{
_dmyikbmfDeb = value;
OnPropertyChanged();
}
} public string HnukhltvKfdrpokjz
{
get => _hnukhltvKfdrpokjz;
set
{
_hnukhltvKfdrpokjz = value;
OnPropertyChanged();
}
} /// <summary>
/// 升级之后做什么
/// </summary>
public abstract void DqqTsb(); private double _dklvubnuiTeqch;
private double _dmyikbmfDeb;
private string _hnukhltvKfdrpokjz;
}

现在开始绑定界面

因为 WPF 不能做 xbind 到函数,所以我就使用 Click 点击拿到技能升级

                                <Button Margin="10,10,10,10" Content="升级" Click="HzmzKgeu_OnClick"></Button>

        private void HzmzKgeu_OnClick(object sender, RoutedEventArgs e)
{
var frameworkElement = (FrameworkElement)sender; if (frameworkElement.DataContext is DexqurhctSjyfozae dexqurhctSjyfozae)
{
ViewModel.KdfoeDoct(dexqurhctSjyfozae);
}
}

这样写就是拿到 DataContext 给 ViewModel 让他判断当前的修为是否可以升级

下面的代码写在 ViewModel 判断如何可以升级就升级,不可以就告诉用户。但是如何告诉用户现在还没写

  public void KdfoeDoct(DexqurhctSjyfozae dexqurhctSjyfozae)
{
if (KppnuhKxkpxdee.KtrKvmvvnj >= dexqurhctSjyfozae.DmyikbmfDeb)
{
KppnuhKxkpxdee.KtrKvmvvnj -= (long) Math.Ceiling(dexqurhctSjyfozae.DmyikbmfDeb);
dexqurhctSjyfozae.DqqTsb();
}
else
{ }
}

写好了升级,还有点击,下面开始写点击

                                <Button Margin="10,10,10,10" Content="点击" Click="DlsuqHmopxh_OnClick"></Button>
       private void DlsuqHmopxh_OnClick(object sender, RoutedEventArgs e)
{
var frameworkElement = (FrameworkElement)sender; if (frameworkElement.DataContext is IKdgvtziaSfs kdgvtziaSfs)
{
kdgvtziaSfs.DdwTynktxyx();
}
}

大概写好了,直接从代码转换,判断是否可以点击,如何支持点击,就触发点击

现在的游戏已经可以玩了,于是我就把他放在了 CSDN 上,大家可以尝试玩一下。

相关文章

win10 uwp 商业游戏

win10 uwp 商业游戏 1.2.1

我搭建了自己的博客 https://blog.lindexi.com/ 欢迎大家访问,里面有很多新的博客。只有在我看到博客写成熟之后才会放在csdn或博客园,但是一旦发布了就不再更新

如果在博客看到有任何不懂的,欢迎交流,我搭建了 dotnet 职业技术学院 欢迎大家加入

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。

win10 uwp 商业游戏 1.1.5的相关教程结束。

《win10 uwp 商业游戏 1.1.5.doc》

下载本文的Word格式文档,以方便收藏与打印。