查看: 2540|回复: 12

[已经过期] 一个悲伤的问题QWQ,关于地图上抛物线箭支的一系列问题

[复制链接]
梦石
0
星屑
1816
在线时间
2527 小时
注册时间
2010-10-12
回帖
1336

开拓者

发表于 2015-2-10 11:16:50 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
[pre lang="ruby"]#==============================================================================
# ■ EFS_Arrow
#------------------------------------------------------------------------------
#  定义弓箭失的类
#==============================================================================
=begin
  *   8   *
   *     *
    *   *
4   *#*    6
    *   *
   *     *
  *   2   *
=end
class EFS_Arrow < Sprite
  attr_accessor:hit
  #--------------------------------------------------------------------------
  # ● 初始化数据
  #--------------------------------------------------------------------------
  def initialize(viewport)
    super(viewport)
    @hit = false
    @direction = 2
    @wait_count = 0
    @angle = 0
    @velocity = 15
    @hight = 50
    @flat_flying = false
  end
  #--------------------------------------------------------------------------
  # ● 发射箭失
  #--------------------------------------------------------------------------
  def display(event,target_event,name,d_name)
    #赋值
    @final_x = target_event.x*32- 34
    @final_y = target_event.y*32- 68
    @event=event
    @target_e = target_event
    @d_name = d_name
    @direction = event.direction
    return if self.bitmap!=nil
    #创建新的位图
    self.bitmap=RPG::Cache.character(name,0)
    #设置角度
    case @direction
    when 2
      base_angle = 180
    when 4
      base_angle = 90
    when 6
      base_angle = 270
    when 8
      base_angle = 0
    end
    #起始位置
    self.ox = self.bitmap.width / 2
    self.oy = self.bitmap.height / 2
    self.x = event.screen_x
    self.y = event.screen_y-32
    self.z = 11
    x1=self.x
    y1=self.y
    #目标坐标
    x3=target_event.screen_x
    y3=target_event.screen_y-32
    #调整
    adjust_with_distance
    #最高点
    x2=(x1+x3)/2
    y2=(y1+y3)/2-@hight
      case @direction
       ####################################
      when 2  #↓
        x2 = self.x
        y2 = self.y
        y1= y3
        if event.x<target_event.x
          x1= x3-2*(x2-x3).abs
        elsif  event.x>target_event.x
          x1= x3+2*(x2-x3).abs
        else  
          #待修改
          shoot_flat(event.screen_x,target_event.screen_x,event.screen_y,target_event.screen_y)
          return
        end  
          return if @flat_flying
         
    #计算abc值
    @a,@b,@c = HzhjMath.parabola(x1, y1, x2, y2, x3, y3)
    @x  = x2
    #速度、Δ角度计算
    v = @velocity
    @angle = Math.atan2(y2,x2)*180/Math::PI
    @angle_max = -@angle
    t = (x3-x1)/v
    @delta_angle = @angle/t
        if event.x<target_event.x
          self.angle = base_angle+@angle
        elsif  event.x>target_event.x
          self.angle = base_angle-@angle
        else  
          #待修改
          shoot_flat(event.screen_x,target_event.screen_x,event.screen_y,target_event.screen_y)
          return
        end   
    #目标点备份
    @to_x=x3
    @to_y=y3
    ####################################
      when 4 #←
    #计算abc值
    @a,@b,@c = HzhjMath.parabola(x1, y1, x2, y2, x3, y3)
    @x  = x1
    #速度、Δ角度计算
    v = @velocity
    @angle = Math.atan2(y2,x2)*180/Math::PI
    @angle_max = -@angle
    t = (x3-x1)/v
    @delta_angle = 2*@angle/t
       self.angle = base_angle-@angle
           #目标点备份
    @to_x=x3
    @to_y=y3
    ####################################
      when 6  #→
    #计算abc值
    @a,@b,@c = HzhjMath.parabola(x1, y1, x2, y2, x3, y3)
    @x  = x1
    #速度、Δ角度计算
    v = @velocity
    @angle = Math.atan2(y2,x2)*180/Math::PI
    @angle_max = -@angle
    t = (x3-x1)/v
    @delta_angle = 2*@angle/t
        self.angle = base_angle+@angle
            #目标点备份
    @to_x=x3
    @to_y=y3
    ####################################        
      when 8   #↑
        x1=self.x
        y1=self.y
        x2 = target_event.screen_x
        y2 = target_event.screen_y-32
        y3 = y1
        if event.x<target_event.x
          x3= x3+2*(x2-x1).abs
        elsif  event.x>target_event.x
          x3= x3-2*(x2-x1).abs
        else  
          #待修改
          shoot_flat(event.screen_x,target_event.screen_x,event.screen_y,target_event.screen_y)
        end  
          return if @flat_flying
         
    #计算abc值
    @a,@b,@c = HzhjMath.parabola(x1, y1, x2, y2, x3, y3)
    @x  = x1
    #速度、Δ角度计算
    v = @velocity
    @angle = Math.atan2(y1,x1)*180/Math::PI
    @angle_max = -@angle
    t = (x3-x1)/v
    @delta_angle = @angle/t
        if event.x<target_event.x
          self.angle = base_angle-@angle
        elsif  event.x>target_event.x
          self.angle = base_angle+@angle
        else  
          #待修改
shoot_flat(event.screen_x,target_event.screen_x,event.screen_y,target_event.screen_y)
          return
        end   
    #目标点备份
    @to_x=x2
    @to_y=y2
      end
####################################  
   
   
   
   
   
   
  end  

  def shoot_flat(x1,x3,y1,y3)
    case @direction
    when 2
      self.angle = 180
    when 4
      self.angle = 90
    when 6
      self.angle = 270
    when 8
      self.angle = 0
    end
    #目标点备份
    @to_x=x3
    @to_y=y3
    @x = x1
    @y = y1
    @flat_flying = true
    return
  end
  
  
  def test
      loop do
      update
      Graphics.update
      break if droped?
      end
  end
  #--------------------------------------------------------------------------
  # ● 根据距离自动调整速度、高度
  #--------------------------------------------------------------------------
  def adjust_with_distance
     d = ((@event.x - @target_e.x).abs + (@event.y - @target_e.y).abs).round
     @height = d*32/1.5
     @velocity = d*1.5
  end  
  
  #--------------------------------------------------------------------------
  # ● 刷新画面
  #--------------------------------------------------------------------------
  def update
    super
    if arrived? and not droped?
      drop
    else  
      if droped?
      self.ox = $game_map.display_x / 4
      self.oy = $game_map.display_y / 4
      self.x = @final_x
      self.y = @final_y
      remove
    else
      
      
      self.x=@x
      if @flat_flying
        self.y = @y
      else
        self.y = HzhjMath.parabola_y(@x,@a,@b,@c)
        self.angle -= @delta_angle
      end
      case @direction
      when 2
        if @flat_flying
         @y +=  @velocity
        else
        @x =  @event.x < @target_e.x ? @x+@velocity/2 : @x-@velocity/2
        end  
      when 4
        @x-=@velocity
      when 6
        @x+=@velocity
      when 8
        if @flat_flying
         @y -=  @velocity
        else
        @x =  @event.x < @target_e.x ? @x+@velocity/2 : @x-@velocity/2
        end  

      end
      
      
      end
    end
   
   
  end
  
  #--------------------------------------------------------------------------
  # ● 到达目的地没
  #--------------------------------------------------------------------------
  def arrived?
    case @direction
    when 2
      return self.y>=@to_y
    when 4
      return self.x<=@to_x
    when 6
      return self.x>=@to_x
    when 8
      return self.y<=@to_y
    end
   
   
  end  
  
  #--------------------------------------------------------------------------
  # ● 落地
  #--------------------------------------------------------------------------  
  def drop
    self.angle = 0
    self.bitmap = RPG::Cache.character(@d_name,0)
    self.src_rect.set(rand(4)*100,(@direction/2-1)*100,100,100)
    self.x =@target_e.x*32 - 34
    self.y =@target_e.y*32 - 68
    self.ox = $game_map.display_x / 4
    self.oy = $game_map.display_y / 4
    self.z = 11
    @wait_count = 450
  end  
  #--------------------------------------------------------------------------
  # ● 落地?
  #--------------------------------------------------------------------------  
  def droped?
     return self.bitmap == RPG::Cache.character(@d_name,0)
  end
  #--------------------------------------------------------------------------
  # ● 消失
  #--------------------------------------------------------------------------     
  def remove
    if @wait_count == 0
      self.bitmap = nil
    else
      @wait_count -= 1
    end
  end  
  def delete
    self.bitmap = nil
  end
end [/pre]




鄙人瞎j8乱写的一个从地图上某事件能发射一只抛物线移动的弓箭到目标事件的一个测试的玩意儿。。

于是问题来了, 游戏中,如果人物移动,画面跟着移动的话,弹道就偏了。
我不能使用
    self.ox = $game_map.display_x / 4
    self.oy = $game_map.display_y / 4
这种方法,因为我要把弓箭给旋转一定角度

所以问题来了=A=

这个应该怎么解决









梦石
0
星屑
34462
在线时间
5096 小时
注册时间
2012-11-19
回帖
4715

开拓者

发表于 2015-2-10 17:16:20 | 显示全部楼层
ox,oy 原点一般不变化的话,赋值一次就行了啊。
画面坐标的话,参照 Game_Character 的 screen_x 和 screen_y
在刷新里面你可以写:
箭矢的画面坐标: self.x = (箭矢实际X坐标 * 128 - $game_map.display_x + 3) / 4 + 箭矢位图的宽 / 2
                            self.y = (箭矢实际Y坐标 * 128 - $game_map.display_x + 3) / 4 + 箭矢位图的高

点评

一样有用,和图片旋转没关系。就算左右翻转都一样。  发表于 2015-2-11 08:53
但是我把箭矢旋转了一定的角度就不管用了啊= =  发表于 2015-2-11 03:51

评分

参与人数 1星屑 +100 收起 理由
hys111111 + 100 认可答案

查看全部评分

xp vx va mv  va mz 各类型脚本/插件定制
回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2015-2-10 18:55:03 | 显示全部楼层
本帖最后由 taroxd 于 2015-2-11 10:22 编辑

题外话:抛物线为何不用参数方程?坐标容易算得多

VA 中“跳跃”的参数方程大致是这样的:
  1. x = x0 + (t / ymax / 2) * (x1 - x0)
  2. y = y0 + (t / ymax / 2) * (y1 - y0) + (ymax**2 - (t - ymax)** 2) / 2

  3. 其中

  4. x0, y0 为起始点坐标(地图坐标)
  5. x1, y1 为目标点坐标(地图坐标)
  6. ymax = 10 + sqrt((x1 - x0)**2 + (y1 - y0)**2) - @move_speed, @move_speed 为角色的移动速度
  7. t 为参数(时间,单位为帧),范围为 0..ymax*2
复制代码

点评

请问你这个方程式怎么得出来的。(t / ymax / 2) 这个是啥意思?最后一句ymax=10+**** 10是什么作用?想用你的这个方程,但是不了解。希望详细解答下!  发表于 2019-6-16 19:59
不会  发表于 2015-2-11 09:25

评分

参与人数 1星屑 +100 收起 理由
hys111111 + 100 认可答案

查看全部评分

回复

使用道具 举报

梦石
0
星屑
1816
在线时间
2527 小时
注册时间
2010-10-12
回帖
1336

开拓者

 楼主| 发表于 2015-2-11 12:20:12 | 显示全部楼层
taroxd 发表于 2015-2-10 05:55
题外话:抛物线为何不用参数方程?坐标容易算得多

VA 中“跳跃”的参数方程大致是这样的: ...

所噶,这个容易好多(o゚ω゚o)
这么说斜率怎么算了又
(o゚ω゚o)

点评

当然 dy/dx 也可以用 dy/dt ÷ dx/dt 来算,不过没什么必要就是了  发表于 2015-2-11 12:31
另外,里面所有的除法都是指实数的除法,不是 Ruby 整数的地板除  发表于 2015-2-11 12:29
斜率 (y(t + Δt) - y(t)) / (x(t + Δt) - x(t)) 其中 Δt 取任意一个比较小的数字  发表于 2015-2-11 12:27
这个计算方式算出的是地图坐标。把地图坐标转化为画面坐标自然就涉及到地图滚动了  发表于 2015-2-11 12:25
等等,如果这样算的话,箭会跟着地图一起滚动么?  发表于 2015-2-11 12:21

回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部