在手机游戏的开发中,要做多机型的适配,但是越来越多的机器开始支持触摸屏操作。
那么我们也要很好的去实现其触摸屏的输入,以让玩家有类似甚至超过键盘控制的舒适感。
下面是一个触摸屏游戏按钮管理思想,对游戏中人物的触摸屏控制会在整理后放出。
该思路并不一定是最佳的,只是我是这么实现的。
-0-
屏幕上所有可以被点击的区域(RECT)按钮都是一个对象,他们有自己被点击的todo()方法,还有一个触点管理器,该管理器控制添加触摸按钮以及清理所有触摸按钮和每个按钮是否被点击的判定。
具体实现如下:
1
import javax.microedition.lcdui.Graphics;
2![](/Images/OutliningIndicators/None.gif)
3
import vectors.CVector;
4![](/Images/OutliningIndicators/None.gif)
5
import base.CTools;
6
import base.CType;
7![](/Images/OutliningIndicators/None.gif)
8![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
/** *//**
9
* 触点区域
10
*
11
* @example 重写todo方法<br>
12
* pointAreaManager.addPionterArea(pointAreaManager.new
13
* PointArea(10, 10, 50, 50){
14
* <br>public void todo(){ <br>
15
* // 写要被点击后要做的逻辑<br>
16
*
17
* // ------------------------------------------------------------<br>
18
* }<br>
19
* });
20
*
21
*
22
* @author Colonleado
23
*
24
*/
25![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
public class PointAreaManager
{
26![](/Images/OutliningIndicators/InBlock.gif)
27
public CVector a = new CVector();
28![](/Images/OutliningIndicators/InBlock.gif)
29![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void addPionterArea(PointArea area)
{
30![](/Images/OutliningIndicators/InBlock.gif)
31
a.addElement(area);
32![](/Images/OutliningIndicators/InBlock.gif)
33
}
34![](/Images/OutliningIndicators/InBlock.gif)
35![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void update()
{
36![](/Images/OutliningIndicators/InBlock.gif)
37![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
for (int i = 0; i < a.size(); ++i)
{
38![](/Images/OutliningIndicators/InBlock.gif)
39
PointArea b = (PointArea) a.elementAt(i);
40![](/Images/OutliningIndicators/InBlock.gif)
41
b.update();
42![](/Images/OutliningIndicators/InBlock.gif)
43
}
44![](/Images/OutliningIndicators/InBlock.gif)
45
}
46
47![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void debug(Graphics g)
{
48![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
for (int i = 0; i < a.size(); ++i)
{
49![](/Images/OutliningIndicators/InBlock.gif)
50
PointArea b = (PointArea) a.elementAt(i);
51![](/Images/OutliningIndicators/InBlock.gif)
52
b.debug(g);
53![](/Images/OutliningIndicators/InBlock.gif)
54
}
55
}
56![](/Images/OutliningIndicators/InBlock.gif)
57![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void clear()
{
58![](/Images/OutliningIndicators/InBlock.gif)
59
a.removeAllElements();
60![](/Images/OutliningIndicators/InBlock.gif)
61
}
62![](/Images/OutliningIndicators/InBlock.gif)
63![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public abstract class PointArea
{
64![](/Images/OutliningIndicators/InBlock.gif)
65
private int x, y, width, height;
66![](/Images/OutliningIndicators/InBlock.gif)
67![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public PointArea(int _x, int _y, int _width, int _height)
{
68![](/Images/OutliningIndicators/InBlock.gif)
69
x = _x;
70![](/Images/OutliningIndicators/InBlock.gif)
71
y = _y;
72![](/Images/OutliningIndicators/InBlock.gif)
73
width = _width;
74![](/Images/OutliningIndicators/InBlock.gif)
75
height = _height;
76![](/Images/OutliningIndicators/InBlock.gif)
77
}
78![](/Images/OutliningIndicators/InBlock.gif)
79![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
private boolean isPointerClick()
{
80![](/Images/OutliningIndicators/InBlock.gif)
81
// 是否发生了触摸事件
82![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (CType.havePointerEvent)
{
83
84
// 如果发生了触摸事件 检测下是否触点在该区域矩形内
85
if (CTools.isPointInRect(CType.getPointerX(),
86![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
CType.getPointerY(), x, y, width, height))
{
87![](/Images/OutliningIndicators/InBlock.gif)
88
CType.havePointerEvent = false;
89![](/Images/OutliningIndicators/InBlock.gif)
90
return true;
91![](/Images/OutliningIndicators/InBlock.gif)
92
}
93![](/Images/OutliningIndicators/InBlock.gif)
94
}
95![](/Images/OutliningIndicators/InBlock.gif)
96
return false;
97![](/Images/OutliningIndicators/InBlock.gif)
98
}
99![](/Images/OutliningIndicators/InBlock.gif)
100![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void update()
{
101![](/Images/OutliningIndicators/InBlock.gif)
102
// 如果被点击了 那么执行自己的todo
103![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (isPointerClick())
{
104![](/Images/OutliningIndicators/InBlock.gif)
105
todo();
106![](/Images/OutliningIndicators/InBlock.gif)
107
}
108![](/Images/OutliningIndicators/InBlock.gif)
109
}
110
111
// 抽象方法todo 供不同矩形按钮去实现
112
protected abstract void todo();
113![](/Images/OutliningIndicators/InBlock.gif)
114![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
public void debug(Graphics g)
{
115
g.setColor(0x00ffff);
116
g.drawRect(x, y, width, height);
117
}
118
119
}
120![](/Images/OutliningIndicators/InBlock.gif)
121
}
我们在主类(一般是我们的Canvas)中实例一个PointAreaManager的对象,以此来完成对触摸屏输入的所有管理。
1
// 实例一个触点管理器
2
psm = new PointAreaManager();
3
// 添加一个按钮
4
psm.addPionterArea(psm.new PointArea(0, CType.ScreenHeight - 30,
5![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
40, 30)
{
6
7
// 实现todo方法
8![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
protected void todo()
{
9
10
// 如果被点击了 就打开音乐
11
pointerAskMusicOk();
12
13
}
14
15
});
这样当进入一个新的界面时,我们只需要向管理器中添加我们需要的矩形区域按钮们,他们各自实现了自己的todo。而在游戏的逻辑更新中会执行管理器的update,管理器会去检查每一个按钮是否被点击,是就执行该按钮的todo。这样就做到了按钮自己管理自己。
当切换界面的时候只需要清理掉管理器中的所有按钮,再添加新按钮们即可。