查看: 2178|回复: 4

[原创发布] 坐骑插件(图层合成,再也不用担心每个角色都要做坐骑...

[复制链接]
梦石
0
星屑
2632
在线时间
420 小时
注册时间
2016-2-3
回帖
679
发表于 2024-1-29 11:46:49 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 79160475 于 2024-1-29 17:11 编辑

只需要一张坐骑行走图,加坐骑遮挡图层(可选),就能让角色坐上坐骑。再也不用手动一一拼接x个人物*y个坐骑。
插件1.0版本,可能还有点bug,暂未测试对mv的支持。
QQ录屏20240128173553_-original-original.gif
[pre lang="js"]
//=============================================================================
// Zeros_RidingSystem.js
//=============================================================================
/*:
* @plugindesc
* @author 零殇
*
* @param v
* @desc 版本
* @default 1.0
*
* @help
*
* 上坐骑图片叫做Vehicle.png,放在img/characters下面,目前只适配角色大小和坐骑图大小一样的(标准)图片,否则会出现问题
* 坐骑图片编号:图片第一行0 1 2 3,第二行4 5 6 7
*
* 使用方法:
* 事件.setRidingCharacter('Vehicle',坐骑图片编号,玩家x偏移,玩家y偏移,玩家在坐骑上的高度);
*
* setRidingCharacterFront('Vehicle')  //设置坐骑前景(如果有的话可以设置这张覆盖在角色上面的图片)
*
* 比如:
* 上坐骑
* $gamePlayer.setRidingCharacter('Vehicle',0,5,5,20);
* 设置坐骑前景
* $gamePlayer.setRidingCharacterFront('VehicleFrontz')
* 下坐骑
* $gamePlayer.clearRidingCharacter()
*
* 初代版本,可能有bug,欢迎反馈
* 觉得好用可以支持下零殇的游戏,Steam搜索《魔塔地牢》
*/

(function () {

    Game_CharacterBase.prototype.setRidingCharacter = function (characterName, idx, charaHeight, charadx, charady) {
        this.clearRidingCharacter();
        this._ridingCharacterName = characterName;
        this._ridingCharacterIndex = idx | 0;
        this._charadx = charadx | 0;
        this._charady = charady | 0;
        this._charaHeight = charaHeight | 0;
        this._ridingHeightDelta = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
        SceneManager.goto(Scene_Map)
    };

    Game_CharacterBase.prototype.setRidingCharacterFront = function (characterName) {
        this._ridingCharacterNameFront = characterName;
    }

    // 设置3*4帧的高度波动
    Game_CharacterBase.prototype.setRidingHeightDelta = function (arr) {
        this._ridingHeightDelta = arr || [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
    }

    // 检查角色是否骑坐骑
    Game_CharacterBase.prototype.isRiding = function () {
        return !!this._ridingCharacterName;
    };

    // 清除角色的坐骑行走图
    Game_CharacterBase.prototype.clearRidingCharacter = function () {
        this._ridingCharacterName = '';
        this._ridingCharacterNameFront = '';
        this._ridingCharacterIndex = 0;
        SceneManager.goto(Scene_Map)
    };

    // 覆盖Sprite_Character的_updateBitmap方法
    const _Sprite_Character_updateBitmap = Sprite_Character.prototype.updateBitmap;
    Sprite_Character.prototype.updateBitmap = function () {
        _Sprite_Character_updateBitmap.call(this);

        // 检查角色是否骑坐骑,如果是,则拼接角色和坐骑的行走图
        if (this._character.isRiding()) {
            const characterName = this._character.characterName();
            const ridingCharacterName = this._character._ridingCharacterName;
            const ridingCharacterNameFront = this._character._ridingCharacterNameFront;
            var characterIndex = this._character.characterIndex();
            const index = this._character._ridingCharacterIndex;

            const characterBitmap = ImageManager.loadCharacter(characterName);
            const ridingCharacterBitmap = ImageManager.loadCharacter(ridingCharacterName);

            var bitmapSizeX = parseInt(ridingCharacterBitmap.width / 12);
            var bitmapSizeY = parseInt(ridingCharacterBitmap.height / 8);
            var chaBitmapSize = 48;

            let chax = this._character._charadx;
            let chay = this._character._charady;

            let drx = 0;
            let dry = 0;
            if (ridingCharacterName.contains("$")) {
                bitmapSizeX = ridingCharacterBitmap.width / 3;
                bitmapSizeY = ridingCharacterBitmap.height / 4;
                drx = (this.characterPatternX() * bitmapSizeX)
                dry = ((this._character.direction() - 2) / 2 * bitmapSizeY)
            } else {
                drx = (index % 4 * bitmapSizeX * 3 + this.characterPatternX() * bitmapSizeX)
                dry = (Math.floor(index / 4) * bitmapSizeY * 4 + (this._character.direction() - 2) / 2 * bitmapSizeY)
            }

            if (characterName.contains("$")) {
                chaBitmapSize = characterBitmap.width / 3;
                characterIndex = 0;
            }

            let dx = (characterIndex % 4 * chaBitmapSize * 3)
            let dy = (Math.floor(characterIndex / 4) * chaBitmapSize * 4 + (this._character.direction() - 2) / 2 * chaBitmapSize)

            let dirX = (this._character.direction() == 4 ? chax : 0) + (this._character.direction() == 6 ? -chax : 0);
            let dirY = (this._character.direction() == 8 ? chay : 0) + (this._character.direction() == 2 ? -chay : 0);

            let heightDelta = this._character._ridingHeightDelta[this.characterPatternX() + this.characterPatternY() * 3];

            let posX = parseInt((bitmapSizeX - chaBitmapSize) / 2 + dirX + chax);
            let posY = parseInt(-heightDelta + (bitmapSizeY - chaBitmapSize) / 2 + dirY + bitmapSizeY - this._character._charaHeight - 8);

            console.log("pos", posX, posY)


            const combinedBitmap = new Bitmap(bitmapSizeX + chax * 2, bitmapSizeY * 2);
            console.log("combinedBitmap", combinedBitmap.width, combinedBitmap.height)
            combinedBitmap.blt(ridingCharacterBitmap, drx, dry, bitmapSizeX, bitmapSizeY, chax, bitmapSizeY);
            combinedBitmap.blt(characterBitmap, dx, dy, chaBitmapSize, chaBitmapSize, posX, posY);

            if (ridingCharacterNameFront) {
                const ridingCharacterBitmapFront = ImageManager.loadCharacter(ridingCharacterNameFront);
                combinedBitmap.blt(ridingCharacterBitmapFront, drx, dry, bitmapSizeX, bitmapSizeY, chax, bitmapSizeY);
            }

            this.bitmap = combinedBitmap;
        }
    };

    Sprite_Character.prototype.updateCharacterFrame = function () {
        const pw = this.patternWidth();
        const ph = this.patternHeight();
        const sx = (this.characterBlockX() + this.characterPatternX()) * pw;
        const sy = (this.characterBlockY() + this.characterPatternY()) * ph;

        if (this._character.isRiding()) return;
        else this.setFrame(sx, sy, pw, ph);
    };

})();
[/pre]

评分

参与人数 3赞 +3 收起 理由
rfvtgbzxc + 1 精品文章
妾而君亦然 + 1 我很赞同
马铃薯条 + 1 我很赞同

查看全部评分

MV/MZ Zeros魔塔样板

原创ARPG系统火爆出售中(论坛优惠价)(内含90+功能)
-------------------------------------------------------------------
*事件党*福利!本人两年的事件研究大集合

!点击上面看*事件党*详情(内含200+收集插件)
!
!
!
梦石
0
星屑
1864
在线时间
255 小时
注册时间
2018-7-5
回帖
62
发表于 2024-1-29 14:50:24 | 显示全部楼层
好!!!
回复

使用道具 举报

梦石
0
星屑
93
在线时间
13 小时
注册时间
2024-2-19
回帖
3
发表于 2024-3-12 17:08:37 | 显示全部楼层
66666,厉害
回复

使用道具 举报

梦石
0
星屑
1076
在线时间
156 小时
注册时间
2022-5-19
回帖
103
发表于 2024-6-13 19:40:00 | 显示全部楼层
用完这个插件角色踩在水上面不会显示在水下的那种效果,
回复

使用道具 举报

梦石
0
星屑
2632
在线时间
420 小时
注册时间
2016-2-3
回帖
679
 楼主| 发表于 2024-7-5 12:09:43 | 显示全部楼层
jm1280065234 发表于 2024-6-13 19:40
用完这个插件角色踩在水上面不会显示在水下的那种效果,

没试过,你可以试试下
MV/MZ Zeros魔塔样板

原创ARPG系统火爆出售中(论坛优惠价)(内含90+功能)
-------------------------------------------------------------------
*事件党*福利!本人两年的事件研究大集合

!点击上面看*事件党*详情(内含200+收集插件)
!
!
!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部