linux桌面下雪,一个让桌面下雪的ruby 小程序 snow

[Ruby]代码

#!/usr/bin/env ruby

# -*- coding: gb18030 -*-

# 2011-3

#ruby 1.8.7 (2011-02-18 patchlevel 334) [i386-mingw32]

#gem 1.6

#gem install win32-api windows-pr windows-api cstruct

#比如要使用 GetDC这个API时,搜索包含文字GetDC的文件在这个目录: D:\Ruby18\lib\ruby\gems\1.8\gems\, 比如我搜索出来是 windows-pr-1.1.3\lib\windows\gdi\device_context.rb , 打开看一下结构.

#则写 require 'windows/gdi/device_context'

#include Windows::GDI::DeviceContext

#同理: GetPixel 在文件 bitmap.rb, 可以打开它过目一下,看一下类结构.

#则写 require 'windows/gdi/bitmap'

#include Windows::GDI::Bitmap

#在Ruby中方便的调用Win32 API (使用windows-pr和CStruct) :

#http://www.w-yong.com/docs/ruby_win32_api.html

#不过代码在结束时,没有重画整个桌面,BUG..

require 'rubygems'

require 'windows/gdi/device_context'

require 'windows/gdi/bitmap'

require 'win32struct'

include Windows::GDI::DeviceContext

include Windows::GDI::Bitmap

module Windows

module GDI

module DeviceContext

API.new('InvalidateRect','LLL','L','user32')

end

end

end

class Snow

SnowNum = 500 #同一时间飘动的雪花数量

ScrnWidth = 1280 #屏幕宽度(单位:像素)

ScrnHight = 1024 #屏幕高度(单位:像素)

SnowColDown = 0xFFFFFF #积雪颜色

SnowColDuck = 0xFFDDDD #深色积雪颜色

SnowCol = 0xFEFfFE #雪花颜色

def initialize

`title 桌面飘雪` #设置窗口标题

print "\r按 ctrl + c 结束"

@hDC1 = GetDC(0)

#初始化整个屏幕

@vx=0

@vy=0

@px=[]

@py=[]

@pColor=[]

SnowNum.times{|j|

@px[j] = rand * ScrnWidth

@py[j] = rand * ScrnHight / 1.5

@pColor[j] = GetPixel(@hDC1, @px[j], @py[j])

}

end

def timerStart

#设置计时器,Timer1用于画单帧,Timer2用于风向变化

Thread.new{

loop do

sleep 0.015

#画出一帧

draw rescue(p $!.message + $@[0])

end

}

Thread.new{

loop do

#改变风向

@vx = rand * 4 - 2

@vy = rand + 2

sleep 1.4

end

}

end

#初始化雪花位置

def initP(i)

@px[i] = rand * ScrnWidth

@py[i] = rand * 3

@pColor[i] = GetPixel(@hDC1, @px[i], @py[i]) #取得屏幕原来的颜色值

end

#画出一帧,即重画所有雪花位置一次

def draw

SnowNum.times{|i|

if @pColor[i] != SnowCol

#还原上一个位置的颜色

SetPixel @hDC1, @px[i],@py[i], @pColor[i]

end

#设置新的位置,i Mod 3用于将雪花分为三类采用不同速度,以便形成层次感

@pvx = rand * 2 - 1 + @vx * (i%3)

@pvy = @vy * (i%3+1)

@px[i] =@px[i] + @pvx

@py[i] =@py[i] + @pvy

#取得新位置原始颜色值,用于下一步雪花飘过时恢复此处颜色

@pColor[i] = GetPixel(@hDC1,@px[i],@py[i])

#如果获取颜色失败,表明雪花已飘出屏幕,重新初始化

if @pColor[i] == 0xFFFFFFFF

initP i

else

#否则若雪花没有重叠

if @pColor[i] != SnowCol

#若对比度较小(即不能堆积),就画出雪花

#Rnd()>0.3用于防止某些连续而明显的边界截获所有雪花

if rand > 0.3 or getContrast(i) < 50

SetPixel @hDC1,@px[i],@py[i], SnowCol

#否则表明找到明显的边界,画出堆积的雪,并初始化以便画新的雪花

else

SetPixel @hDC1,@px[i],@py[i] - 1, SnowColDuck

SetPixel @hDC1,@px[i] - 1,@py[i], SnowColDuck

SetPixel @hDC1,@px[i] + 1,@py[i], SnowColDown

initP i

end

end

end

}

end

#取得某一点与周围点的对比度,确定是否在此位置堆积雪花

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

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

230c353a458864bc9e0c7a0610682b05.png0b1331709591d260c1c78e86d0c51c18.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1619043.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

桌面下雪小程序 WIN32

想起以前还没有上大学的时候&#xff0c;过圣诞节&#xff0c;有同学发了一个桌面下雪的小程序。当看到效果的&#xff0c;哇&#xff0c;当时觉得好高端&#xff0c;就想什么时候我也能写出这么一个程序。学了计算机之后&#xff0c;发现这完全可以实现。于是就准备写一个&…

linux命令画圣诞树图片,Linux如何用Xsnow命令让桌面显示下雪特效

Linux系统下其实有很多有趣的命令&#xff0c;利用这些命令可以达到一些特别的效果。比如说Xsnow&#xff0c;可以让桌面下雪。具体应该怎么实现呢&#xff1f;一起来看一下吧。 方法如下&#xff1a; 一、安装 xsnow Debian/Ubuntu/Mint 用户用下面的命令&#xff1a; $ sudo …

桌面下雪程序的编写

一&#xff0e; 综述 考虑到雪花将会很多&#xff0c;并且每个雪花都有自己的行为路径&#xff0c;统一处理比较麻烦&#xff0c;因此自定义一个类CSnowflake&#xff0c;它所呈现的主要接口有两个&#xff1a;下落和“死亡”判断。下落路径由雪花对象自身处理&#xff0c;主框…

桌面下雪软件测试工程师,Xsnow - 在Ubuntu 18.04及更高版本的桌面上下雪

原标题&#xff1a;Xsnow - 在Ubuntu 18.04及更高版本的桌面上下雪 Xsnow&#xff0c;让它在你的桌面上下雪吧&#xff0c;现在正在Ubuntu 18.04或更高版本的Gnome, KDE, FVWM桌面上工作。 Xsnow是一个方便的命令工具&#xff0c;可以将圣诞节带到您的桌面。但是&#xff0c;它…

linux桌面下雪,分享|Linux/Unix 桌面趣事:让桌面下雪

在这个节日里感到孤独么&#xff1f;试一下 Xsnow 吧。它是一个可以在 Unix/Linux 桌面下下雪的应用。圣诞老人和他的驯鹿会在屏幕中奔跑&#xff0c;伴随着雪片让你感受到节日的感觉。 我第一次安装它还是在 13、4 年前。它最初是在 1984 年 Macintosh 系统中创造的。你可以用…

桌面下雪软件测试工程师,Win7系统如何设置桌面下雪屏保?

一个好看的屏保会带给用户一个好的心情&#xff0c;有很多用户包括小编都很喜欢让桌面下雪的屏保&#xff0c;但是有很多用户并不知道要如何设置桌面下雪屏保&#xff0c;下面&#xff0c;小编就来教教大家在Win7系统下设置桌面下雪屏保的方法。 方法/步骤 1、下载解压缩“桌面…

圣诞节到了!!你的桌面下雪了吗?? - Qt趣味开发之让你的桌面下雪

圣诞节到了&#xff0c;写个桌面下雪的程序庆祝一下。过节也是要有仪式感的&#xff01;&#xff01; 显示效果如下&#xff1a; 具有如下功能&#xff1a; 托盘菜单&#xff0c;可以配置、关于作者、退出。可以配置是否下雪、烟花效果&#xff0c;配置雪的浓度和下降的速度…

vue2 路由进阶,VueCli 自定义创建项目

一、声明式导航-导航链接 1.需求 实现导航高亮效果 如果使用a标签进行跳转的话&#xff0c;需要给当前跳转的导航加样式&#xff0c;同时要移除上一个a标签的样式&#xff0c;太麻烦&#xff01;&#xff01;&#xff01; 2.解决方案 vue-router 提供了一个全局组件 router…

【springboot】Spring Cache缓存:

文章目录 一、导入Maven依赖&#xff1a;二、实现思路&#xff1a;三、代码开发&#xff1a; 一、导入Maven依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId><…

sql:SQL优化知识点记录(四)

&#xff08;1&#xff09;explain之ref介绍 type下的ref是非唯一性索引扫描具体的一个值 ref属性 例如&#xff1a;ti表先加载&#xff0c;const是常量 t1.other_column是个t1表常量 test.t1.ID&#xff1a;test库t1表的ID字段 t1表引用了shared库的t2表的col1字段&#x…

【算法训练-链表】反转链表、区间反转链表、K个一组反转链表

从今天开始进行高频算法的训练&#xff0c;一方面训练自己的逻辑思维&#xff0c;一方面保持自己的竞争力。训练过程有这么两个基准原则&#xff1a; 首先训练题的来源呢有三个&#xff0c;首选的是三个都出现过的高频题&#xff0c;以&#xff1a;牛客101为基准分类&#xff…

梯度下降算法简单理解:一阶泰勒展开式,梯度下降数学原理

目录 梯度下降算法简单理解 一阶泰勒展开式 梯度下降数学原理 梯度下降算法简单理解 梯度下降算法的公式非常简单&#xff0c;”沿着梯度的反方向&#xff08;坡度最陡&#xff09;“是我们日常经验得到的&#xff0c;其本质的原因到底是什么呢&#xff1f;为什么局部下降最…

Oracle的学习心得和知识总结(二十九)|Oracle数据库数据库回放功能之论文三翻译及学习

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

免费的客户管理软件有哪些推荐?

目前市面上的客户管理系统不少&#xff0c;也各有特色&#xff0c;但永久免费而又灵活好用的却不多。以下是几个推荐&#xff0c;需要的可逐一试用再作选择&#xff1a; 一、蓝点客户关系管理系统 蓝点的客户管理系统胜在强大的自定义能力&#xff0c;你可以在它基础上方便地…

Mybatis-Plus快速入门

目录 一、基础工程 1、创建一个数据库&#xff1a;mp 2、添加数据 3、创建初始工程 4、添加依赖 二、Mybatis Mybatis-Plus 1、创建子工程&#xff1a;mybatis-plus-simple 2、在子工程下添加配置 2.1Mybatis实现查询User 2.1.1、编写User实体对象 2.1.2、编写UserMa…

外贸CRM软件排行榜:优化客户关系管理,跟进客户并提升销售业绩

在外贸行业中&#xff0c;建立良好的客户关系和有效地跟进客户是取得成功的关键。为了更好地管理客户关系并提升销售业绩&#xff0c;外贸企业越来越多地依赖于CRM&#xff08;客户关系管理&#xff09;软件。然而&#xff0c;市场上存在各种不同的外贸CRM软件选择&#xff0c;…

开发信外贸客户开发工具

电话开发外贸客户是外贸业务中不可或缺的一部分。然而&#xff0c;如何进行电话开发外贸客户&#xff0c;却是许多公司一直在思考的问题。本文将介绍一些电话开发外贸客户的技巧和方法&#xff0c;希望能够为您的业务开拓提供帮助。 首先&#xff0c;你需要了解你的目标客户。了…

推荐好用的CRM客户管理软件?

有没有好用的CRM客户管理软件推荐&#xff1f;综合来看&#xff0c;比较推荐您使用Zoho CRM。在功能方面&#xff0c;Zoho CRM的完整性能和领头羊SF有的一拼&#xff0c;但相同版本的价格还不到三分之一&#xff1b;在本土化方面&#xff0c;Zoho CRM在国内设立了多个办公室&am…

外贸客户管理系统(外贸CRM)有哪些功能?

对外贸企业来说,客户是血液,客户管理直接影响到企业的销售业绩和盈利能力。因此选择一个功能强大的客户管理系统,对外贸企业来说是非常重要的。下面我来全面介绍一下外贸客户管理系统的主要功能: 一、客户信息管理客户信息管理是客户管理系统的基础功能。该模块可以建立客户数据…

运维Shell脚本小试牛刀(一)

一: Shell中循环剖析....... #!/bin/bash - # # # # FILE: countloop.sh # USAGE: ./countloop.sh # DESCRIPTION: # OPTIONS: ------- # REQUIREMENTS: --------- # # BUGS: ------ # N…