win10 uwp 商業游戲

来源:https://www.cnblogs.com/lindexi/archive/2018/01/31/8391350.html
-Advertisement-
Play Games

本文告訴大家去做一個商業游戲,游戲很簡單,幾乎沒有什麼技術 <! more 游戲的開始,需要添加框架庫,於是引用我自己寫的庫。 首先是創建一個啟動頁面,這個頁面是顯示啟動的。 在顯示啟動的時候,是需要載入游戲需要使用的資源,如果覺得這時需要控制進度條,就需要使用註入的方法,給他知道現在的進度,不過我 ...


本文告訴大家去做一個商業游戲,游戲很簡單,幾乎沒有什麼技術

游戲的開始,需要添加框架庫,於是引用我自己寫的庫。

首先是創建一個啟動頁面,這個頁面是顯示啟動的。

在顯示啟動的時候,是需要載入游戲需要使用的資源,如果覺得這時需要控制進度條,就需要使用註入的方法,給他知道現在的進度,不過我現在不去做這裡,於是就很簡單的代碼做出來啟動頁面。

現在的啟動頁還是空的,但是先不管他。

然後開始寫一個歡迎頁面,也就是開始游戲、繼續、幫助等的頁面,暫時先不做。

但是寫了這麼多,都不需要在 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="&#xE10A;" 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的博客文章發佈了就不再編輯,如果希望看最新的文章,請到我的博客。本文也發在博客園備份,如果大家有什麼建議,請在博客下麵評論。

知識共用許可協議
本作品採用知識共用署名-非商業性使用-相同方式共用 4.0 國際許可協議進行許可。歡迎轉載、使用、重新發佈,但務必保留文章署名林德熙(包含鏈接:http://blog.csdn.net/lindexi_gd ),不得用於商業目的,基於本文修改後的作品務必以相同的許可發佈。如有任何疑問,請與我聯繫


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 文檔:https://docs.microsoft.com/en-us/windows/uwp/design/style/acrylic Acrylic 能帶來類似 win7 的毛玻璃效果 要使用 Acrylic ,需要 win10 的版本最低為 1709 ,在模擬器中是 16299 Acrylic ...
  • AStar尋路演算法是一種在一個靜態路網中尋找最短路徑的演算法,也是在游戲開發中最常用到的尋路演算法之一;最近剛好需要用到尋路演算法,因此把自己的實現過程記錄下來。 先直接上可視化之後的效果圖,圖中黑色方格代表障礙物,綠色的方格代表最終路線,紅色方格為關閉列表,藍色方格為開啟列表;關於這一部分我會在稍後詳細 ...
  • 一、適用情況 此問題主要針對如下情況: 在資料庫中我們將性別記為0和1,在datagridview中顯示時希望改成“男”和“女”,在綁定數據源後,性別列的數據類型固定為了Int32,不能直接裝換成字元型; 用下麵的代碼直接轉換 產生異常 二、解決方法 利用datagridview的cellforma ...
  • 從 Visual Studio 2015 起,共用項目 (Shared Project) 作為新的一種項目類型被添加到項目模板列表中,它的主要目的是使多個不同類型的項目之間可以共用代碼或資源。相比它的前任 PCL(Portable Class Library),它要靈活得多。因為 Shared Pr ...
  • 回到目錄 網關在硬體里有自己的定義,而在軟體架構里也有自己的解釋,它就是所有請求的入口,請求打到網關上,經過處理和加工,再返回給客戶端,這個處理過程中當然就是網關的核心,也是Ocelot的核心,我們可以把用戶授權,校驗,緩存,認證等很多關註點在網關中實現! 善友大哥收錄的:http://www.cs ...
  • TCP 協議概述 1.TCP提供一種面向連接的、可靠的位元組流服務。 2.兩個應用程式通過TCP連接交換8bit位元組構成的位元組流。 3.每個TCP首部都包含源端和目的端的埠號,用於尋找髮端和收端應用進程。這兩個值加上IP首部中的源端IP地址和目的端IP地址唯一確定一個TCP連接。 4.一個IP地址和 ...
  • 這兩天不忙,所以,做了一個簡易的新手引導小Demo。因為,不是項目上應用,所以,做的很粗糙,也就是給需要的人,一個思路而已。 新手引導功能的話,就是告訴用戶,頁面上操作的順序,第一步要做什麼,第二步要做什麼,以此類推,然後,最終關閉新手引導頁面。 以我的習慣,還是先給大家看看效果。 效果展示的很簡單 ...
  • 註意NET某些類型在不同平臺上的長度 NET中用句柄用得最多的是在DLLIMPORT中,混用int與intptr可能會導致某些API聲明在X64平臺中表現不正常,如 [DllImport("Kernel32")] public static extern IntPtr LoadLibrary(str... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...