Project1

标题: 用图片做值槽的脚本要怎么写 [打印本页]

作者: Gunderub    时间: 2011-2-19 00:21
标题: 用图片做值槽的脚本要怎么写
本帖最后由 Gunderub 于 2011-2-19 11:10 编辑

rt。而且要在平时地图画面也能显示。
(有点像arpg那样把HP MP EXP 头像都显示在画面的一角)
比如说hp。
有1张满血时候的血槽图片。
和一张底槽图片。
然后要怎么写呢、
我新手。


作者: 后知后觉    时间: 2011-2-19 09:55
论坛搜索 值槽绘制
这是一个录像教程.作者是 七夕小雨
至于显示在地图上.有这类的现成脚本.
或许就带有用图片来显示的功能.
可以搜索比如:
在地图上显示血条
在地图上显示hp
……
作者: Gunderub    时间: 2011-2-19 11:03
我就是下不了内个教程。。
作者: 后知后觉    时间: 2011-2-19 11:51
http://hzhj1985.qupan.cc/4177177.html
作者: Gunderub    时间: 2011-2-19 14:04
本帖最后由 Gunderub 于 2011-2-19 14:06 编辑

回复 后知后觉 的帖子

他说我不是vip不给我下…
由于该文件大于10M且连续90天没有被人下载使用,现在只有VIP高级会员才可以下载此文件!

作者: Gunderub    时间: 2011-2-19 17:37
我找到了个脚本,图片值槽的。
self.contents.blt(x - 15, y - ch -5 , back, src_rect)这句是什么意思

作者: 后知后觉    时间: 2011-2-19 17:44
http://u.115.com/file/f37ca08477#
值槽绘制.rar.rar
作者: Gunderub    时间: 2011-2-19 18:26
本帖最后由 Gunderub 于 2011-2-19 18:32 编辑

谢谢楼上的。我下了。看了。有几个地方搞不懂。。
...内教程作者直接在内个Window_BattleStatus的上边定义描绘方法。不用在描绘方法前先定义一个类吗?

还有就是self.contents.blt(x - 15, y - ch -5 , back, src_rect)这句是什么意思  对于F1里边blt的内个方法的解释我看不懂

作者: 后知后觉    时间: 2011-2-19 19:01
他那样定义应该算是一个全局的函数.
属于 Object 类.Object 类算是一个总类.
别的类都是他的子类.
更详细的说明和解读可以去看看 发布区置顶帖里秀秀的走火入魔教程.

bitmapA = Bitmap.new(640, 480)
bitmapB = Bitmap.new(480, 320)
rect = Rect.new(5, 6, 160, 32)
bitmapA.blt(16, 16, bitmapB, rect)
意思是把 bitmapB的 rect 区域 绘制到 bitmapA的以16,16 为左上点的矩形区域内.
self.contents 就是一个 Bitmap 类的实例
作者: Gunderub    时间: 2011-2-19 19:25
后知后觉 发表于 2011-2-19 19:01
他那样定义应该算是一个全局的函数.
属于 Object 类.Object 类算是一个总类.
别的类都是他的子类.

意思是把 bitmapB的 rect 区域 绘制到 bitmapA的以16,16 为左上点的矩形区域内.
self.contents 就是一个 Bitmap 类的实例

我好好理解下…谢谢你
作者: Gunderub    时间: 2011-2-19 21:19
回复 后知后觉 的帖子

---------------------------------------
我按照教程写成了这样
  
  def HP (actor,x,y,w)
  
      
     @hpbar.bitmap=Bitmap.new ("Graphics/Pictures/HPdi.png")
     
     @src_hpbar_rect = Rect.new(0, 0, @hpbar.bitmap.width, @hpbar.bitmap.heigth)
     
     self.contents.blt(x , 32 , @hpbar.bitmap , @src_hpbar_rect )
      
     w1 = @hp.bitmap.width * actor.hp/actor.maxhp
     
     @hp.bitmap=Bitmap.new("Graphics/Pictures/HP.png")
     @src_hp_rect= Rect.new(0, 0, w1, @hp_bitmap.heigth)
     self.contents.blt(x+1, y+1, @hp_bitmap, @src_hp_rect)
     end
   
def MP (actor,x,y,w)
  
      
     @mpbar.bitmap=Bitmap.new ("Graphics/Pictures/MPdi.png")
     
     @src_mpbar_rect = Rect.new(0, 0, @mpbar.bitmap.width, @mpbar.bitmap.heigth)
     
     self.contents.blt(x , 32 , @mpbar.bitmap , @src_mpbar_rect )
      
     w2 = @mp.bitmap.width * actor.mp/actor.maxmp
     
     @mp.bitmap=Bitmap.new("Graphics/Pictures/MP.png")
     @src_mp_rect= Rect.new(0, 0, w2, @mp_bitmap.heigth)
     self.contents.blt(x+1, y+1, @mp_bitmap, @src_mp_rect)
     end
   

然后怎么弄到地图画面去…
还要把以上内容写到一个新类再在scene_map插进@**=**。new 、 @**.dispose  、**.update 吗?
作者: 945127391    时间: 2011-2-19 21:41
据我所知,要写一个窗口........
作者: Gunderub    时间: 2011-2-19 21:43
那么新建一个窗口 然后初始化后再把内容插进去么?
作者: 后知后觉    时间: 2011-2-20 23:03
写了一小段.
我没用 Window 我用的 Sprite

  1. #==============================================================================
  2. # ■ HpSp
  3. #------------------------------------------------------------------------------
  4. #  使用图片来显示Hp条Sp条的类
  5. #==============================================================================

  6. class HpSp
  7.   Switch_ID = 14    # 当这个开关为ON时才会显示
  8.   #--------------------------------------------------------------------------
  9.   # ● 初始化对像
  10.   #     index    : 队伍中的位置
  11.   #     x        : Hp条底图的x坐标
  12.   #     y        : Hp条底图的y坐标
  13.   #--------------------------------------------------------------------------
  14.   def initialize(index, x, y)
  15.     @index = index
  16.     @actor = $game_party.actors[@index]
  17.     # 生成用来显示的 精灵(Sprite)
  18.     @hpback = Sprite.new
  19.     @hpbar = Sprite.new
  20.     @spback = Sprite.new
  21.     @spbar = Sprite.new
  22.     # 为了方便管理 把精灵都集中起来
  23.     @sprites = []
  24.     @sprites.push(@hpback)
  25.     @sprites.push(@hpbar)
  26.     @sprites.push(@spback)
  27.     @sprites.push(@spbar)
  28.     # 根据队伍内该位置的角色是否存在来设置精灵是否可见
  29.     # 以及对话框是否正在显示中和开关是否打开
  30.     for sprite in @sprites
  31.       sprite.visible = ([email protected]? and
  32.                         !$game_temp.message_window_showing and
  33.                         $game_switches[Switch_ID])
  34.     end
  35.     # 设置显示高度
  36.     @hpback.z = 6000
  37.     @hpbar.z = 6500
  38.     @spback.z = 6000
  39.     @spbar.z = 6500
  40.     # 设置这几个精灵的X、Y坐标 具体数值根据使用的图片的大小和拜访样式而定
  41.     @hpback.x = x
  42.     @hpbar.x = x + 1
  43.     @spback.x = x
  44.     @spbar.x = x + 1
  45.     @hpback.y = y
  46.     @hpbar.y = y + 1
  47.     @spback.y = y + 12
  48.     @spbar.y = y + 13
  49.     # 设置位图
  50.     @hpback.bitmap = Bitmap.new("Graphics/Pictures/HpBack.png")
  51.     @hpbar.bitmap = Bitmap.new("Graphics/Pictures/HpBar.png")
  52.     @spback.bitmap = Bitmap.new("Graphics/Pictures/SpBack.png")
  53.     @spbar.bitmap = Bitmap.new("Graphics/Pictures/SpBar.png")
  54.     # 设置显示区域为整张图
  55.     @hpback.src_rect = Rect.new(0, 0, @hpback.bitmap.width, @hpback.bitmap.height)
  56.     @spback.src_rect = Rect.new(0, 0, @spback.bitmap.width, @spback.bitmap.height)
  57.     @hpbar.src_rect = Rect.new(0, 0, @hpbar.bitmap.width, @hpbar.bitmap.height)
  58.     @spbar.src_rect = Rect.new(0, 0, @spbar.bitmap.width, @spbar.bitmap.height)
  59.     # 如果角色不存在就结束初始化
  60.     return if @actor.nil?
  61.     # 设置根据HpSp变动的Hp条Sp条的显示区域
  62.     @hpbar_w = @hpbar.bitmap.width
  63.     @spbar_w = @spbar.bitmap.width
  64.     @hp_w = @hpbar_w * @actor.hp / @actor.maxhp
  65.     @sp_w = @spbar_w * @actor.sp / @actor.maxsp
  66.     @hpbar.src_rect.set(0, 0, @hp_w, @hpbar.bitmap.height)
  67.     @spbar.src_rect.set(0, 0, @sp_w, @spbar.bitmap.height)
  68.   end
  69.   #--------------------------------------------------------------------------
  70.   # ● 释放
  71.   #--------------------------------------------------------------------------
  72.   def dispose
  73.     for sprite in @sprites
  74.       sprite.bitmap.dispose
  75.       sprite.dispose
  76.     end
  77.   end
  78.   #--------------------------------------------------------------------------
  79.   # ● 刷新
  80.   #--------------------------------------------------------------------------
  81.   def update
  82.     # 如果记录的角色与队伍里当前位置的角色不一致
  83.     if @actor != $game_party.actors[@index]
  84.       @actor = $game_party.actors[@index]
  85.     end
  86.     for sprite in @sprites
  87.       sprite.visible = ([email protected]? and
  88.                         !$game_temp.message_window_showing and
  89.                         $game_switches[Switch_ID])
  90.     end
  91.     # 如果角色不存在就结束刷新
  92.     return if @actor.nil?
  93.     # 计算需要显示的长度
  94.     hp_w = @hpbar_w * @actor.hp / @actor.maxhp
  95.     sp_w = @spbar_w * @actor.sp / @actor.maxsp
  96.     # 如果计算出来的结果和上次记录的结果不同就重新设置显示区域
  97.     if @hp_w != hp_w
  98.       @hp_w = hp_w
  99.       @hpbar.src_rect.set(0, 0, @hp_w, @hpbar.bitmap.height)
  100.     end
  101.     if @sp_w != sp_w
  102.       @sp_w = sp_w
  103.       @spbar.src_rect.set(0, 0, @sp_w, @spbar.bitmap.height)
  104.     end
  105.   end
  106. end

复制代码
然后找到 Spriteset_Map 的 def initialize
在下面插入

  1.     @hpsp = []
  2.     4.times{|n|@hpsp[n] = HpSp.new(n, 64+n*128, 448)}

复制代码
然后在 def dispose 下面插入

  1.     @hpsp.each{|hpsp|hpsp.dispose}

复制代码
最后在 def update 下面插入

  1.     @hpsp.each{|hpsp|hpsp.update}

复制代码
头像没有做.位置也是粗略的设置.所以以上基本不能直接使用.
仅作参考.
原理是调整sprite 的 src_rect
而不是 用 bitmap 的blt

作者: Gunderub    时间: 2011-2-21 09:56
回复 后知后觉 的帖子

太厉害了 - -!  里边有些我都看不懂的。
而且哪个脚本都是,对于z坐标,完全没概念。
其中  # 如果角色不存在就结束刷新   
    return if @actor.nil?

    # 如果角色不存在就结束刷新
    return if @actor.nil?
这2句一样的可是意思怎么就不同呢- -

最后就是- -。一说到图片我只想到bitmap。。至今我对于bitmap(应该是位图的意思吧)和精灵的概念还是有点模糊。。。

我还是太菜了
作者: 后知后觉    时间: 2011-2-21 11:00
return 是结束其所在方法的运行
在 初始化里运行他 就是结束初始化
在 刷新里运行他就是结束刷新.
脚本从上到下的执行.运行了他.那么该方法在他下面的代码就不会被执行了.
if @actor.nil? 是一个判断嘛
return if @actor.nil? 这样写就不必写 if 判断句的那个最后的 end 了
这个语法在F1里有讲.

位图Bitmap和精灵Sprite 合起来就是显示一张图片.
Bitmap类主要处理的是对图像本身进行操作.比如在某个区域绘制某种颜色.
在某个点绘制某种颜色.描绘文字数字.等.
而精灵Sprite主要处理的就是把这个图片显示在什么地方.也就是x,y坐标.以及这张图片和别的图片的显示层次.也就是z.当2张图片重叠时.谁在上谁在下.选择显示位图的什么区域.也就是src_rect.还有显示是否拉伸旋转什么的.
简单说就是Bitmap是对位图的内容进行操作.而Sprite是处理应该如何去显示这个位图.
单独生成一个Bitmap对象
a = Bitmap.new(32, 32)
把这个位图对象填满红色
a.fill_rect(0,0,32,32,Color.new(255,0,0,255))
这个时候屏幕上是看不到他的.想要看到他就要一个 Sprite
b = Sprite.new
b.bitmap = a
这个时候就能看见屏幕的左上方有一块红色方块了.
Sprite对象的x和y坐标默认是0,0
要把这个红色方块移动到屏幕中间来.就调整sprite的坐标
b.x = 320
b.y = 240
作者: Gunderub    时间: 2011-2-21 11:13
回复 后知后觉 的帖子

额、明白了。z坐标在哪用都是这样的原理吗?
我弄好了值槽显示界面,然后学横板战斗界面的,战斗界面中的z跟这个一样吗?
我改了z,发现他们好像分布的近了跟远了而已…




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