libgdx学习记录12——圆角矩形CircleRect

libgdx提供了ShapeRenderer这个工具,用它可以画点、画线、画圆、画矩形、画椭圆、画扇形,但是没有提供画圆角矩形的方法。

刚开始自己尝试分成8端,4端画直线,4端画扇形,发现多了半径几部分,于是又改成全部画线。

4端弧采用逐个描点实现。

具体代码:


 1 package com.fxb.newtest;
2
3 import com.badlogic.gdx.ApplicationAdapter;
4 import com.badlogic.gdx.Gdx;
5 import com.badlogic.gdx.graphics.Color;
6 import com.badlogic.gdx.graphics.GL10;
7 import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
8 import com.badlogic.gdx.graphics.glutils.ShapeRenderer.ShapeType;
9
10 public class Lib011_CicleRect extends ApplicationAdapter{
11
12 ShapeRenderer rend;
13
14 @Override
15 public void create() {
16 // TODO Auto-generated method stub
17 rend = new ShapeRenderer();
18 }
19
20 public void DrawCircleRect( float x, float y, float width, float height, float radius, ShapeRenderer rend, Color color ){
21 rend.setColor( color );
22 rend.begin(ShapeType.Line);
23
24 //rend.rect( x, y, width, height );
25 rend.line( x+radius, y, x+width-radius, y );
26 rend.line( x+radius, y+height, x+width-radius, y+height );
27 rend.line( x, y+radius, x, y+height-radius );
28 rend.line( x+width, y+radius, x+width, y+height-radius );
29 /*
30 rend.arc( x+width-radius, y+height-radius, radius, 0, 90 );
31 rend.arc( x+radius, y+height-radius, radius, 90, 90 );
32 rend.arc( x+radius, y+radius, radius, 180, 90 );
33 rend.arc( x+width-radius, y+radius, radius, 270, 90 );
34 */
35
36 int segments = (int)( 6*(float)Math.cbrt( radius ) );
37
38 for( int i=0; i<segments; i++ ){
39 float x0 = x+width-radius;
40 float y0 = y+height-radius;
41 //float angle1 = (float)Math.PI*i*9f/180f;
42 //float angle2 = (float)Math.PI*(i+1)*9f/180f;
43 float angle1 = (float)Math.PI*i/(2*segments);
44 float angle2 = (float)Math.PI*(i+1)/(2*segments);
45 rend.line( x0+radius*(float)Math.cos(angle1), y0+radius*(float)Math.sin(angle1), x0+radius*(float)Math.cos(angle2), y0+radius*(float)Math.sin(angle2) );
46 }
47
48 for( int i=0; i<segments; i++ ){
49 float x0 = x+radius;
50 float y0 = y+height-radius;
51 float angle1 = (float)Math.PI*(i+segments)/(2*segments);
52 float angle2 = (float)Math.PI*(i+segments+1)/(2*segments);
53 rend.line( x0+radius*(float)Math.cos(angle1), y0+radius*(float)Math.sin(angle1), x0+radius*(float)Math.cos(angle2), y0+radius*(float)Math.sin(angle2) );
54 }
55
56 for( int i=0; i<segments; i++ ){
57 float x0 = x+radius;
58 float y0 = y+radius;
59 float angle1 = (float)Math.PI*(i+segments*2)/(2*segments);
60 float angle2 = (float)Math.PI*(i+segments*2+1)/(2*segments);
61 rend.line( x0+radius*(float)Math.cos(angle1), y0+radius*(float)Math.sin(angle1), x0+radius*(float)Math.cos(angle2), y0+radius*(float)Math.sin(angle2) );
62 }
63 for( int i=0; i<segments; i++ ){
64 float x0 = x+width-radius;
65 float y0 = y+radius;
66 float angle1 = (float)Math.PI*(i+segments*3)/(2*segments);
67 float angle2 = (float)Math.PI*(i+segments*3+1)/(2*segments);
68 rend.line( x0+radius*(float)Math.cos(angle1), y0+radius*(float)Math.sin(angle1), x0+radius*(float)Math.cos(angle2), y0+radius*(float)Math.sin(angle2) );
69 }
70
71 rend.end();
72 }
73
74 @Override
75 public void render() {
76 // TODO Auto-generated method stub
77 Gdx.gl.glClearColor( 0.5f, 0.5f, 0.5f, 1 );
78 Gdx.gl.glClear( GL10.GL_COLOR_BUFFER_BIT );
79
80 DrawCircleRect( 10, 10, 300, 200, 10, rend, Color.RED );
81 DrawCircleRect( 100, 60, 300, 200, 20, rend, Color.BLUE );
82 DrawCircleRect( 200, 110, 300, 200, 30, rend, Color.CYAN );
83 DrawCircleRect( 450, 160, 300, 200, 50, rend, Color.YELLOW );
84 }
85
86 @Override
87 public void dispose() {
88 // TODO Auto-generated method stub
89 rend.dispose();
90 super.dispose();
91 }
92
93 }

运行结果:

4个矩形的圆角半径分别为10,20,30,50像素。

分段数采用源码中的构造方式,

int segments = (int)( 6*(float)Math.cbrt( radius ) );
当然还可以做优化的,以后可以尝试。


时间: 2024-11-07 13:10:28

libgdx学习记录12——圆角矩形CircleRect的相关文章

libgdx学习记录19——图片动态打包PixmapPacker

libgdx中,opengl 1.x要求图片长宽必须为2的整次幂,一般有如下解决方法 1. 将opengl 1.x改为opengl 2.0.(libgdx 1.0版本后不支持1.x,当然不存在这个问题,这里针对的是0.9.9版本) 2. 使用TexturePacker将图片打包好然后作成一张大图添加进来. 第二种方法是常用方法,但是不太灵活,添加.删除某些图片不太方便,改动较大.这里可以考虑使用PixmapPacker将图片进行动态打包. 主要方法: pack(String name, Pixm

libgdx学习记录23——图片移动选择

模拟移动选择图片,采用相机实现. 1 package com.fxb.newtest; 2 3 import com.badlogic.gdx.ApplicationAdapter; 4 import com.badlogic.gdx.Gdx; 5 import com.badlogic.gdx.graphics.Color; 6 import com.badlogic.gdx.graphics.GL10; 7 import com.badlogic.gdx.graphics.Texture;

libgdx学习记录17——照相机Camera

照相机在libgdx中的地位举足轻重,贯穿于整个游戏开发过程的始终.一般我们都通过Stage封装而间接使用Camera,同时我们也可以单独使用Camera以完成背景的移动.元素的放大.旋转等操作. Camera分为PerspectiveCamera(远景照相机)和OrthographicCamera(正交照相机). PerspectiveCamera为正常的照相机,当距离物体越远,则物体越小,一般在3D空间中使用. OrthographicCamera忽略了其Z轴,不管距离物体多远,其大小始终不

libgdx学习记录11——平铺地图TiledMap

地图对于游戏场景十分重要,很多游戏都需要对地图进行编辑,可使用TileMap进行编辑并生成对应的tmx格式地图文件. 编辑好后,可通过TmxMapLoader来读取地图文件.可通过一个正交相机OthographicCamera和正交地图渲染器OrthogonalTiledMapRenderer来进行显示. 实例如下: 1 package com.fxb.newtest; 2 3 import com.badlogic.gdx.ApplicationAdapter; 4 import com.ba

libgdx学习记录16——资源加载器AssetManager

AssetManager用于对游戏中的资源进行加载.当游戏中资源(图片.背景音乐等)较大时,加载时会需要较长时间,可能会阻塞渲染线程,使用AssetManager可以解决此类问题. 主要优点: 1. 大多数资源加载器AssetLoader都是异步加载,可以避免阻塞渲染线程. 2. 通过引用计数来进行释放资源. 3. 通过一个对象来管理所有其他资源. 主要函数: load(path,type)加载某个路径的资源文件,后面type指定所要加载的资源类型.这个函数只是将资源文件加入到资源队列中,并不会

【Android学习笔记】圆角矩形ImageView自定义控件的实现与使用

在做安卓项目的过程中,我们总会遇到需要以圆角矩形控件来显示图标.图片或者按钮的需求,解决办法有两种,一种是在drawable下创建shape布局xml文件,另一种是自定义一个继承于ImageView的自定义控件类来实现,下面是具体的实现办法. 首先我们命名一个XCRoundRectImageView类,并继承于ImageView.代码如下: 1 import android.content.Context; 2 import android.graphics.Bitmap; 3 import a

libgdx学习记录13——矩形CD进度条绘制

利用ShapeRenderer可进行矩形进度条的绘制,多变形的填充等操作. 这是根据角度获取矩形坐标的函数. 1 public Vector2 GetPoint( float x, float y, float w, float h, float angle ){ 2 Vector2 point = new Vector2(); 3 while( angle >= 360 ){ 4 angle -= 360; 5 } 6 while( angle < 0 ){ 7 angle += 360;

《高级软件测试》实践作业3学习记录12月18日

今天我们的主要任务是开始熟悉代码复审的过程与静态代码检查工具.我们选择的系统是客户关系管理系统,此系统具有最基本的添加客户,查询客户与高级搜索的功能,我们选择的是添加客户模块,对此模块的代码展开静态评审,并计划在12月21日进行同行评审会议. 何阳寅同学选择了阿里巴巴Java开发手册作为代码评审标准,让其他同学在课后学习,评审时遵循该标准来评审代码: 杨智超同学亲自编码了该客户管理系统,虽然功能有些简单,但是可以深切体会从编码到测试的过程: 叶瑞同学分配并协调了各组员的任务,实时跟进任务进度并记

libgdx学习记录18——Box2d物理引擎

libgdx封装了Box2D物理引擎,通过这个引擎能够模拟物理现实,使设计出的游戏更具有真实感. libgdx中,Box2d程序的大概过程: 1. 创建物理世界world,并设置重力加速度. 2. 创建正交相机,并设置其宽高.Box2d中使用物理世界中米作为单位,而不是图像中的像素,通常设一个比值,这里为了方便,直接设置为10. 3. 创建世界中的动态物体(一般是方块.圆环或其他形状物体)和静态物体(主要指地面.墙壁等). 4. 在渲染函数中添加world时间布,并利用DebugRenderer