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:图片处理
1 #!/usr/bin/env php 2 <?php 3 4 // require_once("vendor/autoload.php"); 5 6 // use DlindbergPasteboardPasteboard; 7 8 $file = "/Users/staff/Desktop/1.png"; 9 $img = @imagecreatefrompng($file); 10 $size = getimagesize($file); 11 $width = $size[0]; 12 $height = $size[1]; 13 14 $strArr = array(); 15 16 $pixelWidth = 8; 17 for ($j=0; $j < ceil($height/$pixelWidth); $j++) { 18 $strArr[] = str_repeat(" ", ceil($width/$pixelWidth)); 19 } 20 21 $lastY = 0; 22 for ($y=0; $y < $height; $y+=$pixelWidth) { 23 for ($x=0; $x < $width; $x+=$pixelWidth) { 24 $rgb = imagecolorat($img, $x, $y); 25 $r = ($rgb >> 16) & 0xFF; 26 $g = ($rgb >> 8) & 0xFF; 27 $b = $rgb & 0xFF; 28 29 $strX = $x/$pixelWidth; 30 $strY = $y/$pixelWidth; 31 32 // printf("rgb r: %x g: %x b: %x ", $r, $g, $b); 33 34 if ($r == 0x8a && $g == 0x54 && $b == 0x60) { 35 $strArr[$strY][$strX] = "1"; 36 } 37 38 if ($r == 0x1c && $g == 0xfe && $b == 0xfc) { 39 $strArr[$strY][$strX] = "2"; 40 } 41 42 if ($r == 0x41 && $g == 0x24 && $b == 0xDC) { 43 $strArr[$strY][$strX] = "3"; 44 } 45 46 if ($r == 0xfe && $g == 0x71 && $b == 0x1d) { 47 $strArr[$strY][$strX] = "4"; 48 } 49 50 if ($r == 0x1c && $g == 0xe8 && $b == 0x27) { 51 $strArr[$strY][$strX] = "5"; 52 } 53 54 } 55 } 56 57 // var_dump($strArr); 58 59 $tmp = ""; 60 foreach ($strArr as $key => $value) { 61 $tmp .= sprintf(""%s", ", $value); 62 } 63 64 65 66 function copy2clipboard($string){ 67 $descriptorspec = array( 68 0 => array("pipe", "r"), // stdin is a pipe that the child will read from 69 1 => array("pipe", "w"), // stdout is a pipe that the child will write to 70 2 => array("pipe", "w"), // stderr is a file to write to 71 ); 72 $process = proc_open('pbcopy', $descriptorspec, $pipes); 73 if (is_resource($process)) { 74 fwrite($pipes[0], $string); 75 fclose($pipes[0]); 76 fclose($pipes[1]); 77 78 $return_value = proc_close($process); 79 return $return_value; 80 } 81 } 82 83 copy2clipboard($tmp); 84 85 86 // Pasteboard::set($tmp);
代码2:字母获取
1 getMask: function(touch) { 2 var arr = [字母]; 3 4 var p = touchPos; 5 var x = Math.floor(p.x / 8);
//80是因为图片是左上角开始,而在 cocos 中的坐标是左下角开始,80是整个图片高度/8得到的数组长度 6 var y = 80 - Math.floor(p.y / 8); 7 if(y < 0 || x < 0 || y >= arr.length || x >= arr[y].length) { 8 return ""; 9 } 10 return arr[y].charAt(x); 11 }