cocos游戏: 不规则响应区域处理
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游戏: 不规则响应区域处理的更多相关文章
- UGUI之不规则按钮的响应区域
比如一些不规则按钮最好可以设置它的响应区域.如下图所示,用Polygon Collider2D组件圈出精灵响应事件的区域. 注意 IsRaycastLocationValid 的判断区域是RectTr ...
- cocos游戏的真正入口,用C++实现的demo版本
1.cocos游戏的出发点 在main函数中有一句: return CCApplication::sharedApplication()->run(); 2.经过层层深入发现,真正的入口: ...
- collectionviewcell 添加删除按钮 响应区域的问题
在collectionviewcell 的右上角添加了一个删除按钮,但是发现只有cell和删除按钮重合的区域才会响应点击事件 后来doctor 李说这是iOS 事件响应链的机制(http://www. ...
- Cocos游戏引擎,让小保安成就大梦想
秦丕胜是大连的一位保安.与非常多自学成才的人一样,2010年,在考上日照职业技术学院一年后便退了学. 因为没有高学历.加上喜欢自由,他来到了大连成为了一名保安.从高中開始,秦丕胜就酷爱代码,他曾自豪地 ...
- H5微信页面开发 IOS系统 input输入框失去焦点,软键盘关闭后,被撑起的页面无法回退到原来正常的位置,导致弹框里的按钮响应区域错位
H5微信页面开发,软键盘弹起后,若原输入框被遮挡,页面整体将会上移,然而当输入框失焦,软键盘收起后,页面未恢复,导致弹框里的按钮响应区域错位. 解决方案:给输入框(或select选择框)添加失去焦点的 ...
- iOS - 扩展UIButton的响应区域
扩展UIButton的响应区域 引言 通常在iOS开发中通常会遇到产品说按钮的响应区域不大 而UI给我们的设计是按钮的面积 而不是按钮的响应面积 所以在这种情况下需要我们自己去扩展按钮的响应区域 思考 ...
- 【Cocos游戏实战】功夫小子第八课之游戏打包和相关问题说明
至此,功夫小子系列的Cocos2d-x的实战文章就结束了. 源代码地址: https://github.com/SuooL/KungfuBoy 如须要资源请邮件我 1020935219@qq.com ...
- android 扩大view的响应区域
1.Android提供TouchDelegate帮助实现扩大一个很小的view的点击区域 例如:https://developer.android.com/training/gestures/view ...
- H5C3--background中cover,背景样式,提升响应区域+精灵图的使用
一.cover的使用 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
随机推荐
- 【Oracle】 RMAN命令汇总
RMAN命令汇总 2013年写了关于RMAN命令的汇总,先转换为MD文档,温故而知新. 1.进入RMAN 进入本地数据库 [oracle@oracle-n1 ~]$ rman target / 进入远 ...
- C# 嵌套循环
一.简介 嵌套循环:while.for和do...while循环使用一个或者多个嵌套. 二.实例 输出九九乘法表(循环的嵌套) //乘法口诀 for (int i = 1; i <= 9; i+ ...
- 使用EF批量新增数据十分缓慢
使用EF来批量新增数据,发现效率非常的差,几千条数据时甚至需要几分钟来执行,迫于无奈使用sql来执行了. 今天偶然看到一篇关于EF的文章,才发觉原来是自己对EF不够了解的原因. 一般新增时我们是将所有 ...
- Java学习——泛型
Java学习——泛型 摘要:本文主要介绍了什么是泛型,为什么要用泛型,以及如何使用泛型. 部分内容来自以下博客: https://www.cnblogs.com/lwbqqyumidi/p/38376 ...
- js javascript 如何获取某个值在数组中的下标
js 某个值在数组中的下标javascript中知道一个数组中的一个元素的值,如何获取数组下标JS 获取数组某个元素下标 函数方法 采用prototype原型实现方式,查找元素在数组中的索引值js查找 ...
- 大白话说GIT常用操作,常用指令git操作大全
列一下在开发中用的比较多的git指令 git clone https://github.com/chineseLiao/Small-career // 克隆远程仓库到本地 git add . // 把 ...
- 绕过基于签名的XSS筛选器:修改HTML
绕过基于签名的XSS筛选器:修改HTML 在很多情况下,您可能会发现基于签名的过滤器只需切换到一个不太熟悉的执行脚本的方法即可.如果失败了,您需要查看混淆攻击的方法. 本文提供了HTML语法可以被混淆 ...
- linux 线程基础
线程基础函数 查看进程中有多少个线程,查看线程的LWP ps -Lf 进程ID(pid) 执行结果:LWP列 y:~$ ps -Lf 1887 UID PID PPID LWP C NLWP STIM ...
- Swagger从入门到放弃
如何编写基于OpenAPI规范的API文档 简介 Swagger Swagger是一个简单但功能强大的API表达工具.支持的语言种类繁多 使用Swagger生成API,我们可以得到交互式文档,自动生成 ...
- Codeforces F. Maxim and Array(构造贪心)
题目描述: Maxim and Array time limit per test 2 seconds memory limit per test 256 megabytes input standa ...