【RPG Maker MV插件編程】【實例教程2】制作一個啟動畫面

作者:Mandarava(鰻駝螺)
微博:@鰻駝螺pro

啟動畫面是游戲開始時,在進入標題畫面前的一個顯示畫面盒犹,通常用于展示游戲開發(fā)商的Logo坐梯。RMMV自帶一個官方啟動畫面插件 MadeWithMv,可以設(shè)定自己的啟動圖毅人,一般來說托启,這個插件足夠使用宅倒。本文介紹如何制作類似的一個啟動畫面插件。

首先驾中,新建一個名為 MND_Splash.js 的文件放到 js/plugins 目錄下,并在RMMV中安裝該插件模聋。

從哪里開始肩民?

游戲在啟動時,Scene_Boot 類用于初始化整個游戲链方,而 Scene_Boot.prototype.start 方法是場景開始時的處理方法持痰。啟動畫面是游戲啟動時的第一個“場景”,所以要創(chuàng)建啟動畫面祟蚀,就應(yīng)該在 start 方法中創(chuàng)建工窍。來看一下 start 原始方法的實現(xiàn):

Scene_Boot.prototype.start = function() {
    Scene_Base.prototype.start.call(this);
    SoundManager.preloadImportantSounds();
    if (DataManager.isBattleTest()) {
        DataManager.setupBattleTest();
        SceneManager.goto(Scene_Battle);
    } else if (DataManager.isEventTest()) {
        DataManager.setupEventTest();
        SceneManager.goto(Scene_Map);
    } else {
        this.checkPlayerLocation();
        DataManager.setupNewGame();
        SceneManager.goto(Scene_Title);
        Window_TitleCommand.initCommandPosition();
    }
    this.updateDocumentTitle();
};
  1. DataManager.isBattleTest() 檢測當(dāng)前是否為進行戰(zhàn)斗測試,如果是就進入戰(zhàn)斗場景前酿,比如在 數(shù)據(jù)庫-敵群 界面進行戰(zhàn)斗測試時患雏;
  2. DataManager.isEventTest() 檢測當(dāng)前是否為事件測試,如果是則進入當(dāng)前的游戲地圖界面罢维,比如在編輯事件時進行事件內(nèi)容的測試時淹仑。
  3. 除此之外, else 部份就是正常啟動游戲時要進入的場景的選擇肺孵,可以在這里創(chuàng)建并進入我們的啟動畫面場景匀借。

這里 SceneManager.goto(Scene_Title) 方法用于進入標題畫面。從這里可以看出平窘,RMMV在開始游戲時默認是直接進入標題畫面的吓肋,所以很簡單,只要將這里的 SceneManager.goto(Scene_Title) 改成進入我們的啟動畫面即可瑰艘,如:SceneManager.goto(Scene_Splash)(假設(shè)我們的啟動畫面場景類叫做Scene_Splash)是鬼,再由啟動畫面進入標題畫面,為此就來創(chuàng)建我們的啟動畫面的場景類紫新。

創(chuàng)建啟動畫面的場景類

要創(chuàng)建一個新的場景類屑咳,最簡單的做法是改一個現(xiàn)有的場景類。場景類有很多弊琴,包括:Scene_Base兆龙,Scene_BootScene_Battle紫皇,Scene_Debug慰安,Scene_EquipScene_File聪铺,Scene_GameEnd化焕,Scene_GameoverScene_ItemBase铃剔,Scene_Item撒桨,Scene_LoadScene_Map键兜,Scene_MenuBase凤类,Scene_MenuScene_Name普气,Scene_Options谜疤,Scene_SaveScene_Shop现诀,Scene_Skill夷磕,Scene_StatusScene_Title仔沿。分析一下這些場景類的實現(xiàn)坐桩,確定哪些方法需要,最后把我們要用到的方法拷貝到 MND_Splash.js 中封锉,我們的場景類命名為:Scene_Splash撕攒。最后我們需要的方法包括以下幾個:構(gòu)建器部分、Scene_Splash.prototype.create 方法烘浦、Scene_Splash.prototype.start 方法抖坪、Scene_Splash.prototype.stop 方法、Scene_Splash.prototype.terminate 方法闷叉、Scene_Splash.prototype.update 方法等(當(dāng)然除了構(gòu)建器部分外擦俐,其它方法都是可選的)。下面就在Scene_Splash類中重寫這些方法握侧。

構(gòu)建器部分

Scene_Base類是所有Scene類的基類蚯瞧,我們要創(chuàng)建的類Scene_Splash實際比較簡單,所以只需要直接繼承Scene_Base類就可以了品擎。下面是Scene_Splash的構(gòu)建器及初始化代碼:

function Scene_Splash() {
    this.initialize.apply(this, arguments);
}

Scene_Splash.prototype = Object.create(Scene_Base.prototype);
Scene_Splash.prototype.constructor = Scene_Splash;

Scene_Splash.prototype.initialize = function() {
    Scene_Base.prototype.initialize.call(this);
};

Scene_Splash.prototype.create方法

該方法是在場景創(chuàng)建時要執(zhí)行的處理埋合,在這里創(chuàng)建組件并將它們加入渲染隊列中。所以萄传,我們可以在這里添加要顯示logo圖片甚颂。假設(shè)我們的Logo圖片放在 img/system/MyLogo.png,那么該方法的重寫實現(xiàn)如下:

Scene_Splash.prototype.create = function() {
    Scene_Base.prototype.create.call(this);

    this.logo=new Sprite();
    this.logo.bitmap=ImageManager.loadSystem("MyLogo");    
    this.addChild(this.logo);
};

Scene_Base.prototype.create.call(this);這個是調(diào)用基類(父類)的同名方法,因為我們這里是重寫基類的該方法振诬,你需要讓基類中的操作也執(zhí)行一下(除非你明確不想執(zhí)行蹭睡;即使現(xiàn)在基類的該方法沒有執(zhí)行任何操作,為了以后的兼容赶么,比如官方在未來的某個版本添加了操作肩豁,也應(yīng)該用調(diào)用基類的實現(xiàn))。this.logo 就是用于顯示我們的Logo圖片的精靈對象辫呻,使用場景的 addChild() 方法可以將精靈加入到場景清钥。在這里我們并沒有為精靈設(shè)置顯示座標,因為此時的Logo圖片還沒有加載完畢放闺,讀取到的圖片尺寸高寬都是0祟昭,如果你需要根據(jù)圖片的高寬為其定位,那么雄人,這個定位處理應(yīng)該放到 start 方法中去从橘。

Scene_Splash.prototype.start方法

該方法是場景啟動時要執(zhí)行的處理念赶。這里用 startFadeIn(duration, white) 方法讓場景出現(xiàn)淡入效果础钠。同時將logo圖片顯示到場景正中間。

Scene_Splash.prototype.start = function() {
    Scene_Base.prototype.start.call(this);
    this.startFadeIn(this.slowFadeSpeed(), false);

    //將this.logo定位到場景的正中(由于沒有使用logo的尺寸來定位叉谜,所以下面這段代碼放到 create 方法中也是沒問題的)
    this.logo.anchor.x=0.5;
    this.logo.anchor.y=0.5;
    this.logo.x=Graphics.width/2;
    this.logo.y=Graphics.height/2;
};

Graphics.widthGraphics.height 用于獲取游戲屏幕的寬高尺寸旗吁。這里將logo精靈的錨點設(shè)置到其正中心,再將其坐標設(shè)置到屏幕正中心停局,這樣就能讓精靈呈現(xiàn)在屏幕中心很钓。

Scene_Splash.prototype.stop方法

該方法是場景停止時要執(zhí)行的處理。這里用一個 fadeOutAll 淡出效果董栽,淡出畫面及所有背景音樂码倦、音效。

Scene_Splash.prototype.stop = function() {
    Scene_Base.prototype.stop.call(this);
    this.fadeOutAll();
};

Scene_Splash.prototype.terminate方法

該方法是在切換到其它場景時終止當(dāng)前場景的處理锭碳。假如你在啟動畫面中添加了背景音樂袁稽,那么可以在這里終止背景音樂或音效的播放。

Scene_Splash.prototype.terminate = function() {
    Scene_Base.prototype.terminate.call(this);
    AudioManager.stopAll();
};

Scene_Splash.prototype.update方法

該方法是每幀運行一次的更新處理擒抛,可以在該方法中檢測是否需要切換到其它場景推汽、要切換到哪個場景等。(當(dāng)然歧沪,如果你要實現(xiàn)動態(tài)logo歹撒,那么也可以在這里更新logo動畫。)
  現(xiàn)在诊胞,我們想在啟動畫面停留90幀暖夭,90幀后自動切換到標題畫面。那么代碼如下:

Scene_Splash.prototype.update = function() {
    this._wait = this._wait || 0;//如果this._wait尚未定義,則定義并賦值為0鳞尔;當(dāng)然嬉橙,這個_wait的定義代碼最好放到構(gòu)建器或create方法中進行
    if(this._wait>=0) {
        if (this._wait >= 90) {
            SceneManager.goto(Scene_Title);
            this._wait = -1;//讓_wait=-1確保90幀后這段代碼不會再被運行,否則會出現(xiàn)一直要goto卻goto不了的情形
        } else {
            this._wait++;
        }
    }
    Scene_Base.prototype.update.call(this);
};

如果同時想在玩家點擊啟動畫面或按下確定鍵后立即切換到標題畫面而不用再等待完90幀寥假,可以改為以下代碼:

Scene_Splash.prototype.update = function() {
    if (this.isActive() && !this.isBusy() && (Input.isTriggered('ok') || TouchInput.isTriggered())) {//新增
        SceneManager.goto(Scene_Title);
        return;
    }
    
    if (this._wait == undefined) { this._wait = 0; }
    if (this._wait >= 0) {
        if (this._wait >= 90) {
            SceneManager.goto(Scene_Title);
            this._wait = -1
        } else {
            this._wait++;
        }
    }
    Scene_Base.prototype.update.call(this);
};

Input.isTriggered('ok') 用于檢測玩家是否按下了確定鍵市框,TouchInput.isTriggered() 用于檢測玩家是否點擊了屏幕贼穆,如果按下了確定鍵或點擊了屏幕盖彭,則進入標題界面。

至此蒋纬,一個啟動畫面的插件就完成了萤彩,完整代碼如下:


Scene_Boot.prototype.start = function() {
    Scene_Base.prototype.start.call(this);
    SoundManager.preloadImportantSounds();
    if (DataManager.isBattleTest()) {
        DataManager.setupBattleTest();
        SceneManager.goto(Scene_Battle);
    } else if (DataManager.isEventTest()) {
        DataManager.setupEventTest();
        SceneManager.goto(Scene_Map);
    } else {
        this.checkPlayerLocation();
        DataManager.setupNewGame();
        SceneManager.goto(Scene_Splash);
        Window_TitleCommand.initCommandPosition();
    }
    this.updateDocumentTitle();
};

function Scene_Splash() {
    this.initialize.apply(this, arguments);
}

Scene_Splash.prototype = Object.create(Scene_Base.prototype);
Scene_Splash.prototype.constructor = Scene_Splash;

Scene_Splash.prototype.initialize = function() {
    Scene_Base.prototype.initialize.call(this);
};

Scene_Splash.prototype.create = function() {
    Scene_Base.prototype.create.call(this);

    this._wait = 0;
    this.logo=new Sprite();
    this.logo.bitmap=ImageManager.loadSystem("MyLogo");
    this.addChild(this.logo);
};

Scene_Splash.prototype.start = function() {
    Scene_Base.prototype.start.call(this);
    this.startFadeIn(this.slowFadeSpeed(), false);

    this.logo.anchor.x=0.5;
    this.logo.anchor.y=0.5;
    this.logo.x=Graphics.width/2;
    this.logo.y=Graphics.height/2;
};

Scene_Splash.prototype.update = function() {
    if (this.isActive() && !this.isBusy() && (Input.isTriggered('ok') || TouchInput.isTriggered())) {
        SceneManager.goto(Scene_Title);
        return;
    }

    this._wait = this._wait || 0;
    if (this._wait >= 0) {
        if (this._wait >= 90) {
            SceneManager.goto(Scene_Title);
            this._wait = -1
        } else {
            this._wait++;
        }
    }
    Scene_Base.prototype.update.call(this);
};

Scene_Splash.prototype.stop = function() {
    Scene_Base.prototype.stop.call(this);
    this.fadeOutAll();
};

Scene_Splash.prototype.terminate = function() {
    Scene_Base.prototype.terminate.call(this);
    AudioManager.stopAll();
};

可以改進的地方:啟動圖的圖片粪滤、等待時間這二項可以做成插件參數(shù),以便可以自由設(shè)置雀扶。有關(guān)如何實現(xiàn)插件參數(shù)杖小,請參考我的另一篇教程:【RPG Maker MV插件編程】【實例教程1】怎樣編寫一個插件?愚墓。

by: Mandarava(鰻駝螺) 2017.06.14

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末予权,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子浪册,更是在濱河造成了極大的恐慌扫腺,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件村象,死亡現(xiàn)場離奇詭異笆环,居然都是意外死亡,警方通過查閱死者的電腦和手機厚者,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門躁劣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人库菲,你說我怎么就攤上這事账忘。” “怎么了蝙昙?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵闪萄,是天一觀的道長。 經(jīng)常有香客問我奇颠,道長败去,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任烈拒,我火速辦了婚禮圆裕,結(jié)果婚禮上广鳍,老公的妹妹穿的比我還像新娘。我一直安慰自己吓妆,他們只是感情好赊时,可當(dāng)我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著行拢,像睡著了一般祖秒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舟奠,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天竭缝,我揣著相機與錄音,去河邊找鬼沼瘫。 笑死抬纸,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的耿戚。 我是一名探鬼主播湿故,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼膜蛔!你這毒婦竟也來了坛猪?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤飞几,失蹤者是張志新(化名)和其女友劉穎砚哆,沒想到半個月后独撇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屑墨,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年纷铣,在試婚紗的時候發(fā)現(xiàn)自己被綠了卵史。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡搜立,死狀恐怖以躯,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情啄踊,我是刑警寧澤忧设,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站颠通,受9級特大地震影響址晕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜顿锰,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一谨垃、第九天 我趴在偏房一處隱蔽的房頂上張望启搂。 院中可真熱鬧,春花似錦刘陶、人聲如沸胳赌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疑苫。三九已至,卻和暖如春纷责,著一層夾襖步出監(jiān)牢的瞬間缀匕,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工碰逸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乡小,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓饵史,卻偏偏與公主長得像满钟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子胳喷,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容