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

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

今天在su中做了一款小游戏 贪吃蛇,说一下步骤

展示

主要思路:

我制作的的玩法是这样的


关于入口文件


# ----------------------------- #
# email:bc8web@126.com #
# uri: http://www.rbc321.cn #
# ------------------------------#
# 入口文件
require 'json'
require_relative 'help.rb' # 帮助文件
module NaiveSnake
$game = nil # 用于保存蛇类实例变量
class Index
@@dig = nil
@@setDig = nil
@@lydig = nil
def initialize
cmd = UI::Command.new("NaiveSnake") {
# 主窗口
@@dig = UI::WebDialog.new "NaiveSnake", false, "", 229, 172, 5, 90, false
@@dig.set_file __dir__+'/index.html'
# 设置窗口
@@setDig = UI::WebDialog.new "NaiveSnake_set", false, "", 262, 315, 235, 90, false
@@setDig.set_file __dir__+'/set.html'
# 排行窗口
@@lydig = UI::WebDialog.new "NaiveSnake_琅琊榜", false, "", 290, 320, 5, 260, false
@@lydig.set_url 'http://00a00.com/snake/' @@dig.show if not @@dig.visible?
@@dig.add_action_callback 'start' do
# 检测是否有模型
if Sketchup.active_model.active_entities.length > 0
is = UI.messagebox("检测到有模型存在,是否清空?\r\n(注:清空才可进入游戏)",MB_YESNO)
if is == 6
Sketchup.active_model.active_entities.clear!
load __dir__+'/Base.rb' require_relative 'Camera.rb'
require_relative 'Map.rb'
load __dir__+'/Food.rb'
load __dir__+'/Snake.rb'
load __dir__+'/SnakeTool.rb' Camera.new # 初始化相机
Map.new.show # 显示场景
Food.new.show # 显示食物
$game = Snake.new # 蛇实例
$game.start # 开始游戏 Sketchup.active_model.select_tool SnakeTool.new # 选择工具
@@dig.close if @@dig.visible? # 关闭窗口
@@setDig.close if @@dig.visible? # 关闭窗口
@@lydig.close if @@dig.visible? # 关闭窗口
else
next
end
end
end
# ready
@@dig.add_action_callback 'ready' do
# 生成随机名字
len = 8
chars = ("a".."z").to_a + ("A".."Z").to_a + ("".."").to_a
newpass = ""
1.upto(len) { |i| newpass << chars[rand(chars.size-1)] }
config 'nickname', newpass
end # 设置按钮
@@dig.add_action_callback 'set' do
@@setDig.show
end # 琅琊榜
@@dig.add_action_callback 'langYa' do
@@lydig.show
end # 确认按钮
@@setDig.add_action_callback('ok'){|dig, json|
hash = JSON.parse json
hash.each{|k, v| config k, v }
dig.close
}
# 默认按钮
@@setDig.add_action_callback('rec'){|dig, json|
json = configRec()
@@setDig.execute_script "fill(#{json})"
}
# 页面刷新
@@setDig.add_action_callback('init'){|dig, json|
json = configAll()
@@setDig.execute_script "data = #{json}"
} }
# 工具栏
cmd.small_icon = cmd.large_icon = __dir__+"/assets/icon.png"
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 < Base
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 < Base
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

Ruby for Sketchup 贪吃蛇演示源码(naive_snake)的更多相关文章

  1. C# unity3d 贪吃蛇 游戏 源码 及其感想

    这个游戏的设计过程是这样的: 1,创建

  2. 利用Bootstrap快速搭建个人响应式主页(附演示+源码)

    1.前言 我们每个程序员都渴望搭建自己的技术博客平台与他人进行交流分享,但使用别人的博客模板没有创意.做网站后台的开发人员可能了解前端,可是自己写一个不错的前端还是很费事的.幸好我们有Bootstra ...

  3. ZedGraph 柱状图、饼图、折线图演示源码

    http://code1.okbase.net/codefile/ZedGraphControl.ContextMenu.cs_201211225626_97.htm // //This librar ...

  4. C#中文件下载的几种方法演示源码

    内容过程,把内容过程比较重要的内容做个珍藏,如下的内容是关于C#中文件下载的几种方法演示的内容,应该是对各朋友有较大好处. using System;using System.Data;using S ...

  5. C#中声明、调用和配置事件的演示源码

    下面的内容是关于C#中声明.调用和配置事件的演示的内容,应该能对大伙有些好处. using System;namespace MyCollections { using System.Collecti ...

  6. C++二分查找算法演示源码

    如下内容段是关于C++二分查找算法演示的内容. #include <cstdio>{ int l = 0, r = n-1; int mid; while (l <= r){ mid ...

  7. C#中的yield return用法演示源码

    下边代码段是关于C#中的yield return用法演示的代码. using System;using System.Collections;using System.Collections.Gene ...

  8. 超多经典 canvas 实例,动态离子背景、移动炫彩小球、贪吃蛇、坦克大战、是男人就下100层、心形文字等等等

    超多经典 canvas 实例 普及:<canvas> 元素用于在网页上绘制图形.这是一个图形容器,您可以控制其每一像素,必须使用脚本来绘制图形. 注意:IE 8 以及更早的版本不支持 &l ...

  9. Luat Inside | 致敬经典,使用Air724UG制作简易贪吃蛇

    作者简介: 打盹的消防车--活跃于Luat社群的新生代全能开发者,东北小伙儿爽朗幽默.好学敏思,更是实力行动派.幼年曾手握火红炽铁而后全然无恙,堪称魔幻经历:如今热衷于各类嵌入式软硬件研究,快意物联江 ...

随机推荐

  1. 四种强制类型转换的总结(const_cast、static_cast、dynamic_cast、reinterpreter_cast)

    四种强制类型转换的总结(const_cast.static_cast.dynamic_cast.reinterpreter_cast) 转载 2011年10月03日 23:59:05 标签: stru ...

  2. Loadrunner12.5-同一个网址通过vugen不能打开,但是直接在ie11中就可以打开

    一:录制选项修改成“WinINet级别数据”,重新录制就可以成功打开网页了. 注:运行时设置--首选项--高级--“使用WinINet回放而非套接字(仅限Windows)”需要勾选上:否则录制脚本结束 ...

  3. Codeforces 599C. Day at the Beach 模拟

    Day at the Beach time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  4. sublime3中运行python 和设置

    点bulid system建立下面文件 {"cmd":["C:/ProgramData/Anaconda3/python.exe", "-u" ...

  5. centos6.5 redis 安装配置及java调用

    1.安装gcc 执行命令  yum install gcc 2. 安装ruby环境 yum install ruby yum install rubygems gem install redis 下载 ...

  6. Devexpress VCL Build v2014 vol 14.2.7发布

    2015年马上快过去一半了,这个玩意还在纠结在14版.其实也无所谓,反正就是改成15版,也还是这些 东西的修补. What's New in 14.2.7 (VCL Product Line)   N ...

  7. KbmMW 服务器架构简介

    kbmmw 由于文档比较少,很多同学开始用时很难理解.一直准备写一个关于kbmmw 架构的东西. 这几天与红鱼儿(blog)研究服务器线程时,整理了一下,大概画了一下kbmmw (版本4.5)服务器的 ...

  8. 非常实用的windows运行打开服务命令

    1.注册表-->regedit.exe 2.本地服务设置-->services.msc 3.远程桌面连接-->mstsc 4.检查windows版本-->winver 5.组策 ...

  9. 2018.09.19 atcoder AtCoDeer and Election Report(贪心)

    传送门 很有意思的一道贪心. 就是每次翻最小的倍数来满足条件. 代码: #include<bits/stdc++.h> #define ll long long using namespa ...

  10. origin里用c语言编程

    学习自白东升老师的origin8.0课程. 其实是originC语言.origin中大多绘图和处理功能都是originC语言完成的,可以同时按下ctrl和shift然后点击相应的功能,就会出现每个按钮 ...