Project1

标题: 真·RMXP行走方式 [打印本页]

作者: yangff    时间: 2008-1-16 20:36
标题: 真·RMXP行走方式
1、标题:真·XP行走方式

2、作者:yangff

3、摘要:无

4、首发网址:http://z.66rpg.com/dispbbs.asp?boardID=9&ID=36&page=1
http://rpg.blue/viewthread.php?tid=72173
5、教学分类:RMVX

6、发布日期:2008/1/16

7、适用人群:想做仿XP的RPG制作者

8、通用度:★★☆

9、技术应用的复杂度:60/15

10、技术学习的理解难度:20

12、关键字: XP、VX、行走

13、作者的话:

XP的行走方式不错的。

14、教学正文:
  1. #==============================================================================
  2. # ■ Sprite_Character
  3. #------------------------------------------------------------------------------
  4. #  角色显示用脚本。监视 Game_Character 类的实例、
  5. # 自动变化脚本状态。
  6. #==============================================================================

  7. class Sprite_Character < Sprite_Base
  8.   #--------------------------------------------------------------------------
  9.   # ● 定量
  10.   #--------------------------------------------------------------------------
  11.   BALLOON_WAIT = 12                  # 表情最后帧的等待时间
  12.   #--------------------------------------------------------------------------
  13.   # ● 定义实例变量
  14.   #--------------------------------------------------------------------------
  15.   attr_accessor :character                # 角色
  16.   #--------------------------------------------------------------------------
  17.   # ● 初始化对像
  18.   #     viewport  : 查看端口
  19.   #     character : 角色 (Game_Character)
  20.   #--------------------------------------------------------------------------
  21.   def initialize(viewport, character = nil)
  22.     super(viewport)
  23.     @character = character
  24.     @balloon_duration = 0
  25.     update
  26.   end
  27.   #--------------------------------------------------------------------------
  28.   # ● 释放
  29.   #--------------------------------------------------------------------------
  30.   def dispose
  31.     dispose_balloon
  32.     super
  33.   end
  34.   #--------------------------------------------------------------------------
  35.   # ● 刷新画面
  36.   #--------------------------------------------------------------------------
  37.   def update
  38.     super
  39.     update_bitmap
  40.     self.visible = (not @character.transparent)
  41.     update_src_rect
  42.     self.x = @character.screen_x
  43.     self.y = @character.screen_y
  44.     self.z = @character.screen_z
  45.     self.opacity = @character.opacity
  46.     self.blend_type = @character.blend_type
  47.     self.bush_depth = @character.bush_depth
  48.     update_balloon
  49.     if @character.animation_id != 0
  50.       animation = $data_animations[@character.animation_id]
  51.       start_animation(animation)
  52.       @character.animation_id = 0
  53.     end
  54.     if @character.balloon_id != 0
  55.       @balloon_id = @character.balloon_id
  56.       start_balloon
  57.       @character.balloon_id = 0
  58.     end
  59.   end
  60.   #--------------------------------------------------------------------------
  61.   # ● 获取图块图像的指定图块
  62.   #     tile_id : 图块 ID
  63.   #--------------------------------------------------------------------------
  64.   def tileset_bitmap(tile_id)
  65.     set_number = tile_id / 256
  66.     return Cache.system("TileB") if set_number == 0
  67.     return Cache.system("TileC") if set_number == 1
  68.     return Cache.system("TileD") if set_number == 2
  69.     return Cache.system("TileE") if set_number == 3
  70.     return nil
  71.   end
  72.   #--------------------------------------------------------------------------
  73.   # ● 更新画面
  74.   #--------------------------------------------------------------------------
  75.   def update_bitmap
  76.     if @tile_id != @character.tile_id or
  77.        @character_name != @character.character_name or
  78.        @character_index != @character.character_index
  79.       @tile_id = @character.tile_id
  80.       @character_name = @character.character_name
  81.       @character_index = @character.character_index
  82.       if @tile_id > 0
  83.         self.bitmap = Cache.tile($game_map.tileset_name,
  84.           @tile_id)
  85.         self.src_rect.set(0, 0, 32, 32)
  86.         self.ox = 16
  87.         self.oy = 32
  88.       # 元件 ID 为无效值的情况下
  89.       else
  90.         self.bitmap = Cache.character(@character.character_name)
  91.         @cw = bitmap.width / 4
  92.         @ch = bitmap.height / 4
  93.         self.ox = @cw / 2
  94.         self.oy = @ch
  95.      end
  96.    end
  97. end
  98.   #--------------------------------------------------------------------------
  99.   # ● 刷新传送的矩形数据
  100.   #--------------------------------------------------------------------------
  101.   def update_src_rect
  102.     if @tile_id == 0
  103. #     index = @character.character_index
  104. #     pattern = @character.pattern < 3 ? @character.pattern : 1
  105. #     sx = (pattern * 32) #* @cw
  106. #     #sy = (index / 4 * 4 + (@character.direction - 2) / 2) * @ch
  107. #     sy = @character.direction * 32
  108. #     self.src_rect.set(sx, sy, @cw, @ch)
  109.       sx = @character.pattern * @cw
  110.       sy = (@character.direction - 2) / 2 * @ch
  111.       self.src_rect.set(sx, sy, @cw, @ch)
  112.     end
  113.   end
  114.   #--------------------------------------------------------------------------
  115.   # ● 开始显示表情图标
  116.   #--------------------------------------------------------------------------
  117.   def start_balloon
  118.     dispose_balloon
  119.     @balloon_duration = 8 * 8 + BALLOON_WAIT
  120.     @balloon_sprite = ::Sprite.new(viewport)
  121.     @balloon_sprite.bitmap = Cache.system("Balloon")
  122.     @balloon_sprite.ox = 16
  123.     @balloon_sprite.oy = 32
  124.     update_balloon
  125.   end
  126.   #--------------------------------------------------------------------------
  127.   # ● 刷新表情图标
  128.   #--------------------------------------------------------------------------
  129.   def update_balloon
  130.     if @balloon_duration > 0
  131.       @balloon_duration -= 1
  132.       if @balloon_duration == 0
  133.         dispose_balloon
  134.       else
  135.         @balloon_sprite.x = x
  136.         @balloon_sprite.y = y - height
  137.         @balloon_sprite.z = z + 200
  138.         if @balloon_duration < BALLOON_WAIT
  139.           sx = 7 * 32
  140.         else
  141.           sx = (7 - (@balloon_duration - BALLOON_WAIT) / 8) * 32
  142.         end
  143.         sy = (@balloon_id - 1) * 32
  144.         @balloon_sprite.src_rect.set(sx, sy, 32, 32)
  145.       end
  146.     end
  147.   end
  148.   #--------------------------------------------------------------------------
  149.   # ● 释放表情图标
  150.   #--------------------------------------------------------------------------
  151.   def dispose_balloon
  152.     if @balloon_sprite != nil
  153.       @balloon_sprite.dispose
  154.       @balloon_sprite = nil
  155.     end
  156.   end
  157. end
复制代码

17、教学相关RGSS类:

Sprite_Character




作者: 叮当    时间: 2008-1-16 20:42
是指XP的步行图吗? 如果是的话… 那种方式很鸡肋,而且日本已经有脚本了…
作者: yangff    时间: 2008-1-16 20:46
以下引用叮当于2008-1-16 12:42:26的发言:

是指XP的步行图吗? 如果是的话… 那种方式很鸡肋,而且日本已经有脚本了…

是啊!
很简单5分钟搞定 {/tp}
(复制 修改格式 搞定)
选择角色土那里自己摸索吧
会被切成
n*n。。。
第一行前4个=向下
第2行前4个=**
反正和XP一样
多出来的54
反正游戏 里正常

作者: 美兽    时间: 2008-1-16 20:47
以下引用叮当于2008-1-16 12:42:26的发言:

是指XP的步行图吗? 如果是的话… 那种方式很鸡肋,而且日本已经有脚本了…


日本有,这里没有吧?

不过,请问下,日本有像素拉线式的行走方式吗?如果有,我就删除了。

作者: kuanghao    时间: 2008-1-16 21:09
其实还是vx的方式好- -节省
作者: yangff    时间: 2008-1-16 21:35
以下引用kuanghao于2008-1-16 13:09:18的发言:

其实还是vx的方式好- -节省

对于素材来讲我们是节约的好孩子
对了网站暂时还做不了(期末)
作者: 叮当    时间: 2008-1-16 21:52
日本的脚本都会被转过来… 我是说不要重复劳动。


日本有像素拉线式的行走方式

啥?
作者: secondsen    时间: 2008-1-16 22:30
是按像素行走么?{/se}
作者: 玄天    时间: 2008-1-16 22:36
以下引用secondsen于2008-1-16 14:30:33的发言:

是按像素行走么?

是按米来走的
作者: 很H很BL    时间: 2008-1-16 22:40
提示: 作者被禁止或删除 内容自动屏蔽
作者: 美兽    时间: 2008-1-17 05:49
以下引用叮当于2008-1-16 13:52:38的发言:

日本的脚本都会被转过来… 我是说不要重复劳动。



日本有像素拉线式的行走方式

啥?



就是以像素方式而不是格子方式行走,例如设定距离16像素,向左上移动,那么算法是先拉一条45度斜线,之后判断16 * 16像素内是否有阻碍,若没有,移动16单位。
反之若有阻碍,假设阻碍在12像素位置,则人物会移动到12像素,这样可以实现人物在不规则边缘的行走。

作者: 很H很BL    时间: 2008-1-17 06:00
提示: 作者被禁止或删除 内容自动屏蔽
作者: 美兽    时间: 2008-1-17 06:04
以下引用很H很BL于2008-1-16 22:00:06的发言:

樱雅有个XP脚本貌似是这种方式,根据按键时间来判定移动像素


是吗…………原以为没人会想,那仍掉好了,不过我那个仍然是按一下走一次,只是行走的像素是根据不规则边缘重新换算距离了,所以专门有个脚本是扫描地图的,将所有地图数据合成一个库,以便随时调用,提高效率。

作者: yangff    时间: 2008-1-17 06:26
不管XP还是VX通行设置都是32*32滴
作者: 柳柳    时间: 2008-1-17 07:08
XP时候有一个按像素移动(就是那个加了重力变成超级玛丽脚本的那个),我移植过VX一份……{/gg}
然后改改变成了“小红点”,就可以沿着不规则地形开车了……{/gg}
自己测试用的……请搜“小红点”……{/gg}
http://rpg.blue/viewthread.php?tid=71378&ntime=2008%2D1%2D16+23%3A10%3A23
因为没有游戏来应用,所以其实相当于没好好DEBUG....

不过我希望美兽的还是发了吧,我这个改花了,弄2D的不好还原回去了。如果可能的话人物能跳就更好了,就是像素移动 + 人物学会跳跃技能后跳过一些障碍。雨血的作者提了这样一个需求,不过我实现的结果估计和他想要的相去太远了……
作者: 美兽    时间: 2008-1-18 04:33
今朝晴空春无限,古曲顿挫已千年,哎~~

我不清楚你花费多大功夫梳理心情来问我,但下面的话与以往任何恩怨无关。

“我不发任何以商业素材为主体的东西”
作者: 很H很BL    时间: 2008-1-18 04:53
提示: 作者被禁止或删除 内容自动屏蔽
作者: 御灵    时间: 2008-2-22 19:32
发布完毕。
http://rpg.blue/web/htm/news982.htm
vip+2




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1