libgdx学习记录26——Polygon多边形碰撞检测

libgdx中Math封装了Polygon这个类,它是由多个定点进行描述实现的,在进行物体间的碰撞时,物体轮廓有时候是不规则的,这时候可以用一个多边形勾勒出其大概的轮廓,对其进行模拟。

Polygon内部自带是否包含点contains这个函数,通过这个函数我们可以判断两个多变行是否碰撞,即检测两个多边形的每个点是否在另一个多边形中。

检测代码:

 1     public static boolean isOverlap(Polygon polygon1, Polygon polygon2){
 2         for(int i=0; i<polygon2.getVertices().length; i+=2){
 3             if( polygon1.contains(polygon2.getVertices()[i], polygon2.getVertices()[i+1]) ){
 4                 return true;
 5             }
 6         }
 7         for(int i=0; i<polygon1.getVertices().length; i+=2){
 8             if( polygon2.contains(polygon1.getVertices()[i], polygon1.getVertices()[i+1]) ){
 9                 return true;
10             }
11         }
12         return false;
13     }

实例代码:

  1 package com.fxb.Gam003;
  2 
  3 import com.badlogic.gdx.ApplicationAdapter;
  4 import com.badlogic.gdx.Gdx;
  5 import com.badlogic.gdx.InputAdapter;
  6 import com.badlogic.gdx.graphics.Color;
  7 import com.badlogic.gdx.graphics.GL10;
  8 import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
  9 import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
 10 import com.badlogic.gdx.math.Polygon;
 11 import com.badlogic.gdx.math.Vector2;
 12 
 13 public class Lib051_Polygon extends ApplicationAdapter{
 14 
 15     Polygon polygon1, polygon2;
 16     ShapeRenderer rend;
 17     float[] vertices1, vertices2;
 18     Vector2 point = new Vector2(100, 50);
 19     
 20     InputAdapter adapter = new InputAdapter(){
 21         @Override
 22         public boolean touchDown(int screenX, int screenY, int pointer, int button) {            
 23             for(int i=0; i<polygon2.getVertices().length; i+=2){
 24                 polygon2.getVertices()[i  ] += screenX - point.x;
 25                 polygon2.getVertices()[i+1] += Gdx.graphics.getHeight()-screenY - point.y;
 26             }
 27             polygon2.dirty();
 28             
 29             point.set(screenX, Gdx.graphics.getHeight()-screenY);
 30             //polygon2.setVertices(new float[]{ 100+point.x, 50+point.y, 200+point.x, 70+point.y, 300+point.x, 150+point.y, 150+point.x, 100+point.y});
 31                         
 32             return true;
 33         }
 34         
 35     };
 36     
 37     @Override
 38     public void create() {
 39         // TODO Auto-generated method stub
 40         super.create();
 41         
 42         polygon1 = new Polygon();
 43         vertices1 = new float[]{ 100, 100, 200, 100, 300, 300, 100, 200 };
 44         polygon1.setVertices(vertices1);
 45         
 46         vertices2 = new float[]{ 100, 50, 200, 70, 300, 150, 150, 100};
 47         polygon2 = new Polygon(vertices2);
 48         
 49         rend = new ShapeRenderer();
 50         Gdx.input.setInputProcessor(adapter);
 51     }
 52 
 53     
 54     public static boolean isOverlap(Polygon polygon1, Polygon polygon2){
 55         for(int i=0; i<polygon2.getVertices().length; i+=2){
 56             if( polygon1.contains(polygon2.getVertices()[i], polygon2.getVertices()[i+1]) ){
 57                 return true;
 58             }
 59         }
 60         for(int i=0; i<polygon1.getVertices().length; i+=2){
 61             if( polygon2.contains(polygon1.getVertices()[i], polygon1.getVertices()[i+1]) ){
 62                 return true;
 63             }
 64         }
 65         return false;
 66     }
 67     
 68     
 69     
 70     @Override
 71     public void render() {
 72         // TODO Auto-generated method stub
 73         super.render();
 74         Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
 75         Gdx.gl.glClearColor(1, 1, 1, 1);
 76         
 77         rend.begin(ShapeType.Line);
 78         rend.setColor(Color.RED);
 79         for(int i=0; i<polygon1.getVertices().length; i+=2){
 80             rend.line(vertices1[i], vertices1[i+1], vertices1[(i+2)%vertices1.length], vertices1[(i+3)%vertices1.length]);
 81         }
 82         
 83         float[] vertices3 = polygon2.getVertices();
 84         for(int i=0; i<polygon2.getVertices().length; i+=2){
 85             rend.line(vertices3[i], vertices3[i+1], vertices3[(i+2)%vertices3.length], vertices3[(i+3)%vertices3.length]);
 86         }
 87         rend.end();
 88         
 89         //if(polygon1.contains(point.x, point.y)){
 90         if( isOverlap(polygon1, polygon2) ){
 91             rend.setColor(Color.RED);
 92         }else{
 93             rend.setColor(Color.BLUE);
 94         }
 95         rend.begin(ShapeType.Filled);
 96         rend.circle(point.x, point.y, 5);
 97         rend.end();
 98         
 99     }
100 
101     @Override
102     public void dispose() {
103         // TODO Auto-generated method stub
104         super.dispose();
105     }
106 
107 }

运行结果:

  

展示了三种情况,当然,这里只是进行简单的测试,可以任意绘制多边形进行检测。

posted @ 2014-09-23 12:54  丛林小阁楼  阅读(1569)  评论(0编辑  收藏  举报