2小时开发《点球射门游戏》,动画演示思路(上),代码已开源

news2024/11/25 10:55:36

唠两句

最近被疫情关在家,时间多运动少,真的很无聊呀!也许是天意为之,居然来世界杯了,虽然这届世界杯很「冷」,但是多少还是为无聊的我们增加了一些无聊的趣事,比如勇哥在等世界杯开幕式的过程中,就无聊手写了一个Java版本的【点球射门游戏】,这几天把球瘾过了,今天有点时间,把这个游戏分享给大家,希望大家喜欢!(游戏也有音乐,gif放不了,有点小可惜)

1、请各位老铁收藏、点赞鼓励一波!

2、源码,在评论区扣6,我私服给你!

游戏有那些值得大家学习【重点】

  • 球的瞄准轨迹线怎么实现【见下图1】?这个在QQ桌球、王者荣耀、愤怒的小鸟等游戏中都用到了!

  • 怎么画三维立体的图片【见下图2】?

  • 怎么实现动画【见下图3】?

    图1
    图1
图2

图3

游戏界面实现思路&代码

界面术语定义

界面分为游戏区和计分区,其中游戏区又分为:

  • 观众区

  • 球门区

  • 游戏元素

  • 射门区

观众区绘制思路&代码

观众区用swing纯代码是可以绘制的,绘制的思路如下:

  • 1、绘制一个背景矩形框

  • 2、绘制第2排观众

    • 绘制一个圆和椭圆合并成一个观众样式

    • 绘制一个小一点的圆和椭圆合并成一个观众样式

    • 组合并放置到第2排位置,并铺满整排

  • 3、绘制第1排观众【与上一步一致,注意换观众的颜色】

    • 绘制一个圆和椭圆合并成一个观众样式

    • 绘制一个小一点的圆和椭圆合并成一个观众样式

    • 组合并放置到第1排位置,并铺满整排

  • 4、绘制两个不同颜色的矩形框,并摆放最前面遮挡第1排观众的‘脚’

  • 5、绘制几根黑线,遮挡广告边缘

为方便大家理解,勇哥这次给大家上动画,赞一个吧:

参考实现代码:

// 观众背景
g2d.setColor(personBgColor);
g2d.fillRect(0,y,getWidth(),100);//画矩形
for (int i = 0; i < getWidth(); i+=46) {
    // 观众第二排
    g2d.setColor(person2);
    g2d.fillOval(i,36,16,16);//画圆
    g2d.fillArc(i-7,50,30,50,0,180);// 画扇行
    g2d.fillOval(i+24,40,13,13);
    g2d.fillArc(i+18,51,24,49,0,180);
}
y+=90;
// 观众第一排
g2d.fillRect(0,y-30,getWidth(),50);
g2d.setColor(person1);
for (int i = 0; i < getWidth(); i+=46) {
    g2d.fillOval(i+7,y-41,16,16);
    g2d.fillArc(i,y-25,30,50,0,180);
    g2d.fillOval(i+31,y-34,13,13);
    g2d.fillArc(i+25,y-24,24,49,0,180);
}
// 绘制广告栏和黑线
g2d.setColor(personBgColor1);
g2d.fillRect(0,y,getWidth(),20);
g2d.setColor(personLineColor);
g2d.fillRect(0,y,getWidth(),2);
y+=20;
g2d.setColor(personBgColor2);
g2d.fillRect(0,y,getWidth(),18);
y+=18;
g2d.setColor(personLineColor);
g2d.fillRect(0,y,getWidth(),2);
for (int i = 1; i < 5; i++) {
    g2d.fillRect(getWidth()*i/5,y-38,2,38);
}

草坪绘制思路&代码

草坪区用swing纯代码是可以绘制的,绘制的思路如下:

  • 1、绘制两种不同颜色的矩形

  • 2、用两种不用颜色的矩形铺满整个屏幕

  • 3、调整矩形的高度是从上下一次递增,呈现立体视觉

上动画,赞一个吧:

参考实现代码:

// 足球草地
int count =0;
int h1=60;
for (int i = y; i < getHeight(); i++) {
    if(count%2==0){
        g2d.setColor(bgColor1);
    }else{
        g2d.setColor(bgColor2);
    }
    g2d.fillRect(0,y,getWidth(),h1+count*10);
    y+=h1+count*10;
    count++;
}

禁区三维绘制思路&代码

禁区用swing纯代码是可以绘制的,绘制的思路如下:

  • 1、绘制一个空心的圆角矩形

  • 2、使用变换技术,让圆角矩形具有三维立体效果

  • 3、调整禁区框的位置

  • 4、用一个绿色矩形遮挡多于的禁区部分

上动画,赞一个吧:

参考实现代码:

注意代码实现的时候,需要绘制两个圆角矩形合并,并擦除中间不要的部分,这部分有点难,如果不理解可以留言,我给你弄视频说明。

g2d.setColor(Color.WHITE);
g2d.fillRect(0,175,getWidth(),5);
AffineTransform oldTx = g2d.getTransform();
Stroke stroke = new BasicStroke(5);
g2d.setStroke(stroke);
AffineTransform tx = new AffineTransform();
tx.setToShear(-0.5, 0);
g2d.setTransform(tx);
g2d.drawRoundRect(getWidth()*5/20,175,getWidth()*6/10,120,10,10);
AffineTransform tx2= new AffineTransform();
tx2.setToShear(0.5, 0);
g2d.setTransform(tx2);
g2d.drawRoundRect(getWidth()*3/20,175,getWidth()*6/10,120,10,10);
g2d.setTransform(oldTx);
//清理内部多余的线
g2d.setColor(bgColor1);
g2d.fillRect(0,173,getWidth(),2);
g2d.fillRect(getWidth()*3/20+10,180,getWidth()*7/10-20,20);
g2d.fillRect(getWidth()*3/20+10,270,getWidth()*6/10-20,23);
g2d.setColor(bgColor2);
g2d.fillRect(getWidth()*3/20+10,200,getWidth()*6/10-20,70);

球门球网三维绘制思路&代码

球门球网这个是最难的,难在用平面技术画三维效果,当然swing也是可以的,绘制的思路如下:

  • 1、绘制一个圆角矩形,作为球门框

  • 2、绘制两条弯折折线,作为球门内门柱

  • 3、绘制多条水平的三线段折线,作为球门水平球门线

  • 4、绘制多条垂直的二线段折线,作为球门垂直球门线

这个比较复杂,必须上动画,必须赞一个:

参考实现代码:

g2d.setColor(Color.WHITE);
int step = 15;
int startX = getWidth()*4/20+20;
int centerX = getWidth()/2;
int startY = 85;
// 球网竖线
for (int i = startX; i < (getWidth()*4/5); i=startX) {
    int x[] = {startX,startX+(startX<centerX?+8:-8),startX+(startX<centerX?+12:-12)};
    int y[] = {startY,startY+10,155};
    if((centerX-startX)!=-10) {
        g2d.drawPolyline(x, y, x.length);//画折线
    }
    startX+=step;
}
// 球迷柱左里
Stroke stroke = new BasicStroke(5);
g2d.setStroke(stroke);
startX = getWidth()*4/20+20;
int tempX[] = {startX-18,startX-2,startX-2};
int tempY[] = {startY+3,startY+10,153};
g2d.drawPolyline(tempX, tempY, tempY.length);
startX = getWidth()*4/5;
int rightX[] = {startX-2,startX-20,startX-24};
int rightY[] = {startY+3,startY+10,153};
g2d.drawPolyline(rightX, rightY, rightY.length);
stroke = new BasicStroke(1);
g2d.setStroke(stroke);
startX = getWidth()*4/20;
// 球网横线
int endX = getWidth()*4/5;
for (int i = startY; i < 156; i=startY) {
    int x[] = {startX,startX+(startX<centerX?+18:-18),endX-12,endX};
    int y[] = {startY,startY-3,startY-3,startY};
    g2d.drawPolyline(x,y,x.length);
    startY+=step;
}
int x[] = {startX,startX+(startX<centerX?+18:-18),endX-12,endX};
int y[] = {158,155,155,158};
g2d.drawPolyline(x,y,x.length);
// 绘制门框
g2d.setColor(doorColor);
stroke = new BasicStroke(9);
g2d.setStroke(stroke);
g2d.drawRoundRect(getWidth()*4/20,85,getWidth()*3/5,95,20,20);// 带有圆角的矩形
stroke = new BasicStroke(5);
g2d.setStroke(stroke);
g2d.setColor(Color.WHITE);
g2d.drawRoundRect(getWidth()*4/20,86,getWidth()*3/5,95,20,20);
g2d.fillRect(0,175,getWidth(),5);

蓄力区绘制思路&代码

蓄力区用swing纯代码是可以绘制的,绘制的思路如下:

  • 1、绘制两种不同颜色的扇形

  • 2、叠加两个扇形

  • 3、配上高逼格文字

简单吧,也必上动画,也必须赞一个:

参考实现代码:

// 蓄力区
g2d.setColor(Color.WHITE);
g2d.fillArc((getWidth()-64)/2-80,460,224,160,0,180);
g2d.setColor(Color.ORANGE);
g2d.fillArc((getWidth()-64)/2-80,460,224,160,0,arc);
// 文字
Font font = new Font("阿里巴巴普惠体 Medium",1,24);
g2d.setFont(font);
g2d.setColor(Color.WHITE);
g2d.drawString("Ctrl + 鼠标: 移动球",30,400);
g2d.drawString("拖动鼠标: 调整角度",50,440);
g2d.drawString("点击鼠标: 射门",50,480);

计分区绘制思路&代码

计分区区用swing纯代码是可以绘制的,绘制的思路如下:

  • 1、绘制两种不同颜色的矩形

  • 2、用两种不用颜色的矩形铺满整个屏幕

  • 3、调整矩形的高度是从上下一次递增,呈现立体视觉

上动画,赞一个吧:

参考实现代码:

Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
g.setColor(bgColor1);
g.fillRect(0,0,getWidth(),getHeight());
g.setColor(bgColor2);
g.fillRect(0,8,getWidth(),getHeight()-8);
Font font = new Font("阿里巴巴普惠体 Medium",1,32);
g.setFont(font);
g2d.setColor(Color.BLACK);
g2d.drawString("分数",30,45);
g2d.drawString("TIME",250,45);
g2d.drawString("次数",540,45);
g2d.setColor(textColor);
g2d.fillRoundRect(100,20,80,30,25,25);
g2d.fillRoundRect(335,20,120,30,25,25);
g2d.fillRoundRect(620,20,80,30,25,25);
g2d.setColor(Color.WHITE);
g2d.drawString(String.format("%02d",score),120,47);
g2d.drawString(String.format("%02d:%02d",time/60,time%60),345,47);
g2d.drawString(String.format("%02d",count),638,47);

守门员&球绘制思路&代码

守门员&球绘&石头这里就直接用图片了,绘制的思路如下:

  • 1、加载图片

  • 2、把图片摆放到对应位置

上动画,赞一个吧:

 

参考实现代码:

// 球
public class Ball extends JLabel{

    int startX = 0 ;
    int startY = 0;
    public Ball(){
        this.setPreferredSize(new Dimension(64,64));
        this.setIcon(new ImageIcon(ResourcesUtil.getRootPath()+"\\ball\\football.png"));// 加载图片
    }

}
// 守门员
public Goalkeeper(BackgroundPanel backgroundPanel){
    this.backgroundPanel = backgroundPanel;
    this.setBounds(backgroundPanel.getWidth()/2,100,78,128);
    this.setPreferredSize(new Dimension(78,128));
    this.setIcon(new ImageIcon(ResourcesUtil.getRootPath()+"\\ball\\smy.png"));
}
// 石头
public class Shitou extends JLabel implements Obstacle {
    BackgroundPanel backgroundPanel;
    public Shitou(BackgroundPanel backgroundPanel){
        this.backgroundPanel = backgroundPanel;
        this.setBounds(backgroundPanel.getWidth()/2+50,100,316,100);//设置图片放置的位置
        this.setPreferredSize(new Dimension(316,100));
        this.setIcon(new ImageIcon(ResourcesUtil.getRootPath()+"\\ball\\st.png"));
    }

    @Override
    public String name() {
        return "石头";
    }

    @Override
    public JComponent getComponent() {
        return this;
    }

    public void start(){
    }

    public void stop(){
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/68684.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于影响编码效果的画质调优总结

1、背景&#xff1a; 调试一个新项目&#xff0c;要求视频帧率为20fps、码率1.5m下&#xff0c;和竞品机对比效果。发现动态场景下的效果比竞品机差距比较明显&#xff08;做的是安防类的监控相机&#xff0c;比较关注视频的效果&#xff09;&#xff0c;比如对着运动的车流时…

红队隧道应用篇之Netsh端口转发(一)

简介 netsh是从Windows 2000开始就有的一个用于配置网络设备的命令行工具 其中netsh interface portproxy是一个配置网络代理的命令, 可以配置ipv4或ipv6的端口转发代理以及双向端口转发代理 学习隧道应用前必须了解的知识:https://blog.csdn.net/xf555er/article/details/1…

softmax回归从零开始实现

1. 引入Fashion-MNIST数据集 并设置数据迭代器的批量大小为256 import torch from IPython import display from d2l import torch as d2lbatch_size 256 # 每次随机读256张图片&#xff0c;返回训练集和测试集的迭代器 train_iter, test_iter d2l.load_data_fashion_mnist…

职场日常:测试人员如何快速熟悉新业务?

身处职场&#xff0c;学习新业务在所难免&#xff0c;尤其是测试人员&#xff0c;具备良好的业务知识是我们做好质量保障的前提&#xff0c;不管是职场「新人」还是「老人」&#xff0c;快速熟悉业务的能力都是不可或缺的&#xff0c;这是我们安身立命的根本。 但&#xff0c;…

【第一章 Linux目录结构,网络连接三种模式,vi和vim】

第一章 Linux目录结构&#xff0c;网络连接三种模式&#xff0c;vi和vim 1.Linux和Unix&#xff1a; ①Unix针对于大型&#xff0c;高性能主机或服务器&#xff1b; ②Linux适用于个人计算机。 2.网络连接的三种模式&#xff1a; ①桥接模式&#xff1a;虚拟系统可以和外部系…

[附源码]JAVA毕业设计师生交流平台(系统+LW)

[附源码]JAVA毕业设计师生交流平台&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&…

一起用Go做一个小游戏(上)

引子最近偶然看到一个Go语言库&#xff0c;口号喊出“一个超级简单&#xff08;dead simple&#xff09;的2D游戏引擎”&#xff0c;好奇点开了它的官网。官网上已经有很多可以在线体验的小游戏了&#xff08;利用WASM技术&#xff09;。例如曾经风靡一时的2048&#xff1a;当然…

「Redis数据结构」列表对象(List)

「Redis数据结构」列表对象&#xff08;List&#xff09; 文章目录「Redis数据结构」列表对象&#xff08;List&#xff09;一、概述二、结构三、编码转换四、总结一、概述 Redis列表是简单的字符串列表&#xff0c;按照插入顺序排序。你可以添加一个元素到列表的头部&#xf…

(附源码)php丽江旅游服务网站系统 毕业设计 010149

php丽江旅游服务网站系统 摘 要 21世纪时信息化的时代&#xff0c;几乎任何一个行业都离不开计算机&#xff0c;将计算机运用于旅游服务管理也是十分常见的。过去使用手工的管理方式对旅游服务进行管理&#xff0c;造成了管理繁琐、难以维护等问题&#xff0c;如今使用计算机对…

APP自动化测试系列之Appium介绍及运行原理

在面试APP自动化时&#xff0c;有的面试官可能会问Appium的运行原理&#xff0c;以下介绍Appium运行原理。 一、Appium介绍 1.Appium概念 Appium是一个开源测试自动化框架&#xff0c;可用于原生&#xff0c;混合和移动Web应用程序测试。它使用WebDriver协议驱动IOS&#xf…

易基因|m6A去甲基化酶ALKBH5通过降低PHF20 mRNA甲基化抑制结直肠癌进展 | 肿瘤研究

易基因&#xff5c;m6A去甲基化酶ALKBH5通过降低PHF20 mRNA甲基化抑制结直肠癌进展 | 肿瘤研究 大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 2022年8月17日&#xff0c;北京大学人民医院胃肠外科申占龙教授课题组在《Clin Transl M…

(附源码)ssm物流公司员工管理系统 毕业设计 261625

基于ssm物流公司员工管理系统 摘 要 随着互联网大趋势的到来&#xff0c;社会的方方面面&#xff0c;各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去&#xff0c;而其中最好的方式就是建立网络管理系统&#xff0c;并对其进行信息管理。由于现在网络的发…

LeetCode简单题之按身高排序

题目 给你一个字符串数组 names &#xff0c;和一个由 互不相同 的正整数组成的数组 heights 。两个数组的长度均为 n 。 对于每个下标 i&#xff0c;names[i] 和 heights[i] 表示第 i 个人的名字和身高。 请按身高 降序 顺序返回对应的名字数组 names 。 示例 1&#xff1…

聚观早报 | 奈雪成乐乐茶第一大股东;达达与抖音达成战略合作

今日要闻&#xff1a;奈雪成乐乐茶第一大股东&#xff1b;达达与抖音达成战略合作&#xff1b;B 站启动新一轮降本增效&#xff1b;特斯拉上海工厂减产20%&#xff1b;大众将从中国向欧出口汽车奈雪成乐乐茶第一大股东 12 月 6 日消息&#xff0c;乐乐茶与奈雪的茶签署5.25亿元…

主成分分析-书后习题回顾总结

7-2 题目 理论基础 矩阵的特征值和特征向量的定义以及其求法 https://www.cnblogs.com/Peyton-Li/p/9772281.html 特征值和特征向量的定义&#xff1a;设AAA是nnn阶方阵&#xff0c;如果数λ\lambdaλ和nnn维非零列向量α\alphaα使关系式AαλαA\alpha\lambda\alphaAαλα成…

MyBatis一 Mybatis的介绍、基本使用、高级使用

一 数据库操作框架的历程 1.1 JDBC JDBC(Java Data Base Connection,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写…

【JDBC】----封装工具类和ORM

分享第二十二篇励志语录 有些烦恼是我们凭空虚构的&#xff0c;而我们却把它当成真实去承受。想得太多只会毁了你&#xff0c;让你陷入忐忑&#xff0c;让实际上本不糟糕的事情&#xff0c;变得糟糕。阳光这么好&#xff0c;何必自寻烦恼。 目录 分享第二十二篇励志语录 一&a…

毕业设计 stm32老人跌倒检测预防系统 - 单片机 物联网 嵌入式

文章目录0 前言1 整体设计2 硬件电路3 软件设计4 跌倒检测算法5 关键代码6 最后0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两年不断有学弟学妹告诉…

linux常用命令二

1、find 查找文件或目录 find / -size 204800k //在根目录下查找大于200MB的文件 find / -user username//在根目录下查找所有者为username的文件 find / -name filename.txt //根据名称查找/目录下的filename.txt文件。 2、复制文件包括其子文件到自定目录 cp -r sourceF…

[附源码]JAVA毕业设计水果销售管理网站(系统+LW)

[附源码]JAVA毕业设计水果销售管理网站&#xff08;系统LW&#xff09; 项目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术…