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

Project1

 找回密码
 注册会员
搜索
楼主: 零教授

[胡扯] 因为总被吐槽回合制落伍所以一嘚劲把回合制做成这样

[复制链接]

Lv6.析梦学徒

老鹰

梦石
39
星屑
33308
在线时间
6542 小时
注册时间
2012-5-26
帖子
3176

极短23参与极短22参与极短21评委老司机慢点开短篇十吟唱者组别冠军开拓者剧作品鉴家

发表于 2018-2-24 14:56:25 | 显示全部楼层
害怕,这个弹幕与玩家角色的碰撞处理是怎么做的,不会卡吗……

点评

为了防止卡顿弹幕总量限制在4096个,每个弹幕的滞留时间限制在1024帧  发表于 2018-2-24 17:48
我是指碰撞处理额  发表于 2018-2-24 16:19
雖然xp算是老工具了···不過我覺得這個數量的處理應該還沒那麼不堪吧XD  发表于 2018-2-24 16:19
这不是用rm xp的么  发表于 2018-2-24 16:17
你怕是沒玩過東方···那裡面的更多,我覺得這個算少的了···  发表于 2018-2-24 16:13
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
9273
在线时间
2504 小时
注册时间
2011-5-20
帖子
15389

开拓者

发表于 2018-2-24 16:12:04 | 显示全部楼层
如果主要是彈幕,那你後兩個直接另外做一個模式就好了···

点评

主要是回合制,堆闪避和防御可以无视弹幕  发表于 2018-2-24 17:47
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
5
星屑
3333
在线时间
384 小时
注册时间
2016-6-25
帖子
228
 楼主| 发表于 2018-2-24 17:54:58 | 显示全部楼层
本帖最后由 零教授 于 2018-2-25 07:15 编辑

我随便发一下四叶草弹的代码,因为我感觉我已经优化不下去了
这东西真的是卡......

RUBY 代码复制
  1. Sprite_Siyecao.new($game_troop.enemies[0],12)
  2.       Sprite_Siyecao.new($game_troop.enemies[0],12)
  3.       Sprite_Siyecao.new($game_troop.enemies[0],12)
  4.       Sprite_Siyecao.new($game_troop.enemies[0],12)
  5.       Sprite_Siyecao.new($game_troop.enemies[0],12)

主发射循环(一般循环5次,每次12组,即发射5*12组四叶草弹幕)
RUBY 代码复制
  1. class Sprite_Siyecao < Sprite
  2.   # character :发射者
  3.   # times     :发射子弹数
  4.   def initialize(character,times)
  5.     @viewport = $scene.spriteset.viewport3 #视野为战斗场面viewport3
  6.     super(@viewport)
  7.     @character = character
  8.     @ch = @character
  9.     @times = times
  10.     self.visible = true
  11.     reset
  12.   end
  13.  
  14.   ########################################
  15.  
  16. def reset
  17. #设置炮弹
  18.   return if $bullet.size >= 4096
  19. for i in 0...@times
  20. #检查指针上界
  21.         break if $bullet.size >= 4096 #子弹总数限制4096
  22.   angle = Math::PI / @times * i * 2 #角度为子弹数平分
  23.   sprite = Sprite_Small1.new(@viewport,@ch,angle) #建立小玉
  24.   s1 = Sprite_Heart1.new(@viewport,@ch,0,sprite) #建立心弹
  25.   s2 = Sprite_Heart1.new(@viewport,@ch,1,sprite)
  26.   s3 = Sprite_Heart1.new(@viewport,@ch,2,sprite)
  27.   s4 = Sprite_Heart1.new(@viewport,@ch,3,sprite)
  28.   $bullet.push(s1)
  29.   s1.z = 100+$bullet.size
  30.   $bullet.push(s2)
  31.   s2.z = 100+$bullet.size
  32.   $bullet.push(s3)
  33.   s3.z = 100+$bullet.size
  34.   $bullet.push(s4)
  35.   s4.z = 100+$bullet.size
  36.   $bullet.push(sprite)
  37.   sprite.z = 100+$bullet.size
  38. end
  39. Audio.thndj_se_play("Audio/SE/bullet_2",80,100)
  40. dispose
  41. end
  42.  
  43.   #--------------------------------------------------------------------------
  44.   # ● 释放
  45.   #--------------------------------------------------------------------------
  46.   def dispose
  47.     if self.bitmap != nil
  48.       self.bitmap.dispose
  49.       self.visible = false
  50.     end
  51.     super
  52.   end
  53.  
  54.  
  55.   #--------------------------------------------------------------------------
  56.   # ● 更新画面
  57.   #--------------------------------------------------------------------------
  58.   def update
  59.     super
  60.     dispose
  61.   end
  62.  
  63.  
  64.  
  65. end


小于(四叶草中心)
RUBY 代码复制
  1. class Sprite_Small1 < Sprite
  2.   attr_accessor :available
  3.   attr_accessor :vx #x 速度
  4.   attr_accessor :vy #y 速度
  5.   attr_accessor :ax #x 加速度
  6.   attr_accessor :ay #y 加速度
  7.   attr_accessor :vx0 #x 初速度
  8.   attr_accessor :vy0 #y 初速度
  9.   attr_accessor :an #角度
  10.   attr_accessor :an0 #初速度角度
  11.   attr_accessor :omiga #角速度
  12.   attr_accessor :aomiga #角速度加速度
  13.   attr_accessor :rr #向心运动半径
  14.  
  15.   attr_accessor :lifespan # 存活时间
  16.   attr_accessor :lifetime # 已存活时间
  17.   #attr_accessor :event_list # change behaviors according to time
  18.                                                                                                           # [eventtime,new_vx,new_vy,new_ax,new_ay,sound_effect]
  19.                                                                                                           # e.g. eventlist.push([300,5,5,1,1,""])
  20.   attr_accessor :actor_or_enemy #敌我识别,0为我,1为敌
  21.   attr_accessor :row_flag #旋转标志
  22.   #--------------------------------------------------------------------------
  23.   # ● 初始化对像
  24.   #     viewport : 显示端口
  25.   #     character: 发射者
  26.   #     angle    : 弧度
  27.   #--------------------------------------------------------------------------
  28.  
  29.   def initialize(viewport,character,angle)
  30.     super(viewport)
  31.     @character = character
  32.     if @character.is_a?(Game_Actor)
  33.       @actor_or_enemy = 0
  34.     else
  35.       @actor_or_enemy = 1
  36.     end
  37.     self.blend_type = 0
  38.     @chox = @character.screen_x+10
  39.     @choy = @character.screen_y-100
  40.     @x = @chox #发射点X
  41.     @y = @choy #发射点Y
  42.     #if @x <= 19 and @y <= 14
  43.     #  @x = enemy.x * 32
  44.     #  @y = enemy.y * 32
  45.     #end
  46.     @an = angle #角度
  47.     @an0 = angle #初速度角度
  48.     #p @an * 180 / Math::PI
  49.     @mathx = (Math.cos(@an))*18
  50.     @mathy = (Math.sin(@an))*18
  51.     reset
  52.     self.bitmap = RPG::Cache.picture("bullet/小玉-黄")
  53.     self.available = true
  54.     self.visible = true
  55.     #self.zoom_x = 0.5
  56.     #self.zoom_y = 0.5
  57.     update
  58.   end
  59.   #--------------------------------------------------------------------------
  60.   # ● 设置对像
  61.   #--------------------------------------------------------------------------
  62.   def reset
  63.           return if self.disposed?
  64.     self.ox = 8 #图片半径8
  65.     self.oy = 8
  66.     self.x = @x
  67.     self.y = @y
  68.           #@screen_x = @character.true_x#-100
  69.           #@screen_y = @character.true_y#-100
  70.     @vx0 = @mathx #初速x
  71.     @vy0 = @mathy #初速y
  72.     self.vx = @vx0 #速度x
  73.     self.vy = @vy0 #速度y
  74.     self.omiga = 0 #角速度
  75.     self.aomiga = 0 #角速度加速度
  76.     @an = self.get_angle #角度
  77.     self.rr = 130 #旋转半径
  78.     self.ax = 0 #@rv**2/rr*(Math.cos(@an))
  79.     self.ay = 0 #@rv**2/rr*(Math.sin(@an))
  80.  
  81.     self.lifespan = 1024 #存活时间
  82.     self.lifetime = 0
  83.     #self.event_list = []
  84.     self.available = false
  85.     self.visible = false
  86.     #@x = self.get_screen_pos[0]
  87.     #@y = self.get_screen_pos[1]
  88.   end
  89.  
  90.   def can_be_seen?(recal = true)
  91.     #self.x = recal ? get_screen_pos[0] : @screen_x
  92.     #self.y = recal ? get_screen_pos[1] : @screen_y
  93.           if self.x>-640 and self.x<$width+640 and self.y>-480 and self.y<$height+480
  94.       return true
  95.           else
  96.                   return false
  97.           end
  98.   end
  99.   def get_angle #角度获取:以发射点为圆心,极坐标判定角度
  100.     sign = (self.x-@chox)>0 ? 0 : Math::PI
  101.     return Math.atan((self.y-@choy)/((self.x-@chox) == 0 ? 1 : (self.x-@chox)))+sign
  102.   end
  103.   #--------------------------------------------------------------------------
  104.   # ● 释放
  105.   #--------------------------------------------------------------------------
  106.   def dispose
  107.     if self.bitmap != nil
  108.       self.visible = false
  109.     end
  110.     super
  111.   end
  112.   def move
  113.     return false if self.visible == false
  114.     ########################
  115.     if self.available
  116.             if self.lifetime < self.lifespan
  117.  
  118.         case self.lifetime
  119.         when 1..26 #减速运动,每t速度衰减1.13
  120.           if @vx0.abs > 0
  121.             if @vx.abs <= 1
  122.               @vx0 = 0
  123.               self.vx = 0
  124.             else
  125.               @vx0 /= 1.13
  126.               self.vx /= 1.13
  127.             end
  128.           end
  129.           if @vy0.abs > 0
  130.             if @vy.abs <= 1
  131.               @vy0 = 0
  132.               self.vy = 0
  133.             else
  134.               @vy0 /= 1.13
  135.               self.vy /= 1.13
  136.             end
  137.           end #速度为0时开始旋转
  138.           if @vx0 == 0 and @vy0 == 0 and @row_flag != true
  139.             self.x = @chox + @rr*Math.cos(@an0) #X定点为初方向对应的圆周
  140.             self.y = @choy + @rr*Math.sin(@an0) #Y定点为初方向对应的圆周
  141.             @row_flag = true
  142.           end
  143.         when 27 #旋转的角速度加速度为0.3
  144.           if @row_flag != true
  145.             self.x = @chox + @rr*Math.cos(@an0)
  146.             self.y = @choy + @rr*Math.sin(@an0)
  147.             @row_flag = true
  148.           end
  149.           self.aomiga = 0.3
  150.         when 28..37 #转动半径-1
  151.           @rr -= 1
  152.         when 38..48 #转动半径-3
  153.           @rr -= 3
  154.         when 49..50 #转动半径-2
  155.           @rr -= 2
  156.         when 51..60 #转动半径-1
  157.           @rr -= 1
  158.         when 70..79 #转动半径+1
  159.           @rr += 1
  160.         when 80..89 #转动半径+2
  161.           @rr += 2
  162.         when 90 #加速63t,角速度达到18.9
  163.           self.aomiga = -1+0.01*rand(100) #角速度代入随机负值
  164.           @randr = rand(11) #转动半径增加值代入随机值
  165.         when 91..102 #转动半径+4*0.1*随机值
  166.           @rr += 4 + 0.1*@randr
  167.         when 103..113 #转动半径+随机值
  168.           @rr += @randr
  169.         when 114 #关闭转动,将当前的速度变为X速度和Y速度,置一初速度VX0,
  170.           @row_flag = false #将四叶草甩出去
  171.           v = self.omiga*Math::PI/180*((self.y-@choy)*(self.y-@choy)+(self.x-@chox)*(self.x-@chox))**0.5
  172.           an = self.get_angle
  173.           self.vx = v*Math.cos(an)
  174.           self.vy = v*Math.sin(an)
  175.           @vx0 = self.vx
  176.         when 114..139 #减速运动,速度衰减1.11
  177.           if @vx0.abs > 1
  178.             @vx0 /= 1.11
  179.             self.vx /= 1.11
  180.             self.vy /= 1.11
  181.             if @vx0.abs <= 1
  182.               @vx0 = 0
  183.               self.vx = 0
  184.               self.vy = 0
  185.             end  
  186.           end
  187.         when 140 #速度归零
  188.           self.vx = 0
  189.           self.vy = 0
  190.         when 240 #小玉代入随机加速度,匀加速离开场景
  191.           an = rand(360)*Math::PI/180
  192.           v = rand(5)
  193.           self.ax = (0.1+0.05*v)*Math.cos(an)
  194.           self.ay = (0.1+0.05*v)*Math.sin(an)
  195.         end
  196.  
  197.         if @row_flag #转动模式,x和y直接由角速度和转动半径决定
  198.           @an = self.get_angle
  199.           @an += self.omiga*Math::PI/180
  200.           self.omiga += self.aomiga
  201.           self.x = @chox + @rr*Math.cos(@an)
  202.           self.y = @choy + @rr*Math.sin(@an)
  203.         else #加速模式,x和y由正常的加速减速运动
  204.                 self.x += self.vx
  205.                 self.y += self.vy
  206.                 self.vx += self.ax
  207.                 self.vy += self.ay
  208.         end
  209.  
  210.        # if self.lifetime == 115
  211.        #   @row_flag = false
  212.        # end
  213.  
  214.               #for e in self.event_list
  215.               #        if e[0] == self.lifetime
  216.               #                self.vx = e[1] unless e[1].nil?
  217.               #                self.vy = e[2] unless e[2].nil?
  218.               #                self.ax = e[3] unless e[3].nil?
  219.               #                self.ay = e[4] unless e[4].nil?
  220.               #                Audio.thndj_se_play(e[5])  unless e[5].nil?
  221.               #                break
  222.               #        end
  223.               #end
  224.               if self.can_be_seen?(false)
  225.                       self.visible = true unless self.visible
  226.                       #self.set_screen_pos(false)
  227.                       #angle = self.get_angle
  228.                       #if self.angle != angle
  229.                             #  self.angle = angle
  230.                       #end
  231.                     else
  232.                             self.visible = false if self.visible
  233.           #p "v4"
  234.               end
  235.               self.lifetime += 1
  236.             else
  237.               self.visible = false if self.visible
  238.               self.available = false if self.available
  239.         #p "v2"
  240.             end
  241.            # if self.can_be_seen?(false)
  242.             #        super()
  243.             #end
  244.            else
  245.             if self.visible       
  246.         #p "v1"
  247.               self.visible = false   
  248.              # super()
  249.             end
  250.     end
  251.    ##############################
  252.     #return false if @x > 640 or @y > 480 or @x < 0 or @y < 0
  253.     #@x = self.get_screen_pos[0]
  254.     #@y = self.get_screen_pos[1]
  255.     check
  256.   end
  257.  
  258.   #--------------------------------------------------------------------------
  259.   # ● 更新画面
  260.   #--------------------------------------------------------------------------
  261.   def update
  262.     super
  263.     #p self.visible
  264.     return if self.visible == false
  265.     if move == false
  266.       return "delete"
  267.     end
  268.   end
  269.  
  270.   def check
  271.     return unless $scene.is_a?(Scene_Battle)
  272.     dx = self.x#+self.bitmap.width*0.5*0.75
  273.     dy = self.y#+self.bitmap.height*0.5*0.75
  274.     ra = 64 #子弹判定半径7,判定点半径1,合计8
  275.     if self.actor_or_enemy == 1 #敌军
  276.       for i in 0...$game_party.actors.size
  277.         actor = $game_party.actors[i]
  278.         sprite = $scene.spriteset.actor_sprites[$game_party.actors.size-1-i]
  279.         tx = actor.screen_x-sprite.cw*0.05 #根据位图大小取判定点位置X
  280.         ty = actor.screen_y-sprite.ch*0.445 #根据位图大小取判定点位置Y
  281.         if (dx-tx)*(dx-tx) + (dy-ty)*(dy-ty) <= ra #圆函数判定
  282.           value = 1 + rand(5)
  283.           value /= 2 if actor.guarding?
  284.           actor.hp -= value
  285.           actor.damage["event"] = value
  286.           actor.damage_pop["event"] = true
  287.           actor.animation.push([807+rand(3),true]) #击中动画
  288.           $scene.status_window.refresh
  289.           self.visible = false
  290.         end
  291.         if $game_party.all_dead?
  292.             # 切换到游戏结束画面
  293.             $scene = Scene_Gameover.new
  294.             return
  295.         end
  296.         #p "v5"
  297.       end#for
  298.     else #我军弹幕
  299.       for i in 0...$game_troop.enemies.size
  300.         actor = $game_troop.enemies[i]
  301.         sprite = $scene.spriteset.enemy_sprites[$game_troop.enemies.size-1-i]
  302.         tx = actor.screen_x+sprite.cw*0.1 #根据位图大小取判定点位置X
  303.         ty = actor.screen_y-sprite.ch*0.445 #根据位图大小取判定点位置Y
  304.         if (dx-tx)*(dx-tx) + (dy-ty)*(dy-ty) <= ra #圆函数判定
  305.           value = 1 + rand(5)
  306.           value /= 2 if actor.guarding?
  307.           actor.hp -= value
  308.           actor.damage["event"] = value
  309.           actor.damage_pop["event"] = true
  310.           actor.animation.push([807+rand(3),true]) #击中动画
  311.           $scene.status_window.refresh
  312.           self.visible = false
  313.         end
  314.       end #for
  315.     end #if
  316.   end #def
  317.  
  318.  
  319. end


心弹(四叶草花瓣)
RUBY 代码复制
  1. class Sprite_Heart1 < Sprite
  2.   attr_accessor :available
  3.   attr_accessor :vx #x 速度
  4.   attr_accessor :vy #y 速度
  5.   attr_accessor :ax #x 加速度
  6.   attr_accessor :ay #y 加速度
  7.   attr_accessor :an0 #最初的角度
  8.   attr_accessor :lifespan # 存活时间
  9.   attr_accessor :lifetime # 已存活时间
  10.   #attr_accessor :event_list # change behaviors according to time
  11.                                                                                                           # [eventtime,new_vx,new_vy,new_ax,new_ay,sound_effect]
  12.                                                                                                           # e.g. eventlist.push([300,5,5,1,1,""])
  13.   attr_accessor :actor_or_enemy #敌我识别,0为我,1为敌
  14.   attr_accessor :relese_flag #释放标志
  15.  
  16.   #--------------------------------------------------------------------------
  17.   # ● 初始化对像
  18.   #     viewport : 显示端口
  19.   #     angle    : 弧度 0=0 1=90 2=180 3=270
  20.   #--------------------------------------------------------------------------
  21.  
  22.   def initialize(viewport,character,angle,target)
  23.     super(viewport)
  24.     @character = character
  25.     if @character.is_a?(Game_Actor)
  26.       @actor_or_enemy = 0
  27.     else
  28.       @actor_or_enemy = 1
  29.     end
  30.     self.blend_type = 0
  31.     self.lifetime = 0
  32.     @target = target
  33.     @chox = @target.x
  34.     @choy = @target.y
  35.     @an = angle*Math::PI/2
  36.     @an0 = angle*90
  37.  
  38.     @x = @chox+16*Math.cos(@an)
  39.     @y = @choy+16*Math.sin(@an)
  40.     #if @x <= 19 and @y <= 14
  41.     #  @x = enemy.x * 32
  42.     #  @y = enemy.y * 32
  43.     #end
  44.     #p @an * 180 / Math::PI
  45.     reset
  46.     self.bitmap = RPG::Cache.picture("bullet/心弹-绿")
  47.     self.available = true
  48.     self.visible = true
  49.     @release_flag = false
  50.     #self.zoom_x = 0.5
  51.     #self.zoom_y = 0.5
  52.     update
  53.   end
  54.   #--------------------------------------------------------------------------
  55.   # ● 设置对像
  56.   #--------------------------------------------------------------------------
  57.   def reset
  58.           return if self.disposed?
  59.     self.ox = 16 #子弹半径16
  60.     self.oy = 16
  61.     self.x = @x
  62.     self.y = @y
  63.           #@screen_x = @character.true_x#-100
  64.           #@screen_y = @character.true_y#-100
  65.     self.vx = 0 #速度X
  66.     self.vy = 0 #速度Y
  67.     @an = self.get_angle #角度
  68.     self.ax = 0#@rv**2/rr*(Math.cos(@an))
  69.     self.ay = 0#@rv**2/rr*(Math.sin(@an))
  70.  
  71.     self.lifespan = 1024
  72.     self.lifetime = 0
  73.     #self.event_list = []
  74.     self.available = false
  75.     self.visible = false
  76.     #@x = self.get_screen_pos[0]
  77.     #@y = self.get_screen_pos[1]
  78.   end
  79.  
  80.   def can_be_seen?(recal = true)
  81.     #self.x = recal ? get_screen_pos[0] : @screen_x
  82.     #self.y = recal ? get_screen_pos[1] : @screen_y
  83.           if self.x>-640 and self.x<$width+640 and self.y>-480 and self.y<$height+480
  84.       return true
  85.           else
  86.                   return false
  87.           end
  88.   end
  89.   def get_angle #角度获取:以小玉为圆心,初位置+转动相位作为角度
  90.     @chox = @target.x #小玉X
  91.     @choy = @target.y #小玉Y
  92.     #sign = (self.x-@chox)>0 ? 0 : Math::PI
  93.     an = (self.lifetime%360*8+@an0)*Math::PI/180 #每t转动8度
  94.     #心弹自身的角度为相位负值+90度+初相位方向修正
  95.     self.angle = -self.lifetime%360*8+90+(@an0%180 == 0 ? @an0 : @an0+180)
  96.     return an
  97.   end
  98.   #--------------------------------------------------------------------------
  99.   # ● 释放
  100.   #--------------------------------------------------------------------------
  101.   def dispose
  102.     if self.bitmap != nil
  103.       self.visible = false
  104.     end
  105.     super
  106.   end
  107.   def move
  108.     return false if self.visible == false
  109.     ########################
  110.     if self.available
  111.             if self.lifetime < self.lifespan
  112.         if self.lifetime == 140 #第140t时释放
  113.           #p self.angle
  114.           get_angle #获取角度,置对应角度加速度
  115.           ang = (self.angle+(@an0%180 == 0 ? 180 : 0))*Math::PI/180
  116.           self.vx = 0
  117.           self.vy = 0
  118.           self.ax = Math.cos(ang)*0.2
  119.           self.ay = Math.sin(ang)*0.2
  120.           @release_flag = true
  121.         end
  122.  
  123.         if @release_flag == true #释放后
  124.                 self.x += self.vx
  125.                 self.y += self.vy
  126.                 self.vx += self.ax
  127.                 self.vy += self.ay
  128.           if (self.vx*self.vx+self.vy*self.vy)**0.5 >= 20 #速度大于20变为匀速
  129.             self.ay = 0
  130.             self.ax = 0
  131.           end  
  132.         else #释放前
  133.           @an = self.get_angle #获取角度
  134.           self.x = @chox+16*Math.cos(@an) #X定位为小玉圆周
  135.           self.y = @choy+16*Math.sin(@an) #Y定位为小玉圆周
  136.         end
  137.  
  138.               #for e in self.event_list
  139.               #        if e[0] == self.lifetime
  140.               #                self.vx = e[1] unless e[1].nil?
  141.               #                self.vy = e[2] unless e[2].nil?
  142.               #                self.ax = e[3] unless e[3].nil?
  143.               #                self.ay = e[4] unless e[4].nil?
  144.               #                Audio.thndj_se_play(e[5])  unless e[5].nil?
  145.               #                break
  146.               #        end
  147.               #end
  148.               if self.can_be_seen?(false)
  149.                       self.visible = true unless self.visible
  150.                       #self.set_screen_pos(false)
  151.                       #angle = self.get_angle
  152.                       #if self.angle != angle
  153.                             #  self.angle = angle
  154.                       #end
  155.                     else
  156.                             self.visible = false if self.visible
  157.           #p "v4"
  158.               end
  159.               self.lifetime += 1
  160.             else
  161.               self.visible = false if self.visible
  162.               self.available = false if self.available
  163.         #p "v2"
  164.             end
  165.            # if self.can_be_seen?(false)
  166.             #        super()
  167.             #end
  168.            else
  169.             if self.visible       
  170.         #p "v1"
  171.               self.visible = false   
  172.              # super()
  173.             end
  174.     end
  175.    ##############################
  176.     #return false if @x > 640 or @y > 480 or @x < 0 or @y < 0
  177.     #@x = self.get_screen_pos[0]
  178.     #@y = self.get_screen_pos[1]
  179.     check
  180.   end
  181.  
  182.   #--------------------------------------------------------------------------
  183.   # ● 更新画面
  184.   #--------------------------------------------------------------------------
  185.   def update
  186.     super
  187.     #p self.visible
  188.     return if self.visible == false
  189.     if move == false
  190.       return "delete"
  191.     end
  192.   end
  193.  
  194.   def check
  195.     return unless $scene.is_a?(Scene_Battle)
  196.     dx = self.x#+self.bitmap.width*0.5*0.75
  197.     dy = self.y#+self.bitmap.height*0.5*0.75
  198.     ra = 256 #图形判定区15,判定点1,合计16
  199.     if self.actor_or_enemy == 1 #敌军
  200.       for i in 0...$game_party.actors.size
  201.         actor = $game_party.actors[i]
  202.         sprite = $scene.spriteset.actor_sprites[$game_party.actors.size-1-i]
  203.         tx = actor.screen_x-sprite.cw*0.05 #根据位图尺寸决定判定点
  204.         ty = actor.screen_y-sprite.ch*0.445
  205.         if (dx-tx)*(dx-tx) + (dy-ty)*(dy-ty) <= ra
  206.           value = 1 + rand(5)
  207.           value /= 2 if actor.guarding?
  208.           actor.hp -= value
  209.           actor.damage["event"] = value
  210.           actor.damage_pop["event"] = true
  211.           actor.animation.push([807+rand(3),true]) #命中动画
  212.           $scene.status_window.refresh
  213.           self.visible = false
  214.         end
  215.         if $game_party.all_dead?
  216.             # 切换到游戏结束画面
  217.             $scene = Scene_Gameover.new
  218.             return
  219.         end
  220.         #p "v5"
  221.       end#for
  222.     else #我军弹幕
  223.       for i in 0...$game_troop.enemies.size
  224.         actor = $game_troop.enemies[i]
  225.         sprite = $scene.spriteset.enemy_sprites[$game_troop.enemies.size-1-i]
  226.         tx = actor.screen_x+sprite.cw*0.1 #根据位图尺寸决定判定点
  227.         ty = actor.screen_y-sprite.ch*0.445
  228.         if (dx-tx)*(dx-tx) + (dy-ty)*(dy-ty) <= ra
  229.           value = 1 + rand(5)
  230.           value /= 2 if actor.guarding?
  231.           actor.hp -= value
  232.           actor.damage["event"] = value
  233.           actor.damage_pop["event"] = true
  234.           actor.animation.push([807+rand(3),true]) #命中动画
  235.           $scene.status_window.refresh
  236.           self.visible = false
  237.         end
  238.       end #for
  239.     end #if
  240.   end #def
  241.  
  242.  
  243. end


222222222.gif 222222222222.gif 77777.gif
最后这个效果上可以说能令人满意
但这才12*5*5=300个子弹啊
我就能觉得卡了
魔女的下午茶~~制作组募集~~有偿招募长期立绘画师~群号168579736~~多人在线RPG~~无意识Navigation,火热内测中,招内测人员~
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (版主)

梦石
1
星屑
23963
在线时间
3338 小时
注册时间
2011-7-8
帖子
3925

开拓者

发表于 2018-2-24 21:26:49 | 显示全部楼层
上面的运算是可以优化的,
1. 在 for 循环里,ra 的值看上去是个常数,直接将 ra*ra 算出来保存,避免一次乘法运算
2. 在判断距离之前直接比较一下,dx - tx 是否在 -ra ~ +ra 之间, dy - ty 同样
3. 把 x**2 替换成 x*x
此外,不知道 select 方法会不会比 for循环 更快

点评

晚上看看,不过最好的办法还是用c写到dll里  发表于 2018-2-25 17:43
完整的代码发在上面了,一共300个子弹,如果CPU占用稍微大一点就会有明显的卡顿  发表于 2018-2-25 04:17
优化的问题非常严重,1000个位图就会造成明显的卡顿感了,确实很窘迫,我去试试看;不是for而是select的话我不是很清楚该怎么写判断  发表于 2018-2-25 03:20
熟悉rgss和ruby,xp区版主~
正在填坑:《膜拜组传奇》讲述膜拜组和学霸们的故事。
已上steam:与TXBD合作的Reformers《变革者》
* 战斗调用公共事件 *
* RGSOS 网络脚本 *
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
2724
在线时间
227 小时
注册时间
2016-3-27
帖子
576
发表于 2018-2-24 22:54:25 | 显示全部楼层
666
ARPG还是有好作品的吧比如XAS?
然后那啥,我的想法是把战斗和炫舞那类结合起来
比如手搓技能2333
这个也不错哇,可以增加互动
现在还能改名吗qwq
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
5
星屑
3333
在线时间
384 小时
注册时间
2016-6-25
帖子
228
 楼主| 发表于 2018-2-25 03:22:01 | 显示全部楼层
本帖最后由 零教授 于 2018-2-25 07:17 编辑

222222222.gif 222222222222.gif 77777.gif
@89444640  
做出来了XD

评分

参与人数 1+1 收起 理由
89444640 + 1 塞糖

查看全部评分

魔女的下午茶~~制作组募集~~有偿招募长期立绘画师~群号168579736~~多人在线RPG~~无意识Navigation,火热内测中,招内测人员~
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3060
在线时间
556 小时
注册时间
2013-6-8
帖子
10
发表于 2018-2-25 06:52:21 | 显示全部楼层
本帖最后由 phantomz 于 2018-2-25 07:00 编辑

在回合制中插弹幕战让我想到梦幻伪乡
个人不太喜欢回合制游戏中出现需要反应力的机制
像GBA上的马里奥RPG就是接受极限了

点评

梦想伪乡也是含有动作机制的  发表于 2018-2-25 07:14
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
34825
在线时间
4145 小时
注册时间
2007-12-15
帖子
9970
发表于 2018-2-25 08:14:30 | 显示全部楼层
零教授 发表于 2018-2-25 03:22
@89444640  
做出来了XD

- -b还原度100%
这第三下完全看不出往哪边躲……我stg苦手
那个右边的gif是原作的吧?没玩过。
这个系统……牵扯运算、程序、数学太多……就算可以兼容我也用不了……完全不会调……
只能看看了。
话说……从美工角度考虑,最靠谱的是做个工具,能输出透明背景的弹幕,然后录640*320输出透明背景图像,然后播片。还是按照rpg回合制模式打。
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
429
在线时间
30 小时
注册时间
2017-8-9
帖子
58
发表于 2018-2-25 18:04:07 | 显示全部楼层
所有的游戏都是回合制
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
163
在线时间
249 小时
注册时间
2014-7-18
帖子
44
发表于 2018-2-25 20:38:27 | 显示全部楼层
本帖最后由 M.Winderic. 于 2018-2-25 22:11 编辑
零教授 发表于 2018-2-24 17:54
我随便发一下四叶草弹的代码,因为我感觉我已经优化不下去了
这东西真的是卡......


Em......
1st 提前算好弹幕路径,缓存打表……
2nd 考虑 R-Tree,优化碰撞检测……
3rd 找一只程序猿搞定 1 & 2 ……
然后就不卡啦【雾

点评

全国高考数学部分第二十一题:请求出如图示的弹幕的路径方程......  发表于 2018-2-26 00:23
Role Play Games had saved me, but I can never save them.
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-3-28 16:43

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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