一、問題:
平時使用的按鈕之類的都是規則圖形,可是有些好比一些世界地圖之類的,
地圖塊是不規則的,邊緣都是彎彎曲曲的,並且有些有交叉,處理這樣的
點擊塊就比較麻煩了
二、幾點解決思路
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在數組中索引,獲取對應的字母,
而後根據什麼字母判斷點擊的區域php
代碼1:圖片處理python
1 #!/usr/bin/env php 2 <?php 3 4 // require_once("vendor/autoload.php"); 5 6 // use Dlindberg\Pasteboard\Pasteboard; 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 \n", $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\",\n", $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 }