1、问题:
平时使用的按钮之类的都是规则图形,但是有些比如一些世界地图之类的,
地图块是不规则的,边缘都是弯弯曲曲的,而且有些有交叉,处理这样的
点击块就比较麻烦了
2、几点解决思路
2.1 如果地图块之间有点间隙,或者距离不是很近,那么可以采用每个
地图块中添加多个小的响应区域,做好标记,那几个响应区域对应那个地图,
这样点击小地图块就是相当于点击对应的地图了,这种不容易做到精准,只能大致
区域,因为地图边缘如果比较弯曲,需要放很多小的响应区域了
2.2 我们可以把整张地图看做一个整体,然后对这张地图生成一个字母数组,为啥要
生成一个字母数组呢?又用什么方式生成字母数组呢?
2.2.1 我们点击时肯定有位置,这样我们可以把位置转化为刚才生成的字母数组中的字母,
假如是1,我们认为点击了第一块地图,如果是2,我们就认为点击了第二块地图...
2.2.2 怎么生成地图的字母数组呢?
现在脚本语言如php,python都能读取 png 图片的像素 rgba 值,我们先对图片做个特殊处理,
用 psd 之类的工具,把地图快分别涂成不同的颜色值,这样我们就能根据颜色值来区分不用的地图块了,
然后就可以写脚本对这个地图进行处理,生成这个地图特有的字符表了,我们不需要每个像素都生成一个
字母,可以每个几个像素,比如8,或者6个,看需要的精细程度,那些没有地图快的地方,我们可以用" "
空格字符来表示
2.2.3 怎么使用这个字母数组呢
获取 touch 在地图上的位置,然后除去上面的8,然后根据得到的idxX,idxY在数组中索引,获取对应的字母,
然后根据什么字母判断点击的区域

代码1:图片处理

 #!/usr/bin/env php
<?php // require_once("vendor/autoload.php"); // use Dlindberg\Pasteboard\Pasteboard; $file = "/Users/staff/Desktop/1.png";
$img = @imagecreatefrompng($file);
$size = getimagesize($file);
$width = $size[0];
$height = $size[1]; $strArr = array(); $pixelWidth = 8;
for ($j=0; $j < ceil($height/$pixelWidth); $j++) {
$strArr[] = str_repeat(" ", ceil($width/$pixelWidth));
} $lastY = 0;
for ($y=0; $y < $height; $y+=$pixelWidth) {
for ($x=0; $x < $width; $x+=$pixelWidth) {
$rgb = imagecolorat($img, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF; $strX = $x/$pixelWidth;
$strY = $y/$pixelWidth; // printf("rgb r: %x g: %x b: %x \n", $r, $g, $b); if ($r == 0x8a && $g == 0x54 && $b == 0x60) {
$strArr[$strY][$strX] = "1";
} if ($r == 0x1c && $g == 0xfe && $b == 0xfc) {
$strArr[$strY][$strX] = "2";
} if ($r == 0x41 && $g == 0x24 && $b == 0xDC) {
$strArr[$strY][$strX] = "3";
} if ($r == 0xfe && $g == 0x71 && $b == 0x1d) {
$strArr[$strY][$strX] = "4";
} if ($r == 0x1c && $g == 0xe8 && $b == 0x27) {
$strArr[$strY][$strX] = "5";
} }
} // var_dump($strArr); $tmp = "";
foreach ($strArr as $key => $value) {
$tmp .= sprintf("\"%s\",\n", $value);
} function copy2clipboard($string){
$descriptorspec = array(
0 => array("pipe", "r"), // stdin is a pipe that the child will read from
1 => array("pipe", "w"), // stdout is a pipe that the child will write to
2 => array("pipe", "w"), // stderr is a file to write to
);
$process = proc_open('pbcopy', $descriptorspec, $pipes);
if (is_resource($process)) {
fwrite($pipes[0], $string);
fclose($pipes[0]);
fclose($pipes[1]); $return_value = proc_close($process);
return $return_value;
}
} copy2clipboard($tmp); // Pasteboard::set($tmp);

代码2:字母获取

 getMask: function(touch) {
var arr = [字母]; var p = touchPos;
var x = Math.floor(p.x / 8);
       //80是因为图片是左上角开始,而在 cocos 中的坐标是左下角开始,80是整个图片高度/8得到的数组长度
var y = 80 - Math.floor(p.y / 8);
if(y < 0 || x < 0 || y >= arr.length || x >= arr[y].length) {
return "";
}
return arr[y].charAt(x);
}

cocos游戏: 不规则响应区域处理的更多相关文章

  1. UGUI之不规则按钮的响应区域

    比如一些不规则按钮最好可以设置它的响应区域.如下图所示,用Polygon Collider2D组件圈出精灵响应事件的区域. 注意 IsRaycastLocationValid 的判断区域是RectTr ...

  2. cocos游戏的真正入口,用C++实现的demo版本

    1.cocos游戏的出发点 在main函数中有一句:   return CCApplication::sharedApplication()->run(); 2.经过层层深入发现,真正的入口:  ...

  3. collectionviewcell 添加删除按钮 响应区域的问题

    在collectionviewcell 的右上角添加了一个删除按钮,但是发现只有cell和删除按钮重合的区域才会响应点击事件 后来doctor 李说这是iOS 事件响应链的机制(http://www. ...

  4. Cocos游戏引擎,让小保安成就大梦想

    秦丕胜是大连的一位保安.与非常多自学成才的人一样,2010年,在考上日照职业技术学院一年后便退了学. 因为没有高学历.加上喜欢自由,他来到了大连成为了一名保安.从高中開始,秦丕胜就酷爱代码,他曾自豪地 ...

  5. H5微信页面开发 IOS系统 input输入框失去焦点,软键盘关闭后,被撑起的页面无法回退到原来正常的位置,导致弹框里的按钮响应区域错位

    H5微信页面开发,软键盘弹起后,若原输入框被遮挡,页面整体将会上移,然而当输入框失焦,软键盘收起后,页面未恢复,导致弹框里的按钮响应区域错位. 解决方案:给输入框(或select选择框)添加失去焦点的 ...

  6. iOS - 扩展UIButton的响应区域

    扩展UIButton的响应区域 引言 通常在iOS开发中通常会遇到产品说按钮的响应区域不大 而UI给我们的设计是按钮的面积 而不是按钮的响应面积 所以在这种情况下需要我们自己去扩展按钮的响应区域 思考 ...

  7. 【Cocos游戏实战】功夫小子第八课之游戏打包和相关问题说明

    至此,功夫小子系列的Cocos2d-x的实战文章就结束了. 源代码地址: https://github.com/SuooL/KungfuBoy 如须要资源请邮件我 1020935219@qq.com ...

  8. android 扩大view的响应区域

    1.Android提供TouchDelegate帮助实现扩大一个很小的view的点击区域 例如:https://developer.android.com/training/gestures/view ...

  9. H5C3--background中cover,背景样式,提升响应区域+精灵图的使用

    一.cover的使用 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

随机推荐

  1. 怎么做web接口测试

        这就需要开发提供的接口文档了,接口文档和功能测试的需求说明书的功能是一样的.包括:接口说明.调用的url,请求方式(get or post),请求参数.参数类型.请求参数说明,返回结果说明.有 ...

  2. Java代理类Proxy的用法

    代理(proxy) 利用代理可以在运行时创建一个实现了一组给定接口的新类.这种功能只有在编译时无法确定需要实现哪个接口时才有必要使用. 何时使用代理 假设有一个表示接口的Class对象(有可能只包含一 ...

  3. net core中引用GDAL

    <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</Ou ...

  4. 夜神模拟器怎么连接adb

    夜神模拟器连接不了adb的原因主要是adb的版本与夜神模拟器adb版本不一致造成的,具体的解决办法请看下面的操作步骤. 工具/原料   电脑 安装了夜神模拟器 方法/步骤   1 使用快捷键win + ...

  5. jQuery遍历 - 过滤first(),last()和eq()使用

    jQuery遍历 - 过滤最基本的过滤方法是first(),last()和eq(),它们允许您根据元素在一组元素中的位置选择特定元素. 其他过滤方法(如filter()和not())允许您选择与特定条 ...

  6. AD的故事继续在Sharepoint里续演

    本以为AD的开发深入工作,可能暂时先放放了,这不最近又一次接触了SP的知识领域,又一次见到了久违相识的老朋友AD域控了,让我没有想到其实服务器这块儿微软的份额这么大...不得不深思微软的核心业务是啥, ...

  7. git did not exit cleanly (exit code 1) 的解决办法

    问题描述: 关于Git的使用,在通常情况下,习惯于先在本地创建一个本地仓库,然后将项目提交到本地master,再将本地master中的项目Push 到远程仓库中,这样问题就来了. 具体错误信息如下: ...

  8. js 设计模式——策略模式

    策略模式(Strategy) 定义:将定义的一组算法封装起来,使其相互之间可以替换.封装的算法具有一定的独立性,不会随客户端的变化而变化 废话不多说,先来个例子 // 例如要写一个计算两个数加减乘除的 ...

  9. 关于项目中js原型的使用

    在一个项目中为了减少全局变量的使用及模块化的开发我们使用的构造函数加原型的开发模式 var App = function(){ //管理构造函数的属性 this.name = 'jack' } //页 ...

  10. wpf DATAgrid模板中button 命令绑定以及命令参数绑定

    场景:视频上传功能,上传列表使用DataGrid控件,视频有不同的状态对应不同的操作,DataGrid中最后一列为操作列,里面是Button控件.希望点击Button后执行对应的操作,但是设置Butt ...