电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java實(shí)現(xiàn)簡(jiǎn)單碰撞檢測(cè)

瀏覽:25日期:2022-08-10 13:02:49

本文實(shí)例為大家分享了Java實(shí)現(xiàn)簡(jiǎn)單碰撞檢測(cè)的具體代碼,供大家參考,具體內(nèi)容如下

在進(jìn)行Java游戲開發(fā)時(shí),我們經(jīng)常會(huì)遇到碰撞檢測(cè)的問(wèn)題。如坦克大戰(zhàn)中,炮彈與坦克相遇發(fā)生爆炸;守衛(wèi)者游戲中,守衛(wèi)者發(fā)射的箭與怪物相遇使怪物失血;打飛機(jī)游戲中,飛機(jī)發(fā)送的子彈與敵機(jī)相遇干掉敵機(jī)。這些都需要實(shí)現(xiàn)碰撞檢測(cè)。

我們先來(lái)看一類比較簡(jiǎn)單的碰撞檢測(cè):規(guī)則圖形的碰撞檢測(cè)。

矩形碰撞檢測(cè)

作為一個(gè)練手的小游戲,游戲中的物體形狀一般為矩形區(qū)域,這是規(guī)則圖形。它的碰撞檢測(cè)可以通過(guò)Java API中的Rectangle類來(lái)實(shí)現(xiàn)碰撞的檢測(cè)。

Rectangle指的是一個(gè)矩形區(qū)域,它通過(guò)指定左上角位置x和y,以及矩形寬度和高度來(lái)確定范圍大小。所以經(jīng)常使用的 Rectangle類構(gòu)造方法有:

// 構(gòu)造一個(gè)新的 Rectangle,其左上角的坐標(biāo)為 (0,0),其寬度和高度由同名的參數(shù)指定。public Rectangle(int width, int height)// 構(gòu)造一個(gè)新的 Rectangle,其左上角被指定為 (x,y),其寬度和高度由同名的參數(shù)指定。public Rectangle(int x, int y, int width, int height)

和碰撞檢測(cè)相關(guān)的方法:

// 計(jì)算此 Rectangle 與指定 Rectangle 的交集public Rectangle intersection(Rectangle r)// 確定此 Rectangle 是否與指定的 Rectangle 相交public boolean intersects(Rectangle r)

如果兩個(gè)Rectangle對(duì)象有交集,那么他們就有碰撞了。如:

Java實(shí)現(xiàn)簡(jiǎn)單碰撞檢測(cè)

這種方法適用于地圖中的物體近似為矩形或者雖然不是矩形,但是碰撞精度要求不高的情況下的碰撞檢測(cè)。每個(gè)物體記錄一個(gè)能夠?qū)⒆约嚎蜃〉淖钚【匦蔚淖笊辖亲鴺?biāo)和矩形長(zhǎng)寬。

采用此種方法進(jìn)行碰撞檢測(cè)需要注意,對(duì)于圖片的實(shí)現(xiàn)處理應(yīng)該盡量的去掉圖標(biāo)邊角的空白,不然實(shí)際效果可以產(chǎn)生肉眼可辨的誤差。也就是說(shuō)Rectangle盡量的包住圖形且Rectangle的區(qū)域盡量小。

示例:

import java.awt.Graphics;import java.awt.Image;import java.awt.MediaTracker;import java.awt.Point;import java.awt.Rectangle;import java.awt.Toolkit;import java.awt.image.CropImageFilter;import java.awt.image.FilteredImageSource;import java.awt.image.ImageFilter;import java.awt.image.ImageProducer;import javax.swing.JFrame;import javax.swing.JOptionPane;/** * 碰撞檢測(cè)測(cè)試,判斷兩個(gè)同方向移動(dòng)的坦克是否會(huì)發(fā)生碰撞 * * @author 小明 * */public class Intersection extends JFrame implements Runnable { private static final long serialVersionUID = 156638225301569550L; private MediaTracker mediaTracker; // 媒體追蹤器 private Image[][] images = new Image[2][4]; // 放置所有切割的圖像 private Image[] moveTanks = new Image[2]; // 放置界面移動(dòng)的兩輛坦克 private Point[] points = new Point[2]; // 兩輛坦克坐標(biāo) public Intersection() {setTitle('碰撞檢測(cè)');setSize(200, 600);setLocationRelativeTo(null);setDefaultCloseOperation(EXIT_ON_CLOSE);cutImage(); // 切割圖形/** * 將切割的圖形添加到媒體追蹤器中跟蹤 */mediaTracker = new MediaTracker(this);for (int i = 0, length = images.length; i < length; i++) { for (int j = 0, len = images[i].length; j < len; j++) {mediaTracker.addImage(images[i][j], i * len + j); }}// 等待所有圖像加載完畢try { mediaTracker.waitForAll();} catch (InterruptedException e) { e.printStackTrace();}// 初始化兩輛坦克在窗體中坐標(biāo)moveTanks[0] = createImage(images[0][0].getSource());moveTanks[1] = createImage(images[0][0].getSource());points[0] = new Point(80, 200);points[1] = new Point(80, 100);setVisible(true); } /** * 圖像分割 */ private void cutImage() {// 獲取源圖像Image img = Toolkit.getDefaultToolkit().getImage('images/boss.gif');// 循環(huán)分割圖像for (int i = 0, length = images.length; i < length; i++) { for (int j = 0, len = images[i].length; j < len; j++) {ImageFilter filter = new CropImageFilter(0, 0, 50, 50);ImageProducer producer = new FilteredImageSource(img.getSource(), filter);images[i][j] = createImage(producer); // 將分割后圖像放入數(shù)組中保存 }} } @Override public void paint(Graphics g) {Image img = createImage(this.getWidth(), this.getHeight());Graphics graphics = img.getGraphics();// 將兩輛坦克在窗體中繪制出來(lái)for (int i = 0, len = moveTanks.length; i < len; i++) { graphics.drawImage(moveTanks[i], points[i].x, points[i].y, this);}g.drawImage(img, 0, 0, this);g.dispose(); } @Override public void run() {while (true) { // 每次第二輛坦克移動(dòng)距離比第一輛坦克大,即第二輛移動(dòng)更快一些 points[0].y += 30; points[1].y += 45; // 重繪 repaint(); /* 碰撞檢測(cè) */ // 第一輛坦克的矩形范圍 Rectangle tank1 = new Rectangle(points[0].x, points[0].y, moveTanks[0].getWidth(null), moveTanks[0].getHeight(null)); // 第二輛坦克的矩形范圍 Rectangle tank2 = new Rectangle(points[1].x, points[1].y, moveTanks[1].getWidth(null), moveTanks[1].getHeight(null)); // 判斷兩個(gè)矩形是否有交集,有則說(shuō)明碰撞了 if (tank1.intersects(tank2)) {JOptionPane.showMessageDialog(null, '碰到了', '提示',JOptionPane.INFORMATION_MESSAGE);break; } try {Thread.sleep(1000); } catch (InterruptedException e) {e.printStackTrace(); }} } public static void main(String[] args) {new Thread(new Intersection()).start(); }}

當(dāng)同方向移動(dòng)時(shí),兩坦克發(fā)生碰撞,結(jié)果:

Java實(shí)現(xiàn)簡(jiǎn)單碰撞檢測(cè)

圓形碰撞檢測(cè)

圓形檢測(cè)與矩形檢測(cè)方法類似,區(qū)別在于用一個(gè)能夠包含物體的圓代替了矩形。主要是考慮到游戲中的物體外形以平滑為主,例如人物角色。而判斷兩個(gè)圓是否碰撞的計(jì)算也很簡(jiǎn)單,就是判斷兩個(gè)圓心之間的距離是否小于兩個(gè)圓的半徑之和。

示例:

import java.awt.Graphics;import javax.swing.JFrame;import javax.swing.JOptionPane;/** * 碰撞檢測(cè)測(cè)試,判斷兩個(gè)圓是否會(huì)發(fā)生碰撞 * * @author 小明 * */public class Intersection2 extends JFrame implements Runnable { /* 定義兩圓左上角坐標(biāo)、半徑 */ private int x1 = 15, y1 = 45; private int x2 = 35, y2 = 70; private int r1 = 16, r2 = 18; public Intersection2() {setTitle('碰撞檢測(cè)');setSize(200, 600);setLocationRelativeTo(null);setDefaultCloseOperation(EXIT_ON_CLOSE);setVisible(true); } @Override public void paint(Graphics g) {/* 畫圓 */g.drawOval(x1, y1, 2 * r1, 2 * r1);g.drawOval(x2, y2, 2 * r2, 2 * r2); } @Override public void run() {/* 判斷兩圓是否相交 */// 兩圓中心坐標(biāo)int centerX1 = x1 + r1, centerY1 = y1 + r1;int centerX2 = x2 + r2, centerY2 = y2 + r2;// 求兩圓的圓心距double length = Math.sqrt(Math.pow(centerX1 - centerX2, 2)+ Math.pow(centerY1 - centerY2, 2));// 判斷圓心距與兩圓半徑和的關(guān)系if (length < (r1 + r2)) { JOptionPane.showMessageDialog(null, '圓心距:' + length + ',碰撞了');} else { JOptionPane.showMessageDialog(null, '圓心距:' + length + ',未碰撞');} } public static void main(String[] args) {new Thread(new Intersection2()).start(); }}

運(yùn)行結(jié)果:

Java實(shí)現(xiàn)簡(jiǎn)單碰撞檢測(cè)

將第一個(gè)圓半徑改為18,則:

Java實(shí)現(xiàn)簡(jiǎn)單碰撞檢測(cè)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 自动气象站_气象站监测设备_全自动气象站设备_雨量监测站-山东风途物联网 | 苏州同创电子有限公司 - 四探针测试仪源头厂家 | 智能垃圾箱|垃圾房|垃圾分类亭|垃圾分类箱专业生产厂家定做-宿迁市传宇环保设备有限公司 | 仓储货架_南京货架_钢制托盘_仓储笼_隔离网_环球零件盒_诺力液压车_货架-南京一品仓储设备制造公司 | 篷房[仓储-婚庆-展览-活动]生产厂家-江苏正德装配式帐篷有限公司 | 照相馆预约系统,微信公众号摄影门店系统,影楼管理软件-盟百网络 | 反渗透水处理设备|工业零排放|水厂设备|软化水设备|海南净水设备--海南水处理设备厂家 | 扬子叉车厂家_升降平台_电动搬运车|堆高车-扬子仓储叉车官网 | 电镀标牌_电铸标牌_金属标贴_不锈钢标牌厂家_深圳市宝利丰精密科技有限公司 | LCD3D打印机|教育|桌面|光固化|FDM3D打印机|3D打印设备-广州造维科技有限公司 | 黑田精工电磁阀-CAMMOZI气缸-ROSS电磁-上海茂硕机械设备有限公司 | 机器视觉检测系统-视觉检测系统-机器视觉系统-ccd检测系统-视觉控制器-视控一体机 -海克易邦 | 水平垂直燃烧试验仪-灼热丝试验仪-漏电起痕试验仪-针焰试验仪-塑料材料燃烧检测设备-IP防水试验机 | 金属回收_废铜废铁回收_边角料回收_废不锈钢回收_废旧电缆线回收-广东益夫金属回收公司 | 科普仪器菏泽市教育教学仪器总厂 | SMC-ASCO-CKD气缸-FESTO-MAC电磁阀-上海天筹自动化设备官网 | H型钢切割机,相贯线切割机,数控钻床,数控平面钻,钢结构设备,槽钢切割机,角钢切割机,翻转机,拼焊矫一体机 | 干粉砂浆设备-干粉砂浆生产线-干混-石膏-保温砂浆设备生产线-腻子粉设备厂家-国恒机械 | 高速混合机_锂电混合机_VC高效混合机-无锡鑫海干燥粉体设备有限公司 | 铝镁锰板厂家_进口钛锌板_铝镁锰波浪板_铝镁锰墙面板_铝镁锰屋面-杭州军晟金属建筑材料 | 仿清水混凝土_清水混凝土装修_施工_修饰_保护剂_修补_清水混凝土修复-德州忠岭建筑装饰工程 | T恤衫定做,企业文化衫制作订做,广告T恤POLO衫定制厂家[源头工厂]-【汉诚T恤定制网】 | pos机办理,智能/扫码/二维码/微信支付宝pos机-北京万汇通宝商贸有限公司 | 全钢实验台,实验室工作台厂家-无锡市辰之航装饰材料有限公司 | 基本型顶空进样器-全自动热脱附解吸仪价格-AutoHS全模式-成都科林分析技术有限公司 | 环境模拟实验室_液体-气体控温机_气体控温箱_无锡双润冷却科技有限公司 | 金属波纹补偿器厂家_不锈钢膨胀节价格_非金属伸缩节定制-庆达补偿器 | 能量回馈_制动单元_电梯节能_能耗制动_深圳市合兴加能科技有限公司 | 山东钢衬塑罐_管道_反应釜厂家-淄博富邦滚塑防腐设备科技有限公司 | 吲哚菁绿衍生物-酶底物法大肠菌群检测试剂-北京和信同通科技发展有限公司 | 纸箱抗压机,拉力机,脂肪测定仪,定氮仪-山东德瑞克仪器有限公司 | 锥形螺带干燥机(新型耙式干燥机)百科-常州丰能干燥工程 | 呼末二氧化碳|ETCO2模块采样管_气体干燥管_气体过滤器-湖南纳雄医疗器械有限公司 | 防爆电机-高压防爆电机-ybx4电动机厂家-河南省南洋防爆电机有限公司 | RS系列电阻器,RK_RJ启动调整电阻器,RQ_RZ电阻器-上海永上电器有限公司 | 医养体检包_公卫随访箱_慢病随访包_家签随访包_随访一体机-济南易享医疗科技有限公司 | 高低温万能试验机_拉力试验机_拉伸试验机-馥勒仪器科技(上海)有限公司 | PC构件-PC预制构件-构件设计-建筑预制构件-PC构件厂-锦萧新材料科技(浙江)股份有限公司 | 咖啡加盟,咖啡店加盟连锁品牌-卡小逗| 水稻烘干机,小麦烘干机,大豆烘干机,玉米烘干机,粮食烘干机_巩义市锦华粮食烘干机械制造有限公司 水环真空泵厂家,2bv真空泵,2be真空泵-淄博真空设备厂 | 披萨石_披萨盘_电器家电隔热绵加工定制_佛山市南海区西樵南方综合保温材料厂 |