2023年玩兔年小游戏《兔兔保卫萝卜战》赢新年祝福「钱兔无量」

news2024/11/19 0:23:20

PS:粉丝可以免费领源码,私信我或者评论666即可~~~~~~~~

导读 | 世界杯虽已闭幕,但其带给我们的精彩,仿佛就在昨天,想一想,还是有一种爽劲,不知道大家是否也这样?转眼就到了2023年,今年是兔年,于是勇哥又造、造、造了一个小游戏《2023—兔兔保卫萝卜战》。该游戏结合了足球+兔子的元素,使用钩子去抢兔子的胡萝卜,同时抢到的胡萝卜带有吉祥的话,非常有意思。本文先通过代码实现游戏主体界面的绘制实现基础的游戏场景,而后阐述各类常见逻辑的实现方法。想了解Java如何开发游戏?想了解类似愤怒的小鸟中瞄准功能怎么实现?**想了解游戏各种复杂操作逻辑怎么实现?游戏开发中是否所有场景都只能通过加载素材资源实现?读完本文,相信你会有一定的收获,并掌握一定游戏开发实操方法。

PS:钩中胡萝卜还可以赢新年祝福:钱兔无量、谈兔不凡、扬眉吐气、兔然爆富、兔飞猛进、大展宏兔、钱兔似锦

2023——兔兔保卫萝卜战

游戏界面实现思路和代码

界面术语定义

一般小游戏开发步骤是先开发界面,然后在实现界面游戏逻辑控制。游戏界面实现完成后,逻辑控制就直接可以在界面上体现,方便开发调试。本游戏也是按照这个步骤推进。其中界面分为游戏区和计分区,游戏区又分为观众区、守门区、射门区、游戏元素。本款游戏中除了游戏元素使用的是图片素材,其它界面内容全是使用swing实现。

 

观众区绘制思路和代码

观众区界面绘制如下:

1、绘制一个观众区背景矩形框

2、绘制第1排观众(注意这里绘制一对观众,左边的大一点,右边的小一点)

  • 绘制一个圆,作为观众的头

  • 绘制一个大椭圆,作为观众的身躯

  • 绘制两个小椭圆,作为观众兔子的耳朵

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

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

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

上动画,粉丝可以免费领源码,私信我或者评论666即可,赞一个吧:

实现参考代码:

Graphics2D g2d = (Graphics2D)g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
int y = 0;
g2d.setColor(topColor);
g2d.fillRect(0,y,getWidth(),10);
y+=10;
// 观众背景
g2d.setColor(personBgColor);
g2d.fillRect(0,y,getWidth(),100);//画矩形
for (int i = 0; i < getWidth(); i+=46) {
    // 观众第二排
    g2d.setColor(person2);
    g2d.fillOval(i+3,30,4,10);//画圆
    g2d.fillOval(i+9,30,4,10);//画圆
    g2d.fillOval(i,36,16,16);//画圆
    g2d.fillArc(i-7,50,30,50,0,180);// 画扇行

    g2d.fillOval(i+24+2,35,3,7);//画圆
    g2d.fillOval(i+24+7,35,3,7);//画圆
    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+3,y-48,4,10);//画圆
    g2d.fillOval(i+7+9,y-48,4,10);//画圆
    g2d.fillOval(i+7,y-41,16,16);
    g2d.fillArc(i,y-25,30,50,0,180);

    g2d.fillOval(i+31+2,y-40,3,7);//画圆
    g2d.fillOval(i+31+7,y-40,3,7);//画圆
    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、调整矩形的高度是从上下一次递增,呈现立体视觉

上动画,粉丝可以免费领源码,私信我或者评论666即可,赞一个吧:

// 足球草地
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++;
}
 

守门区绘制思路和代码

守门区内放置的是兔子的胡萝卜,为了视觉区分,在胡萝卜区域绘制一个球网背景,绘制的思路如下:

  • 1、绘制一个圆角矩形,作为球门框,并使用一个小矩形遮挡球门多出的部分

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

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

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

上动画,粉丝可以免费领源码,私信我或者评论666即可,赞一个吧:

 

 

参考代码:

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、配上高逼格文字

上动画,粉丝可以免费领源码,私信我或者评论666即可,赞一个吧:

 

 

参考实现代码:

// 射门区
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);
if(starList.isEmpty()) {
    g2d.drawString("Ctrl + 鼠标: 移动钩子", 30, 400);
    g2d.drawString("拖动鼠标: 调整角度", 50, 440);
    g2d.drawString("点击鼠标: 发射钩子", 50, 480);
}else{
	g2d.drawString("你钩中了:"+starList, 50, 400);
}

计分区绘制思路和代码

计分区用于统计你勾中的胡萝卜的分数、时间、次数等信息,绘制思路如下:

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

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

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

上动画,粉丝可以免费领源码,私信我或者评论666即可,赞一个吧:

参考实现代码:

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、把图片摆放到对应位置

上动画,粉丝可以免费领源码,私信我或者评论666即可,赞一个吧:

参考代码:

// 钩子
public class Grab extends JLabel{
    int startX = 0 ;
    int startY = 0;
    public Grab(){
        this.setPreferredSize(new Dimension(64,64));
        this.setIcon(new ImageIcon(ResourcesUtil.getRootPath()+"\\ball\\gou.png"));// 加载图片
    }
}
// 守门兔兔
public Goalkeeper(BackgroundPanel backgroundPanel){
    this.backgroundPanel = backgroundPanel;
    this.setBounds(backgroundPanel.getWidth()/2,100,100,128);
    this.setPreferredSize(new Dimension(100,128));
    this.setIcon(new ImageIcon(ResourcesUtil.getRootPath()+"\\ball\\aa.png"));
}
// 胡萝卜
public class Carrot extends JLabel{
    public static final String[] LABELS = {"钱兔无量","谈兔不凡","扬眉吐气","兔然爆富","兔飞猛进","大展宏兔","钱兔似锦"};
    int startX = 0 ;
    int startY = 0;
    String name;
    Random random = new Random();
    public Carrot(){
        this.setPreferredSize(new Dimension(48,48));
        this.setIcon(new ImageIcon(ResourcesUtil.getRootPath()+"\\ball\\luo.png"));
        name = LABELS[random.nextInt(LABELS.length)];
    }

    @Override
    public String getName() {
        return name;
    }
}

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

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

相关文章

Java框架:Mybatis

文章目录一、Mybatis概述1.1概念1.2优点与缺点1.3MyBatis和Hibernate的区别1.4Mybatis的核心对象1.5Mybatis执行流程三、Mybatis的快速使用3.1开发环境3.2 创建一个maven项目3.3添加Maven依赖3.4MySQL创建user表3.5创建数据源database.properties文件3.6编写mybatis-config.xml…

H13-531云计算HCIE V2.0——1~400常错题和知识点总结

1~100 35、FusionStorage Block无法是被配置RAID的磁盘,一定要将RAID信息删除后, Fusionstrage block才能识别到这些磁盘? 错误 61、Ceilometer监控通过在计算节点部署Compute服务 84.&#xff08;多选&#xff09;在配置 FusionSphere OpenStack 时&#xff0c;可以用来实…

商务BD干多了,做一个无情的微信发消息机器人帮我发消息吧

1. 有没有那种做微信的伙伴&#xff0c;每天需要定点定时发消息&#xff1f; 2. 有没有那种做电商商务的朋友&#xff0c;每天需要发消息提醒达人商务们&#xff1f; 3. 有没有那种需要定时定点打卡&#xff0c;需要提醒自己要干啥的兄弟姐妹&#xff1f;** 那么有没有大冤种去…

如何获取电脑软件图标和app图标

如何获取电脑软件图标和app图标大家在写博客或者作图的时候经常会需要找到电脑软件图标或者app图标&#xff0c;如果从网上找有的图标并不清楚&#xff0c;今天给大家分享下&#xff0c;怎么快速的获取电脑软件图标和app图标&#xff0c;得到的图标也比较清楚。电脑软件图标获取…

【操作系统】操作系统的Buffer和Cache

文章目录1.Buffer和Cache的区别2.磁盘和文件写入操作案例3.磁盘和文件读取操作案例4.Cache和Buffer的命中案例1.Buffer和Cache的区别 &#xff08;1&#xff09;什么是Buffer Buffer指Linux内存的 Buffer cache&#xff08;缓冲区&#xff09;。Buffer为了让不同的速度的设备…

【迅为iMX6Q】开发板 Linux 5.15.71 SD卡 启动

开发环境 win10 64位VMware Workstation Pro 16ubuntu 22.04【迅为imx6q】开发板&#xff0c; 2G DDR linux-imx 下载 使用 NXP 官方提供的 linux-imx&#xff0c;代码地址为&#xff1a; https://github.com/nxp-imx/linux-imx 使用 git 下载 linux-imx&#xff0c; git cl…

Linux应用编程---6.无名管道

Linux应用编程—6.无名管道 6.1 pipe()函数使用详情 ​ 管道是进程之间进行通讯的一种方式。管道有两种&#xff0c;分别是&#xff1a;无名管道和有名管道。先看无名管道。管道创建函数是pipe()&#xff0c;在Linux终端输入man pipe。 图1 pipe()函数详情NAMEpipe, pipe2 - …

Mathorcup数学建模竞赛第六届-【妈妈杯】B题:小区车位分布的优化设计与评价(附一等奖获奖论文、C++和matlab代码)

赛题描述 随着现代社会经济的快速发展,房地产成为国家经济发展中重要的经济增长点之一。而小区内汽车停车位的分布对于小区居民的上下班出行影响很大。请建立数学模型,解决下列问题: 问题1:分析评判小区汽车停车位分布是否合理的几个关键指标,建立评判车位分布合理的数学…

mybatis官方文档之第一个mybatis程序实操

mysql数据库准备工作&#xff1a; 首先&#xff0c;我们需要在mysql数据库中&#xff0c;建立数据库和数据表&#xff1a; //创建数据库 create database my_batis; //创建表 create table students(id int not null,name varchar(30) default null,pwd varchar(30) default …

用移动激光扫描来估计树干直径的分割和树干校准法

Paper题目&#xff1a;Mobile Laser Scanning for Estimating Tree Stem Diameter Using Segmentation and Tree Spine Calibration Abstract 移动激光扫描 (MLS) 可以通过使用自动推导出树干中心位置和树干直径的算法来提高森林清查效率。在这项工作中&#xff0c;我们提出了…

远程控制软件– 向日葵使用教程

新冠疫情的严峻形式下&#xff0c;各地都延期复工&#xff0c;一时间远程办公&#xff0c;在家办公可谓非常火爆。然而&#xff0c;家里毕竟不是公司&#xff0c;很多的资料都在办公室电脑&#xff0c;甚至一些比较专业系统或者专属网络限制无法完成在家办公&#xff0c;这时候…

从加(解)密角度讲栅栏密码

目录普通型栅栏加密原理解密原理W型栅栏加密原理实例解密原理这今天在做新生赛的一道“只有倒着翻过十八层的篱笆才能抵达北欧神话的终点”&#xff0c;研究了很长时间的栅栏原理&#xff0c;flag没出来&#xff0c;而且自己对于普通和W型的加密解密整的有的蒙… 原先一篇文章里…

sentinel-流量控制

github地址&#xff1a;主页 alibaba/Sentinel Wiki GitHub 目录 概述基于 QPS/并发数的流量控制基于调用关系的流量控制 概述 流量控制&#xff08;flow control&#xff09;&#xff0c;其原理是监控应用流量的 QPS 或并发线程数等指标&#xff0c;当达到指定的阈值时对…

免费安全的内网穿透实现——Tailscale

一、需求说明想要实现访问公司或家里的网络设备&#xff08;Windows电脑、NAS、安卓设备等&#xff09;;但是这些设备又没有对应的公网IP地址&#xff1b;且就算有公网 IP 地址&#xff0c;也不放心让这些网络设备直接公开暴露在网络环境中&#xff08;这样很容易被频繁的恶意扫…

【MySQL Tips】除了指定密码外 MySQL客户端更好的选择——登录路径

在实际项目中&#xff0c;我们在生产&#xff08;环境&#xff09;发布新版本或运维时&#xff0c;使用 mysql 、mysqladmin、mysqlimport、mysqldump、mysqlpump 等 MySQL 客户端程序时&#xff0c;每次都需要输入密码&#xff0c;一般都会采用更安全的互动输入密码模式&#…

UOS 22.0家庭版使用体验

1月4日这天我收到了UOS的22.0版本的推送&#xff0c;更新后新增了未成年人账户和学习中心&#xff0c;由于是虚拟机中所以无法新增未成年人账户&#xff0c;于是我制作了Linux to go&#xff08;LTG&#xff09;但是由于我的U盘不是固态U盘所以我用普通的更新就卡在了更新界面。…

Linux下第一个程序:进度条

一、前言 进度条程序曾经是百度的一道面试题。 这一期博客我们来介绍代码和原理究竟是怎样的。 二、知识点 1.回车和换行 通常意义上我们以为回车就是就是键盘的那个回车键。 其实不然。回车其实是不换行&#xff0c;回到本行开头。我们通常用符号表示为 \r 。 换行就是新…

Docker Compose安装

目录 前言 1. 二进制包在线安装 2. 二进制包离线安装 2.1 下载安装包。 2.2 上传到linux服务器 2.3 解压到/usr/local/bin/docker-compose目录。 2.4 将可执行权限应用于二进制文件 2.5 创接建软链&#xff08;可选&#xff09; 2.6 测试是否安装成功 3. 国内镜像二进…

Linux应用编程---3.wait()函数

Linux应用编程—3.wait()函数 ​ 首先引入三个函数&#xff0c;我们通过在Linux终端下查阅它的作用与使用方法。 ​ Linux终端命令下输入&#xff1a;man exit&#xff0c;敲击回车键即可打开exit函数详情页。 图1 exit编程手册​ exit函数的作用是终止一般进程&#xff0c;没…

12、Java基础之泛型的使用

一、泛型的理解1、泛型的概念所谓泛型&#xff0c;就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时&#xff08;例如&#xff0c; 继承或实现这个接口&#xff0c;用这个类型声明变量、创建对象时&#…