cocos遊戲: 不規則響應區域處理

一、問題:
平時使用的按鈕之類的都是規則圖形,可是有些好比一些世界地圖之類的,
地圖塊是不規則的,邊緣都是彎彎曲曲的,並且有些有交叉,處理這樣的
點擊塊就比較麻煩了
二、幾點解決思路
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 }
相關文章
相關標籤/搜索