更新:修改了一个严重bug(算法错误),增加了多边形和圆形碰撞,增加了正矩形和圆形碰撞
应用场景:2D游戏凸多边形碰撞,比像素碰撞精确度低点,比方框碰精确度要高。
限制条件:2D。不能用于凹多边形,凹多边形得拆分成凸多边形或者三角形来做。运动速度很快了会有穿越效果。不带任何物理,如果需要反弹等等物理效果,就必须上物理引擎了。
最佳实践:最好能用盒子先检测一下然后再用分离轴来做碰撞碰撞。否则屏幕上精灵一多还是挺费电的。
参考文档
http://www.codeproject.com/KB/GDI-plus/PolygonCollision.aspx
参考文档中的代码是ActionScript的,我移植成C99的,附件的包是Xcode项目,不过C源代码可以单提出来用于任何支持C的设备
C99标准里只有_Bool,没有bool,需要包含头文件<stdbool.h>才可以用bool, true, false,没包含前的编译错误弄得我莫名其妙的
还有大家直接用的话最好先充分测试。这个代码写好了只测试了几个例子。如果有命名冲突,得自己搞定,呵呵。
如果你想scroll down to list's 10 item 你需要yourListView.setSelection(position)
如果你想创建一个这样的vlayout
Section '1' is linear layout 包含imageview and textview
Section '2' is listview包含特定的customze items list
而你又希望你的scrollbar 可以同时对上面两个起作用
那么你需要
View headerView = getLayoutInflater().inflate(
R.layout.foo_list_header, null);
mListView = (ListView) findViewById(...);
mListView.addHeaderView(headerView);
setListAdapter(...);
去掉横线
getListView().setDivider(null);
getListView().setDividerHeight(0);
Or in XML:
android:divider="@drawable/list_item_divider"
android:dividerHeight="1dp"
3更换背景颜色
不用 View.setBackgroundColor() 而用View.setBackgroundDrawable() or View.setBackgroundResource
4.相关事件
listView.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> adapter, View view, int which, long id) {
String sUrl = "myUrl";
URL url = new URL(/blog_article/sUrl/index.html);
URLConnection conn = url.openConnection();
conn.setDoOutput(true);
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream(), Charset.forName("ISO-8859-1")));
String res = "";
String line;
while ((line = rd.readLine()) != null) {
res += line;
}
rd.close();
}
});
public class DrawablePreviewActivity extends ListActivity
{
private static final String TAG = "DrawablePreviewActivity";
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setTitle("Preview of android.R.drawable.*");
try {
Class RClass = Class.forName("android.R");
Class[] subclasses = RClass.getDeclaredClasses();
Class RDrawable = null;
for(Class subclass : subclasses) {
if("android.R.drawable".equals(subclass.getCanonicalName())) {
RDrawable = subclass;
break;
}
}
List<Map<String, Object>> drinfo = new ArrayList<Map<String, Object>>();
Field[] drawables = RDrawable.getFields();
for(Field dr : drawables) {
Map<String, Object> map = new HashMap<String, Object>();
Drawable img = getResources().getDrawable(dr.getInt(null));
map.put("drimg", dr.getInt(null));
map.put("drname", dr.getName());
drinfo.add(map);
}
setListAdapter(new SimpleAdapter(this,
drinfo,
R.layout.listitem,
new String[] { "drimg", "drname" },
new int[] { R.id.drimg, R.id.drname }));
} catch(IllegalAccessException iae) {
Log.e(TAG, iae.toString());
} catch(ClassNotFoundException cnfe) {
Log.e(TAG, cnfe.toString());
}
}
}
源码下载
http://www.altcanvas.com/downloads/drawablepreview.tar.gz