Project1

标题: 水平斜切的效果 [打印本页]

作者: 凝望·流年    时间: 2014-7-30 14:26
标题: 水平斜切的效果
各位,流年酱想问大家一个问题
怎样做到类似PS中的水平斜切的效果
就像下图一样,谢谢大家了


作者: satgo1546    时间: 2014-7-30 16:53
将图像中的每行向右移动(行数-当前行数)/比例系数像素差不多就能得到这个效果了。
作者: MeowSnow    时间: 2014-7-30 17:56
(っ´ω`c)不是直接开PS点斜切就好了吗……那张例图明显也是软件自动处理的。
作者: 克莉丝    时间: 2014-7-30 18:02
本帖最后由 克莉丝 于 2014-7-30 18:12 编辑

使用方法
精灵对象.bev(斜切角度,斜切起始边) #起始边可以省略,省略时默认为下边
精灵对象.apply_bitmap                      #把当前的位图作为源位图,如果不打算二次斜切可以不使用

原图


斜切30°


二次斜切30°


进行第二次斜切时如果之前未调用   精灵对象.apply_bitmap
那么会重新进行斜切而不是在上一次斜切的基础上进行斜切


@ban     @bitmap     拖出去tjjlb
RUBY 代码复制
  1. class Sprite
  2.   alias bitmap_crysse bitmap=
  3.   def bitmap=(b)
  4.     (@ban= false;@resbitmap = b) if not @ban
  5.     bitmap_crysse(b)
  6.   end
  7.   def apply_bitmap
  8.     @resbitmap = self.bitmap
  9.   end
  10.   def bev(a,d = 2) # 1:上 2:下 3:左 4:右
  11.     a = [[-90,a].max,90].min
  12.     (return;self.bitmap.clear) if a.abs == 90
  13.     k = Math.tan(a/57.3)
  14.     c = @resbitmap.height
  15.     w = @resbitmap.width
  16.     if d<3
  17.       nw = c * k + w
  18.       @ban = true
  19.       self.bitmap = Bitmap.new(nw,c)
  20.       if  d == 1
  21.         c.times{|y|
  22.           self.bitmap.blt(y*k,y,@resbitmap,Rect.new(0,y,w,1))
  23.         }
  24.       else
  25.         c.times{|y|
  26.           self.bitmap.blt(y*k,c-y,@resbitmap,Rect.new(0,c-y,w,1))
  27.         }
  28.       end
  29.     elsif d>2
  30.       nh = w * k + c
  31.       @ban = true
  32.       self.bitmap = Bitmap.new(w,nh)
  33.       if  d == 3
  34.         w.times{|x|
  35.           self.bitmap.blt(x,x*k,@resbitmap,Rect.new(x,0,1,c))
  36.         }
  37.       else
  38.         w.times{|x|
  39.           self.bitmap.blt(w-x,x*k,@resbitmap,Rect.new(w-x,0,1,c))
  40.         }
  41.       end
  42.     end
  43.   end
  44. end
  45.  
  46. # 测试代码
  47. s = Sprite.new                                     # 精灵
  48. s.bitmap = Bitmap.new(32,32)                       # 创建位图
  49. s.bitmap.fill_rect(0,0,32,32,Color.new(255,0,0))   # 填充矩形
  50. a = 30                                             # 设置斜切角度
  51. s.bev(a,4)                                         # 以设定的角度,右边为起始进行斜切
  52. s.apply_bitmap                                     # 替换内部存储的位图以供二次切帖
  53. s.bev(a,2)                                         # 以设定的角度,下边为起始进行斜切
  54. loop{Graphics.update}                              # 返回结果
   




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