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

Project1

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

[有事请教] 如何判断旋转了的Sprite被点击

[复制链接]

Lv3.寻梦者

梦石
1
星屑
916
在线时间
101 小时
注册时间
2006-3-27
帖子
1081
跳转到指定楼层
1
发表于 2018-4-14 13:05:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
Sprite正常情况下 可以通过X Y ,W H来确定一个RECT,根据鼠标坐标判断是否点击到了

可Sprite加上rotation属性以后就乱了,有什么简单的方法判断是否点击吗

或者类似网页DOM里ONCLICK这种监听的方式?

Lv3.寻梦者

梦石
0
星屑
3053
在线时间
318 小时
注册时间
2015-4-30
帖子
92
2
发表于 2018-4-14 15:21:20 | 只看该作者
如果要精确点击的话,感觉做出来都不会简单吧。
记得以前写六角战棋的时候,
判断鼠标是否精确到六角框内还是压线,
用到中心点判断那会儿就很折腾。
不过,MV的Bitmap貌似有取色的指令getPixel(x, y)。
所以如果原图是规则的方块的话,
不妨考虑一下折衷的方法。
比如提取源图的rect,给Sprite分层,
上层是常规图片,底层为对应的填充色。
旋转的时候,两层都同步旋转,
然后提取鼠标点击底层的颜色判断。
当然了,也会有可能出现鼠标点击的位置,
不在sprite或bitmap内而蹦出各种TypeError.....
具体的事宜,就留给楼主安置了,本楼仅作参考。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
1
星屑
916
在线时间
101 小时
注册时间
2006-3-27
帖子
1081
3
 楼主| 发表于 2018-4-14 16:24:57 | 只看该作者
本帖最后由 幻の飞鱼 于 2018-4-14 16:26 编辑
在野月光族 发表于 2018-4-14 15:21
如果要精确点击的话,感觉做出来都不会简单吧。
记得以前写六角战棋的时候,
判断鼠标是否精确到六角框内还 ...


感谢,确实是一个思路,还有些细节问题我要思考一下可行性
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3060
在线时间
556 小时
注册时间
2013-6-8
帖子
10
4
发表于 2018-4-15 02:04:35 | 只看该作者
PIXI里Sprite类就有containsPoint方法
sprite.containsPoint({x: TouchInput.x, y: TouchInput.y})
此方法可判断旋转,不计算children范围
如果要计算包含children的最小方形可用getBounds()
sprite.getBounds();

点评

完全正解,多谢  发表于 2018-4-15 16:59
找到了,我研究一下  发表于 2018-4-15 16:55
这个是不是1.5以后的方法,没找到呢。。。  发表于 2018-4-15 16:54

评分

参与人数 1+1 收起 理由
幻の飞鱼 + 1 我很赞同

查看全部评分

回复 支持 1 反对 0

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
1232
在线时间
1017 小时
注册时间
2011-4-30
帖子
1516
5
发表于 2018-4-15 13:20:49 | 只看该作者

Sprite.prototype.worldToLocalXY  = function ( x,y,sprite) {
    var node = sprite || this;  
    return node.worldTransform.applyInverse({x:x,y:y},{visible:node.worldVisible});
};



/**
* 是触摸自己
* @param {number} x x坐标
* @param {number} y y坐标
* @param {boolean} type 是否不检查位图(true 为不检查 )
* @param {bolean}c 是否检查子图(true 为 检查 )
*
*
*/
Sprite.prototype.isTouchThis = function (x, y, type, c) {
    if (this.visible) {
        var loc = this.worldToLocalXY(x,y)
        var x = loc.x
        var y = loc.y
        var v = loc.visible
      
        if(v){
            if (c) {
                for (var i = 0; i < this.children.length; i++) {
                    var s = this.children[i]
                    if (s && s.isTouchThis && s.isTouchThis(x, y, type,c)) {
                        return true
                    }
                }
            }

            if (this.isTouchIn && this.isTouchIn(x, y, type)) {
                return true
            }
        }
    }
    return false
}



/**是在之中
* @param {boolean} type 不检查图片
*
*/
Sprite.prototype.isTouchIn = function (x, y, type) {
    if (this.anchor) {
        var x = x + this.anchor.x * this.width
        var y = y + this.anchor.y * this.height
    }
    if (this.isTouchInFrame(x, y, type)) {
        return type || this.isTouchInBitamp(x, y)
    } else {
        return false
    }
}


/**是在区域中 */
Sprite.prototype.isTouchInFrame = function (x, y, type) {
    return x >= 0 && y >= 0 && x < this.width && y < this.height;
};


/**是在位图上不透明点 */
Sprite.prototype.isTouchInBitamp = function (x, y) {
    if (this._realFrame) {
        var x = x + this._realFrame.x
        var y = y + this._realFrame.y
    }
    if (this.bitmap && this.bitmap.getAlphaPixel(x, y)) {
        return true
    }
    return false
}

点评

哎……这个..解决不了旋转以后的问题啊  发表于 2018-4-15 16:53
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
1
星屑
916
在线时间
101 小时
注册时间
2006-3-27
帖子
1081
6
 楼主| 发表于 2018-4-15 17:18:31 | 只看该作者
本帖最后由 幻の飞鱼 于 2018-4-15 17:23 编辑
phantomz 发表于 2018-4-15 02:04
PIXI里Sprite类就有containsPoint方法
sprite.containsPoint({x: TouchInput.x, y: TouchInput.y})
此方法 ...


麻烦再问一句,Sprite的旋转的锚点 是如何指定的呢?
好像是?this.anchor.x this.anchor.y?
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4583
在线时间
1205 小时
注册时间
2016-4-7
帖子
982

开拓者

7
发表于 2018-4-15 18:11:19 | 只看该作者
用旋转的时候更新sprite的热区
把aabb换成obb
附庸的附庸不是我的附庸,女儿的女儿还是我的女儿。CK2沉迷ing
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3060
在线时间
556 小时
注册时间
2013-6-8
帖子
10
8
发表于 2018-4-15 21:13:55 | 只看该作者
幻の飞鱼 发表于 2018-4-15 17:18
麻烦再问一句,Sprite的旋转的锚点 是如何指定的呢?
好像是?this.anchor.x this.anchor.y? ...

是anchor没错
sprite.anchor.x = 0.5; //0是左边界 1是右边界

也可一行同时指定x、y
sprite.anchor.set(0.5, 0.3); //x = 0.5, y = 0.3

若只带一个参数则xy值相同
sprite.anchor.set(0.5); // x = y = 0.5

评分

参与人数 1+1 收起 理由
幻の飞鱼 + 1

查看全部评分

回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-5-2 01:16

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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