当前位置: 首页 > 编程日记 > 正文

【Android游戏开发二十五】在Android上的使用《贝赛尔曲线》!

首先对于《赛贝尔曲线》不是很了解的童鞋,请自觉白度百科、google等等...

为了方便偷懒的童鞋,这里给个《贝赛尔曲线》百科地址,以及一段话简述《贝赛尔曲线》:

《贝赛尔曲线》白度百科快速地址:http://baike.baidu.com/view/4019466.htm

贝塞尔曲线又称贝兹曲线或贝济埃曲线,一般的矢量图形软件通过它来精确画出曲线,贝兹曲线由线段与节点组成,节点是可拖动的支点,线段像可伸缩的皮筋;


上面这一段话其实就“线段像可伸缩的皮筋”这一句比较重要,也很容易理解;

至于贝赛尔曲线的实现,在Android中极其的简单,因为它是Android封装的一个方法,这个能不简单么。。。。。。只不过它隐藏的比较深,它隐藏于Path类中,方法如下:

android.graphics.Path.quadTo(float x1, float y1, float x2, float y2)

Since: API Level 1

此方参数解释:

第一个参数:操作点的x坐标

第二个参数:操作点的y坐标

第三个参数:结束点的x坐标

第四个参数:结束点的y坐标

从API中看出,赛贝尔曲线从API-1就开始支持了;

熟悉方法后,下面就来实现:

SurfaceView框架不多讲,看过我博客的都应该知道的;

直接看MySurfaceView类,此类继承SurfaceView ,是游戏的主视图

这里为了更清晰的讲解:这里部分代码先不贴出来了,最后会整体贴出,当然源码也是免费在最后提供~

首先是定义相关的成员变量:

// 贝赛尔曲线成员变量(起始点,控制(操作点),终止点,3点坐标)   
private int startX, startY, controlX, controlY, endX, endY;  
// Path   
private Path path;  
// 为了不影响主画笔,这里绘制贝赛尔曲线单独用一个新画笔   
private Paint paintQ;  
// 随机库(让贝赛尔曲线更明显)   
private Random random;

本类构造函数:

/** * SurfaceView初始化函数 */  
public MySurfaceView(Context context) {  super(context);  ...  //贝赛尔曲线相关初始化   path = new Path();  paintQ = new Paint();  paintQ.setAntiAlias(true);  paintQ.setStyle(Style.STROKE);  paintQ.setStrokeWidth(5);  paintQ.setColor(Color.WHITE);  random = new Random();  ...  
}

接着我把绘制贝赛尔曲线封装一个方法了,函数如下:

/** * 绘制贝赛尔曲线 *  * @param canvas 主画布 */  
public void drawQpath(Canvas canvas) {  path.reset();// 重置path   // 贝赛尔曲线的起始点   
    path.moveTo(startX, startY);  // 设置贝赛尔曲线的操作点以及终止点   
    path.quadTo(controlX, controlY, endX, endY);  // 绘制贝赛尔曲线(Path)   
    canvas.drawPath(path, paintQ);  
}

最后是用户触屏监听函数以及逻辑函数:

/** * 触屏事件监听 */  
@Override  
public boolean onTouchEvent(MotionEvent event) {  endX = (int) event.getX();  endY = (int) event.getY();  return true;  
}  
/** * 游戏逻辑 */  
private void logic() {  if (endX != 0 && endY != 0) {  // 设置操作点为线段x/y的一半   controlX = random.nextInt((endX - startX) / 2);  controlY = random.nextInt((endY - startY) / 2);  }  
}

整个代码很easy~主要是贝赛尔函数的参数,尤其是操作点,操作点的各种不同可以实现不同的效果,这里我简单的统一的讲操作点设置成用户触屏点的x,y的一半,呵呵偷懒了~嘻嘻~

我把贝赛尔的操作点写在了逻辑logic()函数中,不断的执行,并且每次利用nextInt函数得到随机的操作点,主要为了让其曲线不断的变化从而形成一个震动的曲线运动轨迹;

ok,效果接图如下:

7211253_1308539636h8pY7211253_1308539636h8pY

本章源码下载地址: http://www.himigame.com/android-game/386.html

转载于:https://www.cnblogs.com/Ymete/archive/2013/01/23/2873537.html

相关文章:

Spring Boot 工程集成全局唯一ID生成器 Vesta

2019独角兽企业重金招聘Python工程师标准>>> 本文内容脑图如下: 文章共 760字,阅读大约需要 2分钟 ! 概 述 在前一篇文章 《Spring Boot工程集成全局唯一ID生成器 UidGenerator》 中给大家推荐了一款由百度开发的基于 Snowflake算…

vs2008中,创建基于对话框的mfc动态库步骤

1、利用MFC Dll向导初始生成一个mfc dll(默认设置); 2、添加一个对话框资源; 3、向工程中添加一个.h、.cpp文件,作为外部的接口; 4、.h头文件的格式仿照于基于控制台的dll的头文件格式; 5、.h头文件中包括资源文件头文…

poj3468 A Simple Problem with Integers

http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id14607 题意:题目给你n个数,m个操作,接下来一行给你这n个数,接下的几行给出m个操作,Q a b 表示查询区间[a,b]里的数和和。U a b c 表示把区间[a,b]里的数都加上c…

【Luogu】P1613 跑路

【Luogu】P1613 跑路 一、题目 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零。可是小A偏偏又有赖床的坏毛病。于是为了保住自己的工资,小A买了一个十分牛B的空间…

matlab图形用户界面设计简介

1、File->New->GUI->Create New GUI->Blank GUI->OK即可打开图形用户界面开发环境。 在里面可以拖放需要的控件,包括pushbutton、slider、radiobutton、togglebutton、checkbox、listbox、popupmenu、edit text、static text、table、axes、panel、…

旷视发布《人工智能应用准则》,倡导AI技术健康可持续发展

2019年7月8日,旷视宣布推出基于企业自身管理标准的《人工智能应用准则》(以下简称《准则》),旨在从人工智能企业自身的角度,规范、引导人工智能技术正确运用和健康发展,并确保其安全可控可靠,促…

Java知识积累——String引用的判断问题

看如下程序 1 public static void main(String[] args) {2 String a new String("abc");3 String b new String("abc");4 System.out.println(a b); 5 6 String c "abc";7 String d "abc";8 …

windows7下vs2008常见错误解决方法汇总

1、fatal error LNK1000:Internal error during IncrBuildImage 解决方法:选中对应工程-->点击右键,选择Properties-->Configuration Properties-->Linker-->General-->选中Enable Incremental Linking:改为No(/INCREMENTAL:NO),原始选项…

5G对AIoT的作用并无夸大,最大价值在于融合

采访嘉宾 | 崔宝秋、高恩重整理 | 夕颜出品 | AI科技大本营(ID:rgznai100)近年来,AIoT 的概念非常火爆,有不少企业将 AIoT 提升到公司的战略发展高度,然而实际上,走进普通人日常生活并真正实用的 AIoT 产品…

[USACO07JAN]平衡的阵容Balanced Lineup BZOJ 1699

题目背景 题目描述&#xff1a; 每天,农夫 John 的N(1 < N < 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连续的牛来进行比赛. 但是为了避免水平悬殊,牛的身高不应该相差太大. John 准备了Q (1 < Q < 18…

深度学习目标检测法进化史,看这一篇就够了

作者 | 黄浴&#xff0c;奇点汽车美研中心首席科学家兼总裁来源 | 转载自知乎专栏自动驾驶的挑战和发展本文将介绍自动驾驶中的深度学习目标检测的基本概念和方法&#xff0c;并对几个主要 Anchor free 方法进行了比较&#xff0c;希望对读者有所帮助&#xff0c;以下为正文&am…

Bridge Pattern

2019独角兽企业重金招聘Python工程师标准>>> http://www.cnblogs.com/hegezhou_hot/archive/2010/12/10/1902185.html 桥接模式的主要目的是将一个对象的变化因素抽象出来&#xff0c;不是通过类继承的方式来满足这个因素的变化&#xff0c;而是通过对象组合的方式来…

matlab神经网络工具箱函数汇总

转自&#xff1a;http://hi.baidu.com/lingyin55/blog/item/7a968ead11fe180c4b36d61e.html 1. 网络创建函数 newp 创建感知器网络 newlind 设计一线性层 newlin 创建一线性层 newff 创建一前馈BP网络 newcf 创建一多层前馈BP网络 newfftd 创建一前馈输入延迟BP网…

[每日短篇] 17 - 正确使用随机数 Random

2019独角兽企业重金招聘Python工程师标准>>> 随机数在系统开发中几乎是不可避免的一个需求&#xff0c;在大多数面试宝典一定会告诉你所谓的随机数其实是“伪”随机数&#xff0c;除此之外也就没有什么别的了。实际上这条知识本身已经是非常落后了&#xff0c;更不用…

LoadRunner的参数化功能分享

LoadRunner的参数化功能分享http://automationqa.com/forum.php?modviewthread&tid1598&fromuid2

MFC菜单的使用

1、 创建弹出菜单&#xff1a; (1)、利用向导&#xff0c;创建一个基于单文档的应用程序&#xff1b; (2)、在资源视图中选中”menu”&#xff0c;鼠标右键插入一新菜单IDR_POPMENU&#xff1b; (3)、在IDR_POPMENU菜单中添加”弹出菜单”选项&#xff0c;在”弹出菜单”下…

超阿里、大华,澎思科技行人再识别(ReID)技术刷新三大数据集记录

整理 | Jane出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导读】不久前&#xff0c;江苏省某市公安通过 AI 技术分析监控摄像头中的信息&#xff0c;抓获了一个偷盗电动车的嫌疑人员。监控摄像头在现场拍到的是嫌疑人背对摄像头的情况&#xff0c;未有…

[转] vuewebpack多页面配置

前言 最近由于项目需求&#xff0c;选择使用vue框架&#xff0c;webpack打包直接使用的vue-cli&#xff0c;因为需要多页面而vue-cli只有单页面&#xff0c;所以就决定修改vue-cli的配置文件来满足开发需求。 html-webpack-plugin 实现需求需要用到这个插件&#xff0c; 具体信…

微信扫描二维码登入实现,网页端

2019独角兽企业重金招聘Python工程师标准>>> 服务器端要做得事很多&#xff0c;虽然逻辑不是很复杂&#xff0c;但是我们必须要分析清楚我们要做哪些事&#xff0c;请看下图&#xff1a; 通过这张图&#xff0c;我们看出&#xff0c;服务器端的接口一共有6个&#…

微软洪小文:AI将成为人类未来最好的左脑

演讲嘉宾 | 洪小文整理 | 夕颜出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;导读&#xff1a;2019 年 6 月 14 日&#xff0c;由清华大学五道口金融学院、清华大学国家金融研究院、清华大学研究生会联合主办的“未来已来—全球领袖论天下”系列讲座再次开讲。应清华…

计算机视觉相关网站

转自&#xff1a;http://blog.sciencenet.cn/home.php?modspace&uid454498&doblog&id377338 1、OpenCV中文网站 http://www.opencv.org.cn/index.php/%E9%A6%96%E9%A1%B5 2、Advanced Digital Imaging Solutions Laboratory (ADISL) Image Apprentice is a C/C ba…

预告 · Flutter Live 2018 全球同步直播

Flutter Live 2018 是 Google 在伦敦线下举办&#xff0c;并面向全球线上直播的一次 Flutter 庆祝活动。在 2018 年已经过去的这段时间里&#xff0c;Flutter 有着非常大的进展&#xff1a; 2 月底在世界移动大会 (MWC) 上宣布了第一个 Beta 版发布;5 月的 Google I/O 大会上发…

context-param与init-param的区别与作用

<context-param>与<init-param>的区别与作用 spring2009-11-04 16:49阅读39 评论0字号&#xff1a;大 中 小<context-param>的作用:web.xml的配置中<context-param>配置作用1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件web.xml.读两个…

C#中object的使用

转自&#xff1a;http://www.hackvip.com/article/sort0129/sort0143/Hackvip_233655.html C#中system.object的函数方法功能介绍 在C#中&#xff0c;Object类型是所有类型的根&#xff0c;大家平常开发中都要跟它打交道&#xff0c;但不见得对它里面的每个方法都知根知底&am…

百炼智百炼智能获5000万元Pre-A轮融资,深耕智能获客赛道

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;2019年7月9日&#xff0c;百炼智能正式宣布完成5000万元Pre-A轮融资。该轮融资由东方嘉富领投&#xff0c;上市公司任子行、元投资本和酷我音乐创始人雷鸣等投资者跟投。百炼智能利用自有核心自然语言处理、图像识别和…

阿里巴巴连任 Java 全球管理组织席位

百度智能云 云生态狂欢季 热门云产品1折起>>> 11 月 23 日&#xff0c;阿里巴巴宣布连任 Java 全球管理组织 JCP 最高执行委员会委员&#xff0c;任期从 2018 年 12 月 4 号开始&#xff0c;为期两年。阿里表示&#xff0c;这意味将有更多中国开发者的声音被引入 Ja…

Django ModelForm操作及验证

一、内容回顾 Model- 数据库操作- 验证class A(MOdel): user email pwd Form - class LoginForm(Form): email fields.EmailField() user pwd - is_valid -> 每一个字段进行正则(字段内置正则)clean_字段 -> clean(__all__) -> _post_clean - cleand_data - err…

matlab外部接口简介

1、MATLAB外部接口主要包括3部分内容&#xff1a; (1)、MEX文件&#xff1a;外部程序调用接口&#xff1b; MEX文件是MATLAB解释器可以自动加载和运行的动态链接过程&#xff0c;MATLAB可以像调用内部函数一样调用它们。用户通过MEX文件可以完成以下功能&#xff1a; 可以在…

IE调试网页之一:F12 开发人员工具简介

F12 开发人员工具是可帮助生成和调试网页的一套工具。 编写出色的网页需要编码知识以及适当的工具来发现和调试难免会出现的问题。Windows Internet Explorer 9 提供所呈现代码的视图&#xff0c;F12 工具提供 Internet Explorer 9 如何在代码级别上解释这些页面的视图。F12 工…

100万奖金池,这不仅仅是场比赛

这&#xff0c;不仅仅是场比赛&#xff0c;更是对最前沿领域的共同探索2019 E起AI&#xff01;2019年度的大赛&#xff0c;由香港科大商学院和香港科大商学院内地办事处主办&#xff0c;由香港科大EMBA校友企业安讯科技冠名&#xff0c;将围绕人工智能领域的创新及运用展开赛事…