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

Project1

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

图片碰撞检测

 关闭 [复制链接]

Lv1.梦旅人

指引者

梦石
0
星屑
50
在线时间
2 小时
注册时间
2005-10-25
帖子
375
跳转到指定楼层
1
发表于 2009-1-20 21:07:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
很想做个ARPG 无奈不知道怎么判断2个图片之间的碰撞
上网查了一下找到个JAVA的源代码http://www.soidc.net/discuss/1/060506/15/240551_1.html
自己试着模仿了一下 请各位看看有什么要改进的
把一下脚本在"Game_Temp"上面插入运行游戏可自动测试

  1. devil = Sprite.new
  2. devil.bitmap = Bitmap.new("Graphics/Pictures/1.png")
  3. devil.ox = devil.bitmap.width / 2
  4. devil.oy = devil.bitmap.height / 2
  5. devil.x = 320
  6. devil.y = 240

  7. devil1 = Sprite.new
  8. devil1.bitmap = Bitmap.new("Graphics/Pictures/2.png")
  9. devil1.ox = devil1.bitmap.width / 2
  10. devil1.oy = devil1.bitmap.height / 2
  11. devil1.x = 80
  12. devil1.y = 240
  13. loop do
  14.   
  15.   devil1.x+=1
  16.   Graphics.update
  17.    if(devil1.bitmap.width/2 < devil.x+devil1.bitmap.width/2&&devil1.x+devil.bitmap.width/2> devil.x-devil1.bitmap.width/2)
  18.     if(devil1.bitmap.height/2 < devil.y+devil1.bitmap.height/2&&devil1.y+devil1.bitmap.height/2> devil.y-devil1.bitmap.height/2)
  19.       devil1.x=80
  20.     end
  21.   end
  22. end  
复制代码


此脚本是判断2个图片的边缘是否发生碰撞 如果是就将图片1还原到初始位置
此脚本供大家交流使用
大家可以尝试下不同坐标的测试
这是随机坐标点的判断

  1. devil = Sprite.new
  2. devil.bitmap = Bitmap.new("Graphics/Battlers/075-Devil01")
  3. devil.ox = devil.bitmap.width / 2
  4. devil.oy = devil.bitmap.height / 2
  5. devil.x = 320
  6. devil.y = 240

  7. devil1 = Sprite.new
  8. devil1.bitmap = Bitmap.new("Graphics/Battlers/046-Grappler01")
  9. devil1.ox = devil1.bitmap.width / 2
  10. devil1.oy = devil1.bitmap.height / 2
  11. devil1.x = 80
  12. devil1.y = 180
  13. loop do
  14.   
  15.   devil1.y+=1
  16.   devil1.x+=1
  17.   if(devil1.bitmap.width/2 < devil.x+devil1.bitmap.width/2&&devil1.x+devil.bitmap.width/2> devil.x-devil1.bitmap.width/2)
  18.     if(devil1.bitmap.height/2 < devil.y+devil1.bitmap.height/2&&devil1.y+devil1.bitmap.height/2> devil.y-devil1.bitmap.height/2)
  19.       devil1.y=rand(100)
  20.       devil1.x=rand(100)
  21.     end
  22.   end
  23.   Graphics.update
  24. end  
复制代码

范例:http://rpg.blue/upload_program/d ... ��例_112886574.rar
附加提示: 两张图片都要放在Graphics/Pictures/下面
命名为1.jpg 和2.jpg

↓这是啥-- [IMG][/IMG]

Lv1.梦旅人

梦石
0
星屑
55
在线时间
1 小时
注册时间
2006-1-30
帖子
70
2
发表于 2009-1-20 21:27:32 | 只看该作者
写成函数比较好重用。

摘自:http://rpg.blue/viewthread.php?tid=113835
    def distance(spr,bul = self)
      return false if bul.z == 0
      if spr.x>bul.x-bul.width-spr.width / $角色判定缩小倍数 and
         spr.x<bul.x+bul.width+spr.width / $角色判定缩小倍数 and
         spr.y>bul.y-bul.height-spr.height / $角色判定缩小倍数 and
         spr.y<bul.y+bul.height+spr.height / $角色判定缩小倍数
        return true
      else
        return false
      end
    end
图像使用加法/减法就有这种效果。速度大幅提高,只要将最大FPS40改为30
STGhttp://www.namipan.com/d/22f466e ... 192aa69cca48f2de800
回复 支持 反对

使用道具 举报

Lv3.寻梦者 (暗夜天使)

名侦探小柯

梦石
0
星屑
3422
在线时间
3628 小时
注册时间
2006-9-6
帖子
37402

开拓者贵宾第3届短篇游戏大赛主流游戏组亚军第5届短篇游戏比赛亚军

3
发表于 2009-1-21 20:43:25 | 只看该作者
以下引用aaaagq于2009-1-20 13:27:32的发言:

写成函数比较好重用。

摘自:http://rpg.blue/viewthread.php?tid=113835

   def distance(spr,bul = self)
     return false if bul.z == 0
     if spr.x>bul.x-bul.width-spr.width / $角色判定缩小倍数 and
        spr.x<bul.x+bul.width+spr.width / $角色判定缩小倍数 and
        spr.y>bul.y-bul.height-spr.height / $角色判定缩小倍数 and
        spr.y<bul.y+bul.height+spr.height / $角色判定缩小倍数
       return true
     else
       return false
     end
   end

主要想谢谢LS的是,
让我知道加法和减法的效果……
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
1 小时
注册时间
2009-1-12
帖子
68
4
发表于 2009-1-21 21:03:53 | 只看该作者
检测冲撞有多方法,矩形冲撞是最简单,楼主探索精神值得佩服,但是如果一个地图上很多图片要检测碰撞,并且游戏每一祯都要检测,你这种方法就效率很低了,如果硬件不行的朋友,会卡的要死.
回复 支持 反对

使用道具 举报

Lv2.观梦者

傻♂逼

梦石
0
星屑
374
在线时间
1606 小时
注册时间
2007-3-13
帖子
6562

烫烫烫开拓者

5
发表于 2009-1-21 21:19:20 | 只看该作者
不如Flash的HitTest好
哎呀,蛋疼什么的最有爱了
回复 支持 反对

使用道具 举报

Lv1.梦旅人

指引者

梦石
0
星屑
50
在线时间
2 小时
注册时间
2005-10-25
帖子
375
6
 楼主| 发表于 2009-1-22 02:59:23 | 只看该作者
以下引用zmv2000a于2009-1-21 13:03:53的发言:

检测冲撞有多方法,矩形冲撞是最简单,楼主探索精神值得佩服,但是如果一个地图上很多图片要检测碰撞,并且游戏每一祯都要检测,你这种方法就效率很低了,如果硬件不行的朋友,会卡的要死.

我想了解的就是这个啊
有谁会--
现在我只掌握了已知的2张图片的碰撞检测
但是已知的和X的检测我就不知道怎么做了
完全没有思路
↓这是啥-- [IMG][/IMG]
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
1 小时
注册时间
2006-1-30
帖子
70
7
发表于 2009-1-22 16:57:55 | 只看该作者
写成函数比较好重用。
1 VS N 的判定。

摘自:http://rpg.blue/viewthread.php?tid=113835


每一帧的判定
      @bul_e.each do |bul|     #遍历子弹的数组,使每个子弹都付与bul
        bul.moving             #子弹运动
        #子弹与主角的碰撞判定,伤害判定
        @enemy_hp += bul.att_spr(@mysprite)
        bul.update             #子弹显示效果的更新
      end


子弹的方法
    #获得本子弹对spr的伤害
    def att_spr(spr)
          #子弹碰撞到spr的有效性判定
          if distance(spr) and @can_att
            @att_n -= 1
            if @att_n <= 0
              self.x = 1000
              self.z = 0
              self.animation(nil)
              @can_att = false
            end
            #碰撞有效时运行ruby脚本
            if @ruby_att_c != nil
              eval(@ruby_att_c)
              @ruby_att_c = nil
            end
            return @dam     #返回伤害值
          end
            return 0
    end
    #碰撞判定
    def distance(spr,bul = self)
      return false if bul.z == 0
      if spr.x>bul.x-bul.width-spr.width / $角色判定缩小倍数 and
         spr.x<bul.x+bul.width+spr.width / $角色判定缩小倍数 and
         spr.y>bul.y-bul.height-spr.height / $角色判定缩小倍数 and
         spr.y<bul.y+bul.height+spr.height / $角色判定缩小倍数
        return true
      else
        return false
      end
    end
图像使用加法/减法就有这种效果。速度大幅提高,只要将最大FPS40改为30
STGhttp://www.namipan.com/d/22f466e ... 192aa69cca48f2de800
回复 支持 反对

使用道具 举报

Lv1.梦旅人

粉蜘蛛秀秀

梦石
0
星屑
76
在线时间
39 小时
注册时间
2007-6-4
帖子
384

贵宾第1届Title华丽大赛新人奖

8
发表于 2009-1-22 17:09:53 | 只看该作者
class Area
  attr_reader   :x1
  attr_reader   :y1
  attr_reader   :x2
  attr_reader   :y2
  def initialize(x1,y1,x2,y2)
    @x1,@y1,@x2,@y2 = x1,y1,x2,y2
  end
end
  #--------------------------------------------------------------------------
  # ● 获取矩形
  #--------------------------------------------------------------------------
  def 取得矩形(x,y,range_x,range_y)
    rect = Area.new(@actor.screen_x-range_x,@actor.screen_y-range_y,
                    @actor.screen_x+range_x,@actor.screen_y)
    if Range.new(rect.x1,rect.x2).include?(x) and
       Range.new(rect.y1,rect.y2).include?(y)               
       return true
    else
       return false   
    end   
  end


具体参考:
http://rpg.blue/viewthread.php?tid=112482
{/cy}
http://rpg.blue/upload_program/files/hide_xiu_96911465.png
回复 支持 反对

使用道具 举报

Lv1.梦旅人

指引者

梦石
0
星屑
50
在线时间
2 小时
注册时间
2005-10-25
帖子
375
9
 楼主| 发表于 2009-1-23 04:51:01 | 只看该作者
以下引用hide秀于2009-1-22 9:09:53的发言:
具体参考:
http://rpg.blue/viewthread.php?tid=112482
[本贴由作者于 2009-1-22 9:11:25 最后编辑]

有玩过 {/hx} 太强了
可是没找到控制角色的函数
话说那个角色的动画你定义在哪了?
↓这是啥-- [IMG][/IMG]
回复 支持 反对

使用道具 举报

Lv1.梦旅人

有事烧纸

梦石
0
星屑
154
在线时间
509 小时
注册时间
2005-10-22
帖子
6982

贵宾VX城市地图大赛冠军第1届RMTV比赛冠军第1届TG大赛冠军

10
发表于 2009-1-23 05:30:57 | 只看该作者
一般游戏都直接是aabb包围盒碰撞检测,除非是对检测要求非常高的游戏,比如射击类(但实际上射击类还是包围盒检测,只是每个图形多划分一些包围盒划的精细而已)
而实际上更多的游戏完全不进行碰撞检测,如果你有完善的路点寻路系统,那么可以完全去掉游戏中人物和场景的碰撞,剩下的就只有和敌人的碰撞了,大大提高速度~
神隐中,偶尔诈尸
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2025-7-21 19:24

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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