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 @   丛林小阁楼  阅读(1596)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示