#取得某一点与周围点的对比度,确定是否在此位置堆积雪花
def getContrast(i)
#colorCmp = 0 #存储用作对比的点的颜色值
#tempR = 0 #存储CorlorCmp的红色部分,下同
#tempG = 0
#tempB = 0
#slope=0 #存储雪花飘落方向:Vx/Vy
#计算雪花飘落方向
if @pvy != 0
slope = @pvx / @pvy
else
slope = 2
end
#根据雪花飘落方向决定取哪一点作对比点,
#若PVx/PVy在-1到1之间,即Slope=0,就取正下面的象素点
#若PVx/PVy>1,取右下方的点,PVx/PVy<-1则取左下方
if slope == 0
colorCmp = GetPixel(@hDC1, @px[i], @py[i] + 1)
elsif slope > 1
colorCmp = GetPixel(@hDC1, @px[i] + 1, @py[i] + 1)
else
colorCmp = GetPixel(@hDC1, @px[i] - 1, @py[i] + 1)
end
#确定当前位置没有与另一个雪花重叠,否则返回0,用于防止由于不同雪花重叠造成雪花乱堆
if colorCmp == SnowCol
return 0
end
#分别获取ColorCmp与对比点的蓝、绿、红部分的差值
tempB = ((colorCmp & 0xFF0000).abs - (@pColor[i] & 0xFF0000)) / 0x10000
tempG = ((colorCmp & 0xFF00).abs - (@pColor[i] & 0xFF00)) / 0x100
tempR = ((colorCmp & 0xFF).abs - (@pColor[i] & 0xFF))
##返回对比度值
(tempR + tempG + tempB) / 3
end
def cc
ReleaseDC 0, @hDC1 #释放桌面窗口设备句柄
InvalidateRect 0, 0, 0 #清除所有雪花,恢复桌面
end
def run
trap(:INT){exit} #按 c-c 退出
timerStart #启动定时器
#等到所有进程退出后,主进程再退出
while(Thread.list.count != 1) do sleep 1 end
cc #结束运行
end
end
Snow.new.run