热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

RubyforSketchup贪吃蛇演示源码(naive_snake)

sketchup是非常简单易用的三维建模软件,可以利用ruby做二次开发,api文档http:www.rbc321.cnapi今天在su中做了一款小游戏贪吃蛇,说一下步骤展示主要思路:

sketchup是非常简单易用的三维建模软件,可以利用ruby 做二次开发,

api文档 http://www.rbc321.cn/api


cmd.menu_text
= "NaiveSnake"

toolbar
= UI::Toolbar.new "NaiveSnake"
toolbar
= toolbar.add_item cmd
toolbar.show

# 菜单
menu = UI.menu('Plugins').add_submenu('NaiveSnake(贪吃蛇)')
menu.add_item
end
end
end
NaiveSnake::Index.new

初始化基类

# ----------------------------- #
#
email:bc8web@126.com #
#
uri: http://www.rbc321.cn #
#
------------------------------#
#
基类
module NaiveSnake
class Base
@@model
= Sketchup.active_model # 模型
@@view = @@model.active_view #
@@ent = @@model.active_entities # 实体
@@mat = @@model.materials # 材质

@@mapWidth
= config('mapWidth').to_i # 地图宽
@@mapHeight = config('mapHeight').to_i # 地图高
@@snakeHeight = config('snakeHeight').to_i # 蛇高度
@@snakeWidth = config('snakeWidth').to_i # 蛇宽度
@@snakeNums = config('snakeNums').to_i # 蛇身数
@@level = config('级别') # 级别
@@direction = UP # 初始方向
@@currentSnake = [] # 当前蛇body
@@snakeArr = [] # 出生蛇body
@@foot = [] # 储存食物
@@blackList = [] # 食物黑名单
@@time_id = nil # 定时器
@@score = 0 # 分数
end
end

 

初始化相机

# ----------------------------- #
# email:bc8web@126.com #
# uri: http://www.rbc321.cn #
# ------------------------------#
# 相机类
module NaiveSnake
class Camera def initialize
start
end
def start
eye = [0, 0,1300]; target = [0,0,0]; up = [0,1,0]
start_camera = Sketchup::Camera.new eye, target, up
@@view.camera = start_camera
end
end
end

 初始化场景

# ----------------------------- #
#
email:bc8web@126.com #
#
uri: http://www.rbc321.cn #
#
------------------------------#
#
场景类
module NaiveSnake
class Map < Base
def show
grassland
# 草地
end
def grassland
filename
= __dir__+'/assets/grassland.skm'
material
= @@mat.load(filename)

pt1
= Geom::Point3d.new -@@mapWidth/2, -@@mapHeight/2, 0
pt2
= Geom::Point3d.new @@mapWidth/2, -@@mapHeight/2, 0
pt3
= Geom::Point3d.new @@mapWidth/2, @@mapHeight/2, 0
pt4
= Geom::Point3d.new -@@mapWidth/2, @@mapHeight/2, 0
grp
= @@ent.add_group
grp.entities.add_face pt1, pt2, pt3, pt4
grp.material
= material
end
end
end

 

初始化蛇类

# ----------------------------- #
# email:bc8web@126.com #
# uri: http://www.rbc321.cn #
# ------------------------------#
# 蛇类
module NaiveSnake
class Snake def initialize
@@snakeArr = initSnake @@snakeNums
@up = 38; @down = 40; @left = 37; @right = 39
@direction = @@direction
@x = rand(-@@mapWidth..@@mapWidth)/2/10*10
@y = rand(-@@mapHeight..@@mapHeight)/2/10*10
end
def start
createSnake # 绘制蛇
speed = 0.5
case @@level
when '普通'; speed = 0.4
when '勇士'; speed = 0.1
when '地狱'; speed = 0.03
when '噩梦'; speed = 0.006
end
time = 1
@@time_id = UI.start_timer(speed, true) do
move(@direction)
time += 1
end
end
def set(direction)
@direction = direction
end
# 绘制蛇
def createSnake
@@currentSnake.clear # 清空蛇当前状态
@@snakeArr.each do |box|
xBaseValue = @@snakeWidth/2
yBaseValue = @@snakeWidth/2
point1 = Geom::Point3d.new(box[0]-xBaseValue, box[1]-yBaseValue, 0)
point2 = Geom::Point3d.new(box[0]+xBaseValue, box[1]-yBaseValue, 0)
point3 = Geom::Point3d.new(box[0]+xBaseValue, box[1]+yBaseValue, 0)
point4 = Geom::Point3d.new(box[0]-xBaseValue, box[1]+yBaseValue, 0)
boxGroup = @@ent.add_group
face = boxGroup.entities.add_face point1, point2, point3, point4
face.reverse!.pushpull @@snakeHeight
@@currentSnake.push boxGroup # 重新设置蛇身体
end
end
# 移动
def move(direction)
tmpArray = [] # 临时容器
head = @@snakeArr.last # 蛇头
# 判断蛇头是否碰到黑名单
@@blackList.each{|list|
if head == list # Game Over
gameOver
return
end
}
#判断蛇头是否碰到边缘
if head[0].abs >= @@mapWidth/2 || head[1].abs >= @@mapHeight/2
gameOver
return
end
# 判断蛇头是否碰到食物
if head == @@foot
# 加分
@@score += 10
# 将食物列入黑名单
@@blackList.push @@foot
# 蛇头随机移动
@x = rand(-(@@mapWidth-50)..@@mapWidth-50)/2/10*10
@y = rand(-@@mapHeight..@@mapHeight)/2/10*10
@@snakeArr.push [@x+@@snakeWidth/2, @y+@@snakeHeight/2]
# 再次显示食物
Food.new.show
end
# 移动数组前一位
lastValue = @@snakeArr.last.clone;
for i in 0...@@snakeArr.size-1
tmpArray[i] = @@snakeArr[i+1]
end
tmpArray.push(lastValue)
case direction
when @up; tmpArray.last[1] += @@snakeWidth
when @down; tmpArray.last[1] -= @@snakeWidth
when @right; tmpArray.last[0] += @@snakeWidth
when @left; tmpArray.last[0] -= @@snakeWidth
end
@@snakeArr = tmpArray # 重新设置蛇body

deleteSnake # 删除
createSnake # 再次绘制
end

def deleteSnake
@@currentSnake.each do |ent|
ent.entities.each{|ent| @@ent.erase_entities ent}
end # 删除原来
end
def gameOver
UI.stop_timer @@time_id
UI.messagebox "游戏结束!\r\n得分:"+@@score.to_s
updateScore # 更新分数
end
def updateScore
hash = {
:nickname => config('nickname'),
:score => @@score,
:level => config('级别'),
:tk => 'qwertyuioplkjhgfdsazxcvbnm',
}
request = Sketchup::Http::Request.new("http://00a00.com/snake/save.php", Sketchup::Http::POST)
request.body= httpBuild(hash)
request.start do |request, response|
p '琅琊榜更新成功' if response
end
end
def httpBuild(hash)
str = ''
hash.each{|k, v|
str+= k.to_s+'='+v.to_s+'&'
}
str.chop!
end
def initSnake(n)
array = []
n.times{|i|
array.push [@@snakeWidth/2+@@snakeWidth*i, @@snakeWidth/2]
next if i == 0
}
array
end
end
end

 

初始化食物类

# ----------------------------- #
#
email:bc8web@126.com #
#
uri: http://www.rbc321.cn #
#
------------------------------#
#
食物类
module NaiveSnake
class Food < Base
def initialize
@x
= rand(-@@mapWidth..@@mapWidth)/2/10*10
@y
= rand(-@@mapHeight..@@mapHeight)/2/10*10
end
def show
filename
= __dir__+'/assets/food.skm'
material
= @@mat.load(filename)

point
= []
unless isFull?
point[0]
= [@x, @y, 0]
point[
1] = [@x+@@snakeWidth, @y, 0]
point[
2] = [@x+@@snakeWidth, @y+@@snakeWidth, 0]
point[
3] = [@x, @y+@@snakeWidth, 0]

group
= @@ent.add_group

@@foot
= [@x+@@snakeWidth/2, @y+@@snakeHeight/2]
face
= group.entities.add_face point
face.material
= material
face.reverse!.pushpull @@snakeHeight
@foot
= face
else
@x
= rand(-@@mapWidth..@@mapWidth)
@y
= rand(-@@mapHeight..@@mapHeight)
end
end
def isFull?
return @@snakeArr.include? [@x, @y]
end
end
end

 下载地址:

 http://www.rbc321.cn/home/plugin/plugindetail/id/247


推荐阅读
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • flowable工作流 流程变量_信也科技工作流平台的技术实践
    1背景随着公司业务发展及内部业务流程诉求的增长,目前信息化系统不能够很好满足期望,主要体现如下:目前OA流程引擎无法满足企业特定业务流程需求,且移动端体 ... [详细]
  • POCOCLibraies属于功能广泛、轻量级别的开源框架库,它拥有媲美Boost库的功能以及较小的体积广泛应用在物联网平台、工业自动化等领域。POCOCLibrai ... [详细]
  • Allegro总结:1.防焊层(SolderMask):又称绿油层,PCB非布线层,用于制成丝网印板,将不需要焊接的地方涂上防焊剂.在防焊层上预留的焊盘大小要比实际的焊盘大一些,其差值一般 ... [详细]
  • Rubyonrails开发人员在这里。此问题曾被问过。 ... [详细]
  • 使用CocoaPods管理依赖库
    这篇内容将介绍Mac和iOS开发中必备的一个依赖库管理工具CocoaPods。在iOS开发中势必会用到一些第三方依赖库,比如大家都熟悉的ASIHttpRequest、AFNetwo ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文介绍了使用CentOS7.0 U盘刻录工具进行安装的详细步骤,包括使用USBWriter工具刻录ISO文件到USB驱动器、格式化USB磁盘、设置启动顺序等。通过本文的指导,用户可以轻松地使用U盘安装CentOS7.0操作系统。 ... [详细]
  • 本文总结了Java中日期格式化的常用方法,并给出了示例代码。通过使用SimpleDateFormat类和jstl fmt标签库,可以实现日期的格式化和显示。在页面中添加相应的标签库引用后,可以使用不同的日期格式化样式来显示当前年份和月份。该文提供了详细的代码示例和说明。 ... [详细]
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
author-avatar
4号的国哥
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有