设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 3149|回复: 6
打印 上一主题 下一主题

[讨论] 【算法时间】如何让一个精灵围绕着屏幕中心公转?

 关闭 [复制链接]

Lv1.梦旅人

神之瞳

梦石
0
星屑
60
在线时间
5 小时
注册时间
2009-7-5
帖子
314
跳转到指定楼层
1
发表于 2010-7-7 22:56:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1星屑
咱表示咱是为了活跃被SSD同学们僵化的大脑……
天天看着$game_XXXX $data_XXXX Scene_XXXX觉得大脑都不会思考了,所以决定来这里找一下灵感

当然,作为出题者,也是提供了相当丰厚的奖励的……同时我也会派遣马甲来这里回答问题(= =|||)

如果除了我的马甲没有人把答案上交的话那么就很可怜……这1VIP就物归原主了……

下面提供框架,具体实现脚本请自己YY
  1. class Scene_Demo

  2.   def main

  3.     @tip = Sprite.new(Viewport.new(0,0,640,480))

  4.     @tip.bitmap = Bitmap.new(12*32,32)

  5.     @tip.bitmap.draw_text(0,0,12*32,32,"这只是精灵移动的演示",1)

  6.     @sprite = Sprite.new(Viewport.new(0,0,640,480))

  7.     @sprite.bitmap = Bitmap.new("Graphics/Battlers/001-Fighter01") #咱表示这个图片可以随意……

  8.     #此处添加脚本

  9.     # 执行过渡

  10.     Graphics.transition

  11.     # 主循环

  12.     loop do

  13.       # 刷新游戏画面

  14.       Graphics.update

  15.       # 刷新输入信息

  16.       Input.update

  17.       # 刷新画面

  18.       update

  19.       # 如果切换画面就中断循环

  20.       if $scene != self

  21.         break

  22.       end

  23.     end

  24.     # 准备过渡

  25.     Graphics.freeze

  26.     @tip.dispose

  27.     @sprite.dispose

  28.   end

  29.   def update

  30.     if Input.trigger?(Input::B)

  31.       # 演奏取消 SE

  32.       $game_system.se_play($data_system.cancel_se)

  33.       # 切换的地图画面

  34.       $scene = Scene_Map.new

  35.       return

  36.     end

  37. #此处添加脚本

  38.   end

  39. end
复制代码

最佳答案

查看完整内容

放个最弱智的算法。

点评

- -b请理解公转的意思  发表于 2010-7-8 15:54
....... 公转就把@sprite.ox = @sprite.bitmap.width / 2 @sprite.oy = @sprite.bitmap.height / 2 删了。。。 这是我从自己标题动画里直接黏贴过来的!,没细心。。。   发表于 2010-7-8 15:24

九月三日

  有时我真不理解,怎么有另一个人能够爱她,可以爱她,殊不知我爱她爱得如此真切,如此忘情,如此情意缱倦,除了她我什么也不了解,什么也不知道,什么也没有呀!
——摘自《少年维特之烦恼》

谨以 纪念一段消逝了的感情
ILY ZXY

NOIp什么的最讨厌了!

啊……讨厌,为什么我的网盘全部坏掉了……
zoomshare恢复了,虚惊一场
可恶的skydrive,我XX你的OO,竟把我的帐号封了!

Lv1.梦旅人

梦石
0
星屑
50
在线时间
270 小时
注册时间
2010-2-4
帖子
1305
2
发表于 2010-7-7 22:56:18 | 只看该作者
放个最弱智的算法。
  1. class Scene_Demo
  2.   def initialize
  3.     @半径 = 200
  4.     @度数 = 0
  5.   end

  6.   def main

  7.     @tip = Sprite.new(Viewport.new(0,0,640,480))

  8.     @tip.bitmap = Bitmap.new(12*32,32)

  9.     @tip.bitmap.draw_text(0,0,12*32,32,"这只是精灵移动的演示",1)

  10.     @sprite = Sprite.new(Viewport.new(0,0,640,480))

  11.     @sprite.bitmap = Bitmap.new("Graphics/Battlers/001-Fighter01") #咱表示这个图片可以随意……

  12.     #此处添加脚本


  13.     # 执行过渡

  14.     Graphics.transition

  15.     # 主循环

  16.     loop do

  17.       # 刷新游戏画面

  18.       Graphics.update

  19.       # 刷新输入信息

  20.       Input.update

  21.       # 刷新画面

  22.       update

  23.       # 如果切换画面就中断循环

  24.       if $scene != self

  25.         break

  26.       end

  27.     end

  28.     # 准备过渡

  29.     Graphics.freeze

  30.     @tip.dispose

  31.     @sprite.dispose

  32.   end

  33.   def update

  34.     if Input.trigger?(Input::B)

  35.       # 演奏取消 SE

  36.       $game_system.se_play($data_system.cancel_se)

  37.       # 切换的地图画面

  38.       $scene = Scene_Map.new

  39.       return

  40.     end

  41. #此处添加脚本
  42.      @度数 += 0.1
  43.      @sprite.x = Math.sin(@度数) * @半径 + 320
  44.      @sprite.y = Math.cos(@度数) * @半径 + 240
  45.   end

  46. end
复制代码

点评

本着鼓励新淫的态度选了一个我不大熟悉的人……  发表于 2010-7-9 15:54
- -b好吧,其实这个@度数 += 0.1就是转速,改成@度数 += 0.01啥的就很慢了。  发表于 2010-7-8 15:51
咱表示这个很完美……除了转得太快我看不清……  发表于 2010-7-8 12:38
好歹当年也当过大魔王过,orz
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
1281 小时
注册时间
2006-8-27
帖子
590
3
发表于 2010-7-7 23:58:09 | 只看该作者
  1. class Scene_Demo
  2.   def main
  3.     @tip = Sprite.new(Viewport.new(0,0,640,480))
  4.     @tip.bitmap = Bitmap.new(12*32,32)
  5.     @tip.bitmap.draw_text(0,0,12*32,32,"这只是精灵移动的演示",1)
  6.     @sprite = Sprite.new(Viewport.new(0,0,640,480))
  7.     @sprite.bitmap = Bitmap.new("Graphics/Battlers/001-Fighter01") #咱表示这个图片可以随意……

  8.     #此处添加脚本                           #│
  9.     @x = 320 #目标点                        #│
  10.     @y = 240 #目标点                        #│
  11.     @sprite.ox = @sprite.bitmap.width/2     #│
  12.     @sprite.oy = @sprite.bitmap.height/2    #├NEW
  13.     @s = 0                                  #│
  14.     @speed = 5    # 旋转速度                #│
  15.     @a = 100      # 旋转直径                #│
  16.     @pi = 3.141592653                       #│

  17.     # 执行过渡
  18.     Graphics.transition
  19.     # 主循环
  20.     loop do
  21.       # 刷新游戏画面
  22.       Graphics.update
  23.       # 刷新输入信息
  24.       Input.update
  25.       # 刷新画面
  26.       update
  27.       # 如果切换画面就中断循环
  28.       if $scene != self
  29.         break
  30.       end
  31.     end
  32.     # 准备过渡
  33.     Graphics.freeze
  34.     @tip.dispose
  35.     @sprite.dispose
  36.   end
  37.   def update
  38.     if Input.trigger?(Input::B)
  39.       # 演奏取消 SE
  40.       $game_system.se_play($data_system.cancel_se)
  41.       # 切换的地图画面
  42.       $scene = Scene_Map.new
  43.       return
  44.     end
  45. #此处添加脚本
  46.     @s += @speed                                #│
  47.     @sprite.angle = @s                          #│
  48.     @sprite.x = Math.sin(@s*@pi/180) * @a + @x  #├NEW
  49.     @sprite.y = Math.cos(@s*@pi/180) * @a + @y  #│

  50.   end
  51. end
复制代码

点评

自转+公转直接设置原点不就行了么……就像II的……  发表于 2010-7-9 15:55
才发现这个算法和我的是一样的...  发表于 2010-7-8 15:55
汗,他是公转+自转啊~  发表于 2010-7-8 12:57
公转!是公转!  发表于 2010-7-8 12:41
PI 可以直接用 Math::PI  发表于 2010-7-8 02:12
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
4
发表于 2010-7-8 02:10:32 | 只看该作者
(x-w)^2+(x-h)^2=r^2 的方法:
  1. class Scene_Demo
  2.   RADIUS = 50
  3.   DIR = 1 # {0, 1}
  4.   SPEED = 1
  5.   RADIUS2 = RADIUS * RADIUS
  6.   OX = 320
  7.   OY = 240
  8.   OFFSET = RADIUS / Math.sqrt(2)
  9.   X1 = OX - OFFSET
  10.   X2 = OX + OFFSET
  11.   Y1 = OY - OFFSET
  12.   def main
  13.     @tip = Sprite.new(Viewport.new(0,0,640,480))
  14.     @tip.bitmap = Bitmap.new(640, 480)
  15.     @tip.bitmap.draw_text(0,0,12*32,32,"这只是精灵移动的演示",1)
  16.     @sprite = Sprite.new(Viewport.new(0,0,640,480))
  17.     @sprite.bitmap = Bitmap.new("Graphics/Battlers/001-Fighter01") #咱表示这个图片可以随意……
  18.     @sprite.ox = @sprite.bitmap.width >> 1
  19.     @sprite.oy = @sprite.bitmap.height >> 1
  20.     #此处添加脚本
  21.     @sprite.x = OX - RADIUS
  22.     @sprite.y = OY
  23.     # 执行过渡
  24.     Graphics.transition
  25.     # 主循环
  26.     loop do
  27.       # 刷新游戏画面
  28.       Graphics.update
  29.       # 刷新输入信息
  30.       Input.update
  31.       # 刷新画面
  32.       update
  33.       # 如果切换画面就中断循环
  34.       if $scene != self
  35.         break
  36.       end
  37.     end
  38.     # 准备过渡
  39.     Graphics.freeze
  40.     @tip.dispose
  41.     @sprite.dispose
  42.   end

  43.   def update
  44.     if Input.trigger?(Input::B)
  45.       # 演奏取消 SE
  46.       $game_system.se_play($data_system.cancel_se)
  47.       # 切换的地图画面
  48.       $scene = Scene_Map.new
  49.       return
  50.     end
  51.     #此处添加脚本
  52.     x = @sprite.x
  53.     y = @sprite.y
  54.     dir = [:+, :-]
  55.     if x >= X1 && x <= X2
  56.       x = @sprite.send(:x=, x.send(dir[y <= Y1 ? ~DIR : DIR], SPEED)) - OX
  57.       y = Math.sqrt(RADIUS2 - x * x)
  58.       @sprite.y = (@sprite.y <= OY ? OY - y : y + OY).round
  59.     else
  60.       y = @sprite.send(:y=, y.send(dir[x <= X1 ? DIR : ~DIR], SPEED)) - OY
  61.       x = Math.sqrt(RADIUS2 - y * y)
  62.       @sprite.x = (@sprite.x <= OX ? OX - x : x + OX).round
  63.     end
  64.     @tip.bitmap.set_pixel(@sprite.x, @sprite.y, Color.new(255, 0, 0))
  65.   end

  66. end
复制代码

点评

6脉果然强大……代码写的咱都看不懂……  发表于 2010-7-8 12:40
回复

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
13 小时
注册时间
2007-6-13
帖子
458
5
发表于 2010-7-8 02:40:27 | 只看该作者
本帖最后由 败笔 于 2010-7-8 15:26 编辑
  1. class Scene_Demo

  2.   def main

  3.     @tip = Sprite.new(Viewport.new(0,0,640,480))

  4.     @tip.bitmap = Bitmap.new(12*32,32)

  5.     @tip.bitmap.draw_text(0,0,12*32,32,"这只是精灵移动的演示",1)

  6.     @sprite = Sprite.new(Viewport.new(0,0,640,480))

  7.     @sprite.bitmap = Bitmap.new("Graphics/Battlers/001-Fighter01") #咱表示这个图片可以随意……

  8.     #此处添加脚本
  9.     @sprite.x = 320
  10.       @sprite.y = 240

  11.     # 执行过渡

  12.     Graphics.transition

  13.     # 主循环

  14.     loop do

  15.       # 刷新游戏画面

  16.       Graphics.update

  17.       # 刷新输入信息

  18.       Input.update

  19.       # 刷新画面

  20.       update

  21.       # 如果切换画面就中断循环

  22.       if $scene != self

  23.         break

  24.       end

  25.     end

  26.     # 准备过渡

  27.     Graphics.freeze

  28.     @tip.dispose

  29.     @sprite.dispose

  30.   end

  31.   def update

  32.     if Input.trigger?(Input::B)

  33.       # 演奏取消 SE

  34.       $game_system.se_play($data_system.cancel_se)

  35.       # 切换的地图画面

  36.       $scene = Scene_Map.new

  37.       return

  38.     end

  39. #此处添加脚本
  40.     @sprite.angle += 5

  41.   end

  42. end
复制代码

点评

下了个FireFox终于能够点评了……IE直接崩溃…… 1、你的@sprite_0从哪里来? 2、咱表示咱的要求是公转,公转啊!  发表于 2010-7-8 11:21
回复

使用道具 举报

Lv1.梦旅人

鬼才

梦石
0
星屑
54
在线时间
40 小时
注册时间
2010-2-1
帖子
273
6
发表于 2010-7-8 08:48:32 | 只看该作者
哇  人才很多啊
44RPG开发论坛 ←点击进如  RPGXPQQ群89799338
回复

使用道具 举报

Lv3.寻梦者

孤独守望

梦石
0
星屑
3121
在线时间
1534 小时
注册时间
2006-10-16
帖子
4321

开拓者贵宾

7
发表于 2010-7-8 11:37:59 | 只看该作者
偷天换柱,小声路过
  1. class Scene_Demo
  2.   def main
  3.     @tip = Sprite.new(Viewport.new(0,0,640,480))
  4.     @tip.bitmap = Bitmap.new(12*32,32)
  5.     @tip.bitmap.draw_text(0,0,12*32,32,"这只是精灵移动的演示",1)
  6.     @sprite = Sprite.new(Viewport.new(0,0,640,480))
  7.     @sprite.bitmap = Bitmap.new("Graphics/Battlers/001-Fighter01") #咱表示这个图片可以随意……
  8.     b = Bitmap.new(640,480)
  9.     b.blt(20,20,@sprite.bitmap,@sprite.bitmap.rect)
  10.     @sprite.bitmap.dispose
  11.     @sprite.bitmap = b
  12.     @sprite.ox = @sprite.x = 320
  13.     @sprite.oy = @sprite.y = 240
  14.     #此处添加脚本
  15.     # 执行过渡
  16.     Graphics.transition
  17.     # 主循环
  18.     loop do
  19.       # 刷新游戏画面
  20.       Graphics.update
  21.       # 刷新输入信息
  22.       Input.update
  23.       # 刷新画面
  24.       update

  25.       # 如果切换画面就中断循环
  26.       if $scene != self
  27.         break
  28.       end
  29.     end
  30.     # 准备过渡
  31.     Graphics.freeze
  32.     @tip.dispose
  33.     @sprite.dispose
  34.   end
  35.   RAD = 1 / Math::PI
  36.   def update
  37.     @sprite.angle += RAD
  38.     if Input.trigger?(Input::B)
  39.       # 演奏取消 SE
  40.       $game_system.se_play($data_system.cancel_se)
  41.       # 切换的地图画面
  42.       $scene = Scene_Map.new
  43.       return
  44.     end
  45. #此处添加脚本
  46.   end
  47. end
复制代码

点评

用最简单的方法实现复杂的事情,是我做事的准则嘛……而且已现在计算机的速度计算个三角函数什么的还是很快的……  发表于 2010-7-9 15:53
咱没要求效率啊……  发表于 2010-7-9 15:52
那个是简单三角函数……效率更低……不信问紫苏  发表于 2010-7-9 08:49
另:运用三角函数的张半仙(貌似这样叫)也做出来了嘛……  发表于 2010-7-8 22:58
咱也看出来了是勾股定理……但是里面牵扯到了位运算一些提高效率的东西……  发表于 2010-7-8 22:58
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-28 22:46

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表