• 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 }

    运行结果:

      

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

  • 相关阅读:
    ASP.NET 点击前台服务器按钮后, 刷新. 重新执行 按钮事件
    动态绑定数据日历jquery
    前端及移动端学习 笔记 -待更新
    jq 兼容性 ie7,ie8
    jQuery中的$(window).load()与$(document).ready()
    SqlServer中循环和条件语句示例!
    调用一般处理程序 提供接口api
    background-position: -24px 0px
    中奖名单滚动
    在此上下文中不允许使用子查询
  • 原文地址:https://www.cnblogs.com/MiniHouse/p/3988108.html
Copyright © 2020-2023  润新知