国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

第五節(jié) 利用Ogre 2.3實(shí)現(xiàn)雨,雪,爆炸,飛機(jī)噴氣尾焰等粒子效果

這篇具有很好參考價(jià)值的文章主要介紹了第五節(jié) 利用Ogre 2.3實(shí)現(xiàn)雨,雪,爆炸,飛機(jī)噴氣尾焰等粒子效果。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

本節(jié)主要學(xué)習(xí)如何使用Ogre2.3加載粒子效果。為了學(xué)習(xí)方便,直接將官方粒子模塊Sample_ParticleFX單獨(dú)拿出來(lái)編譯,學(xué)習(xí)如何實(shí)現(xiàn)粒子效果。

一. 前提須知

  1. 如果參考官方示例建議用最新版的Ogre 2.3.1。否則找不到有粒子效果的示例。不要用官網(wǎng)Ogre2.3 script腳本編譯源碼!
  2. Ogre 1.x中關(guān)于實(shí)現(xiàn)粒子效果的官方示例材質(zhì)太老,不支持固管,要寫(xiě)shader,不建議在Ogre 2.3中使用。要使用新的材質(zhì)!
    Ogre 1.x中的材質(zhì):
material Examples/Flare
{
	technique
	{
		pass
		{
			lighting off
			scene_blend add
			depth_write off
			diffuse vertexcolour

			texture_unit
			{
				texture flare.png
			}
		}
	}
}

Ogre 2.3中的材質(zhì):

hlms Examples/Flare2 unlit
{
	depth_write		off
	cull_hardware	none

	scene_blend		add

	diffuse_map flaretrail.png
}

二. 新建項(xiàng)目工程的頭文件和庫(kù)文件配置如下:

注意:你需要把Media文件夾bin/Debug文件夾下的資源拷貝過(guò)來(lái),具體拷貝到哪里大家應(yīng)該很了解。
這里說(shuō)下頭文件和庫(kù)文件的設(shè)置。
頭文件:
第五節(jié) 利用Ogre 2.3實(shí)現(xiàn)雨,雪,爆炸,飛機(jī)噴氣尾焰等粒子效果第五節(jié) 利用Ogre 2.3實(shí)現(xiàn)雨,雪,爆炸,飛機(jī)噴氣尾焰等粒子效果庫(kù)目錄:
第五節(jié) 利用Ogre 2.3實(shí)現(xiàn)雨,雪,爆炸,飛機(jī)噴氣尾焰等粒子效果第五節(jié) 利用Ogre 2.3實(shí)現(xiàn)雨,雪,爆炸,飛機(jī)噴氣尾焰等粒子效果注意:這里改成窗口
第五節(jié) 利用Ogre 2.3實(shí)現(xiàn)雨,雪,爆炸,飛機(jī)噴氣尾焰等粒子效果

三. 粒子效果總結(jié)

先展示下官網(wǎng)給的12個(gè)粒子效果,具體代碼放到最后。

  1. 煙花效果,粒子Examples/Fireworks,材質(zhì)官方?jīng)]有給出,自己嘗試模仿寫(xiě)了一個(gè),添加到Particles.material文件中。
 Particles.material:
hlms Examples/Flare unlit
{
	depth_write		off
	cull_hardware	none

	scene_blend		add

	diffuse_map flare.png
}

第五節(jié) 利用Ogre 2.3實(shí)現(xiàn)雨,雪,爆炸,飛機(jī)噴氣尾焰等粒子效果
2. 向上漂浮的綠色顆粒,粒子Examples/GreenyNimbus。材質(zhì)自己為自己添加。

Particles.material:
hlms Examples/FlarePointSprite unlit
{
	depth_write		off
	cull_hardware	none

	scene_blend		add

	diffuse_map flare.png
}

第五節(jié) 利用Ogre 2.3實(shí)現(xiàn)雨,雪,爆炸,飛機(jī)噴氣尾焰等粒子效果
3. 閃閃發(fā)光的紫色噴泉。粒子Examples/PurpleFountain。材質(zhì)為官方自帶。
第五節(jié) 利用Ogre 2.3實(shí)現(xiàn)雨,雪,爆炸,飛機(jī)噴氣尾焰等粒子效果
4. 雨,粒子Examples/Rain。材質(zhì)自己實(shí)現(xiàn)。

材質(zhì)Particles.material:
hlms Examples/Droplet unlit
{
	depth_write		off
	cull_hardware	none

	scene_blend		add

	diffuse_map basic_droplet.png
}

第五節(jié) 利用Ogre 2.3實(shí)現(xiàn)雨,雪,爆炸,飛機(jī)噴氣尾焰等粒子效果
5. 飛機(jī)噴氣尾焰,粒子Examples/JetEngine1。粒子和材質(zhì)代碼詳見(jiàn)官方示例。
第五節(jié) 利用Ogre 2.3實(shí)現(xiàn)雨,雪,爆炸,飛機(jī)噴氣尾焰等粒子效果
6. 飛機(jī)噴氣尾焰2,粒子Examples/JetEngine2。粒子和材質(zhì)代碼詳見(jiàn)官方示例。
第五節(jié) 利用Ogre 2.3實(shí)現(xiàn)雨,雪,爆炸,飛機(jī)噴氣尾焰等粒子效果
7. 向上漂浮的光環(huán),類似龍卷風(fēng)。粒子 Examples/Aureola。粒子和材質(zhì)代碼詳見(jiàn)官方示例。
第五節(jié) 利用Ogre 2.3實(shí)現(xiàn)雨,雪,爆炸,飛機(jī)噴氣尾焰等粒子效果
8. 四處游動(dòng)的類似火花。粒子Examples/Swarm。粒子和材質(zhì)代碼詳見(jiàn)官方示例。
第五節(jié) 利用Ogre 2.3實(shí)現(xiàn)雨,雪,爆炸,飛機(jī)噴氣尾焰等粒子效果
9.漫天雪花,粒子Examples/Snow。粒子和材質(zhì)代碼詳見(jiàn)官方示例。
第五節(jié) 利用Ogre 2.3實(shí)現(xiàn)雨,雪,爆炸,飛機(jī)噴氣尾焰等粒子效果
10. 類似煙花。粒子Examples/Animated/Test1。粒子和材質(zhì)代碼詳見(jiàn)官方示例。
第五節(jié) 利用Ogre 2.3實(shí)現(xiàn)雨,雪,爆炸,飛機(jī)噴氣尾焰等粒子效果
11. 大雨滴,粒子Examples/Water/Rain。粒子和材質(zhì)代碼詳見(jiàn)官方示例。
第五節(jié) 利用Ogre 2.3實(shí)現(xiàn)雨,雪,爆炸,飛機(jī)噴氣尾焰等粒子效果
12. 煙霧。粒子Examples/Smoke。粒子代碼見(jiàn)官方示例。材質(zhì)代碼自己寫(xiě)。如下:

材質(zhì)Particles.material:
hlms Examples/Smoke unlit
{
	depth_write		off
	cull_hardware	none

	scene_blend		add

	diffuse_map Smoke15Frames.png
}

第五節(jié) 利用Ogre 2.3實(shí)現(xiàn)雨,雪,爆炸,飛機(jī)噴氣尾焰等粒子效果

四. 代碼

具體代碼參考官方模塊Sample_ParticleFX,這里為了單獨(dú)測(cè)試不同粒子效果,把少數(shù)代碼注釋了。
ParticleFXGameState.cpp文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-492590.html


#include "ParticleFXGameState.h"

#include "CameraController.h"
#include "GraphicsSystem.h"
#include "OgreCamera.h"
#include "OgreHlmsManager.h"
#include "OgreHlmsPbs.h"
#include "OgreHlmsPbsDatablock.h"
#include "OgreHlmsSamplerblock.h"
#include "OgreItem.h"
#include "OgreMesh2.h"
#include "OgreMeshManager.h"
#include "OgreMeshManager2.h"
#include "OgreRoot.h"
#include "OgreSceneManager.h"
#include "OgreTextureFilters.h"
#include "OgreTextureGpuManager.h"
#include "OgreWindow.h"

#include "OgreParticleSystem.h"
//
#include <iostream>

using namespace Demo;

namespace Demo
{
    ParticleFXGameState::ParticleFXGameState(const Ogre::String& helpDescription) :
        TutorialGameState(helpDescription),
        mTime(0.0f)
    {
    }
    //-----------------------------------------------------------------------------------
    void ParticleFXGameState::createScene01()
    {
        Ogre::SceneManager* sceneManager = mGraphicsSystem->getSceneManager();

        Ogre::v1::MeshPtr planeMeshV1 = Ogre::v1::MeshManager::getSingleton().createPlane(
            "Plane v1", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,
            Ogre::Plane(Ogre::Vector3::UNIT_Y, 1.0f), 50.0f, 50.0f, 1, 1, true, 1, 4.0f, 4.0f,
            Ogre::Vector3::UNIT_Z, Ogre::v1::HardwareBuffer::HBU_STATIC,
            Ogre::v1::HardwareBuffer::HBU_STATIC);

        Ogre::MeshPtr planeMesh = Ogre::MeshManager::getSingleton().createByImportingV1(
            "Plane", Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, planeMeshV1.get(), true,
            true, true);

        {
            Ogre::Item* item = sceneManager->createItem(planeMesh, Ogre::SCENE_DYNAMIC);
            item->setDatablock("Marble");
            Ogre::SceneNode* sceneNode = sceneManager->getRootSceneNode(Ogre::SCENE_DYNAMIC)
                ->createChildSceneNode(Ogre::SCENE_DYNAMIC);
            sceneNode->setPosition(0, -1, 0);
            sceneNode->attachObject(item);

            // Change the addressing mode of the roughness map to wrap via code.
            // Detail maps default to wrap, but the rest to clamp.
            assert(dynamic_cast<Ogre::HlmsPbsDatablock*>(item->getSubItem(0)->getDatablock()));
            Ogre::HlmsPbsDatablock* datablock =
                static_cast<Ogre::HlmsPbsDatablock*>(item->getSubItem(0)->getDatablock());
            // Make a hard copy of the sampler block
            Ogre::HlmsSamplerblock samplerblock(*datablock->getSamplerblock(Ogre::PBSM_ROUGHNESS));
            samplerblock.mU = Ogre::TAM_WRAP;
            samplerblock.mV = Ogre::TAM_WRAP;
            samplerblock.mW = Ogre::TAM_WRAP;
            // Set the new samplerblock. The Hlms system will
            // automatically create the API block if necessary
            datablock->setSamplerblock(Ogre::PBSM_ROUGHNESS, samplerblock);
        }

        Ogre::SceneNode* rootNode = sceneManager->getRootSceneNode();

        Ogre::Light* light = sceneManager->createLight();
        Ogre::SceneNode* lightNode = rootNode->createChildSceneNode();
        lightNode->attachObject(light);
        light->setPowerScale(Ogre::Math::PI);
        light->setType(Ogre::Light::LT_DIRECTIONAL);
        light->setDirection(Ogre::Vector3(-1, -1, -1).normalisedCopy());

        sceneManager->setAmbientLight(Ogre::ColourValue(0.3f, 0.5f, 0.7f) * 0.1f * 0.75f,
            Ogre::ColourValue(0.6f, 0.45f, 0.3f) * 0.065f * 0.75f,
            -light->getDirection() + Ogre::Vector3::UNIT_Y * 0.2f);

      /*  Ogre::ParticleSystem* pSystem0 = sceneManager->createParticleSystem("Examples/PurpleFountain");
        Ogre::ParticleSystem* pSystem1 = sceneManager->createParticleSystem("Examples/Aureola");
        Ogre::ParticleSystem* pSystem2 = sceneManager->createParticleSystem("Examples/Animated/Test1");

        Ogre::SceneNode* sceneNode = rootNode->createChildSceneNode();
        sceneNode->attachObject(pSystem0);
        sceneNode = rootNode->createChildSceneNode();
        sceneNode->attachObject(pSystem1);
        sceneNode = rootNode->createChildSceneNode();
        sceneNode->setPosition(Ogre::Vector3(10, 0, 0));
        sceneNode->attachObject(pSystem2);*/

        Ogre::ParticleSystem* pSystem0 = sceneManager->createParticleSystem("Examples/Smoke");
        Ogre::SceneNode* sceneNode = rootNode->createChildSceneNode();
        sceneNode->attachObject(pSystem0);

        //參數(shù)獲取
        unsigned short numAffectors = pSystem0->getNumAffectors();
        Ogre::ParticleAffector* particleAffector = pSystem0->getAffector(0);
       /* for (int i = 0; i < list.size(); i++) {
            Ogre::ParameterDef parameterDef = list[i];
            std::cout << parameterDef.description() << std::endl;

        }*/
        /*size_t s  = pSystem0->getParticleQuota();
        Ogre::ParticleAffector * particleAffector = pSystem0->getAffector(0);
        bool cull = pSystem0->getCullIndividually();
        bool castShadows = pSystem0->getCastShadows();
        Ogre::Real height = pSystem0->getDefaultHeight();
        pSystem0->getDefaultLightMask();
        Ogre::Real nonVisibleUpdateTimeout = pSystem0->getDefaultNonVisibleUpdateTimeout();
        pSystem0->getDefaultVisibilityFlags();*/
       /* Ogre::Item* particleSystem3_item = sceneManager->createItem(planeMesh, Ogre::SCENE_DYNAMIC);
        particleSystem3_item->setDatablock("Marble");
        mParticleSystem3_RootSceneNode = rootNode->createChildSceneNode();
        sceneNode = mParticleSystem3_RootSceneNode->createChildSceneNode();
        sceneNode->setScale(Ogre::Vector3(0.2f));
        sceneNode->attachObject(particleSystem3_item);

        Ogre::ParticleSystem* pSystem3 = sceneManager->createParticleSystem("Examples/Animated/Test1");
        mParticleSystem3_RootSceneNode->attachObject(pSystem3);
        mParticleSystem3_EmmitterSceneNode = mParticleSystem3_RootSceneNode->createChildSceneNode();
        pSystem3->setParticleEmitterRootNode(mParticleSystem3_EmmitterSceneNode);
        Ogre::Item* particleSystem3_emmiter_item =
            sceneManager->createItem(planeMesh, Ogre::SCENE_DYNAMIC);
        particleSystem3_emmiter_item->setDatablock("Marble");
        mParticleSystem3_EmmitterSceneNode->setScale(Ogre::Vector3(0.01f));
        mParticleSystem3_EmmitterSceneNode->attachObject(particleSystem3_emmiter_item);*/

        mGraphicsSystem->getCamera()->setPosition(Ogre::Vector3(0.0f, 40.0f, 120.0f));

        mCameraController = new CameraController(mGraphicsSystem, false);

        TutorialGameState::createScene01();
    }

    void ParticleFXGameState::update(float timeSinceLast)
    {
        mTime += timeSinceLast;

        if (mTime > 10.0f)
            mTime = 0.0f;

       /* mParticleSystem3_RootSceneNode->setPosition(
            Ogre::Vector3(-50.0f * mTime / 10.0f + 25.0f, 2, -50));
        mParticleSystem3_EmmitterSceneNode->setPosition(
            Ogre::Vector3(20.0f * mTime / 10.0f - 10.f, 0.5, 20.0f * mTime / 10.0f - 10));*/

        TutorialGameState::update(timeSinceLast);
    }
}  // namespace Demo

到了這里,關(guān)于第五節(jié) 利用Ogre 2.3實(shí)現(xiàn)雨,雪,爆炸,飛機(jī)噴氣尾焰等粒子效果的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【數(shù)據(jù)結(jié)構(gòu)初階】第五節(jié).棧的詳講

    【數(shù)據(jù)結(jié)構(gòu)初階】第五節(jié).棧的詳講

    提示:文章寫(xiě)完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 文章目錄 前言 一、棧的基本認(rèn)識(shí) 二、棧模擬實(shí)現(xiàn):? 三、棧的實(shí)戰(zhàn)演練 3.1 有效的括號(hào) 3.2 逆波蘭表達(dá)式 3.3?棧的壓入、彈出序列 總結(jié) 上一節(jié)內(nèi)容我們學(xué)習(xí)了鏈表的有關(guān)內(nèi)容,今天我們將進(jìn)行棧的學(xué)習(xí)

    2023年04月23日
    瀏覽(30)
  • 【Git 入門(mén)教程】第五節(jié)、Git遠(yuǎn)程倉(cāng)庫(kù)

    【Git 入門(mén)教程】第五節(jié)、Git遠(yuǎn)程倉(cāng)庫(kù)

    Git是一種分布式版本控制系統(tǒng),它允許開(kāi)發(fā)者在不同計(jì)算機(jī)之間協(xié)作并共享代碼。在本文中,我們將介紹如何以Git為基礎(chǔ)進(jìn)行遠(yuǎn)程協(xié)作。其中包括克隆倉(cāng)庫(kù)、推送代碼、拉取代碼等操作。 要協(xié)作開(kāi)發(fā)一個(gè)Git項(xiàng)目,需要從服務(wù)器上獲取該項(xiàng)目的副本。 運(yùn)行以下命令來(lái)克隆Git倉(cāng)

    2024年02月01日
    瀏覽(25)
  • Python利用pygame實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲

    Python利用pygame實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲

    文章目錄: 一:運(yùn)行效果 1.演示 2.思路和功能 二:代碼 文件架構(gòu) Demo 必備知識(shí):python圖形化編程pygame游戲模塊 效果圖 ?????? Python利用pygame實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲運(yùn)行演示 參考:【Python游戲】1小時(shí)開(kāi)發(fā)飛機(jī)大戰(zhàn)游戲-Pygame版本(1小時(shí)40分鐘) 博主提取資源: 提取

    2024年04月09日
    瀏覽(35)
  • 【測(cè)試開(kāi)發(fā)】第五節(jié).測(cè)試——自動(dòng)化測(cè)試(Selenium工具)

    【測(cè)試開(kāi)發(fā)】第五節(jié).測(cè)試——自動(dòng)化測(cè)試(Selenium工具)

    作者簡(jiǎn)介:大家好,我是未央; 博客首頁(yè):未央.303 系列專欄:Java測(cè)試開(kāi)發(fā) 每日一句: 人的一生,可以有所作為的時(shí)機(jī)只有一次,那就是現(xiàn)在?。?! 前言 一、自動(dòng)化測(cè)試的概念以及分類 二、Selenium—web自動(dòng)化測(cè)試工具 2.1?自動(dòng)化測(cè)試的一些前置工作 2.2 第一個(gè)自動(dòng)化實(shí)例

    2024年02月04日
    瀏覽(31)
  • 第五節(jié) zookeeper集群與分布式鎖_2

    第五節(jié) zookeeper集群與分布式鎖_2

    1)要介紹分布式鎖,首先要提到與分布式鎖相對(duì)應(yīng)的是線程鎖。 線程鎖 :主要用來(lái)給方法、代碼塊加鎖。當(dāng)某個(gè)方法或代碼使用鎖,在同一時(shí)刻僅有一個(gè)線程執(zhí)行該方法或該代碼段。 線程鎖只在同一JVM中有效果,因?yàn)榫€程鎖的實(shí)現(xiàn)在根本上是依靠線程之間共享內(nèi)存實(shí)現(xiàn)的,

    2024年02月19日
    瀏覽(18)
  • Vue2項(xiàng)目練手——通用后臺(tái)管理項(xiàng)目第五節(jié)

    Vue2項(xiàng)目練手——通用后臺(tái)管理項(xiàng)目第五節(jié)

    面包屑 使用組件 使用vuex存儲(chǔ)面包屑數(shù)據(jù) src/store/tab.js src/components/CommonAside.vue src/components/CommonHeader.vue tag 使用組件 文件目錄 CommonTag.vue Main.vue 全部代碼: tabs.js 全部代碼: 使用的組件 對(duì)話框 表單 頁(yè)面布局與校驗(yàn) Users.vue

    2024年02月10日
    瀏覽(27)
  • 書(shū)生·浦語(yǔ)大模型實(shí)戰(zhàn)營(yíng)第五節(jié)課筆記及作業(yè)

    書(shū)生·浦語(yǔ)大模型實(shí)戰(zhàn)營(yíng)第五節(jié)課筆記及作業(yè)

    1.1 模型部署及大模型特點(diǎn) 1.2 大模型部署挑戰(zhàn)及方案 2.1 核心功能-量化 2.2 核心功能-推理引擎TurboMind 2.1 核心功能-推理服務(wù)api server 按照文檔LMDeploy 的量化和部署中的步驟在InternStudio中的 A100(1/4) 機(jī)器上一步步操作即可! 3.1 基礎(chǔ)作業(yè) 使用 LMDeploy 以本地對(duì)話、網(wǎng)頁(yè)Gradio、API服

    2024年01月19日
    瀏覽(22)
  • 第三章:R語(yǔ)言編程 第五節(jié):值傳遞&對(duì)象不變性

    第三章:R語(yǔ)言編程 第五節(jié):值傳遞&對(duì)象不變性

    在R語(yǔ)言中,一切皆為對(duì)象,同時(shí)在調(diào)用函數(shù)的時(shí)候也采用值傳遞的方式,即作為參數(shù)的對(duì)象會(huì)被復(fù)制,然后將副本傳遞給函數(shù) 例如: 這里將數(shù)據(jù)框作為參數(shù)傳遞給函數(shù)的時(shí)候,函數(shù)內(nèi)部的修改將不會(huì)影響原對(duì)象。這是因?yàn)檎{(diào)用f()函數(shù)時(shí)采用的時(shí)值傳遞的方法;df2中保持的不

    2024年03月11日
    瀏覽(28)
  • 【Python零基礎(chǔ)學(xué)習(xí)入門(mén)篇⑤】——第五節(jié):Python中的函數(shù)

    【Python零基礎(chǔ)學(xué)習(xí)入門(mén)篇⑤】——第五節(jié):Python中的函數(shù)

    ???????????? ???Hello,大家好呀我是陳童學(xué)哦,一個(gè)普通大一在校生,請(qǐng)大家多多關(guān)照呀嘿嘿?????? ?????? 技術(shù)這條路固然很艱辛,但既已選擇,該當(dāng)堅(jiān)毅地走下去,加油! ???PUA: ” 你所看到的驚艷都曾平庸歷練 **“**?????? ?????? 最后讓我

    2024年02月04日
    瀏覽(24)
  • AI實(shí)戰(zhàn)營(yíng)第二期 第五節(jié) 《目標(biāo)檢測(cè)與MMDetection》——筆記6

    AI實(shí)戰(zhàn)營(yíng)第二期 第五節(jié) 《目標(biāo)檢測(cè)與MMDetection》——筆記6

    MMDetection 是一個(gè)基于 PyTorch 的目標(biāo)檢測(cè)開(kāi)源工具箱。它是 OpenMMLab 項(xiàng)目的一部分。是目前應(yīng)用最廣的算法庫(kù) 主分支代碼目前支持 PyTorch 1.6 以上的版本。代碼鏈接:https://gitee.com/open-mmlab/mmdetection。 模塊化設(shè)計(jì)。MMDetection 將檢測(cè)框架解耦成不同的模塊組件,通過(guò)組合不同的模塊

    2024年02月08日
    瀏覽(25)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包