java 图形化小工具Abstract Window Toolit :画笔Graphics,画布Canvas(),弹球小游戏
画笔Graphics
- drawLine(): 绘制直线
- drawString(): 绘制字符串
- drawRect(): 绘制矩形
- drawRoundRect(): 绘制带圆角的矩形
- drawOval():绘制椭圆形
- drawPolygon():绘制多边形边框
- drawArc():绘制一段圆弧(可能是椭圆的圆弧)
- drawPolyline():绘制折线
- fillRect():填充一个矩形区域
- fillRoundRect():填充一个圆角矩形区域
- fillOval():填充椭圆形
- fillPolygon():填充多边形边框
- fillArc():填充一段圆弧(可能是椭圆的圆弧)
- drawImage():绘制位图
- Canvas()画布类 paint方法画图,方法中传入画笔形参
- Canvas()画布类 setSize(250,250);方法设置画布大小
- Canvas()画布类 repaint(); //清除后重新绘制
- Graphics().setColor方法设置画笔颜色,画笔执行画图动作(红色值,绿色值,蓝色值) 红绿蓝三色取值范围0-255 组合起来可以组成人类可见的任何颜色
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import java.util.concurrent.atomic.AtomicReference; /**
* @ClassName DrawSimple
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/5/7.
*/
public class DrawSimple {
public static void main(String[] args) {
//窗口
Frame frame = new Frame("简单画图示例"); //窗口关闭按钮动作
WindowListener closeListener = new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.out.println("窗口关闭");
System.exit(0);
}
};
frame.addWindowListener(closeListener);
//绘制图形形状变量
AtomicReference<String> shape = new AtomicReference<>();
//画布
Canvas canvas = new Canvas(){
Random random = new Random();
@Override
public void paint(Graphics g) { //g为画笔
System.out.println("画图中");
if (shape.get() != null){
switch (shape.get()){
case "rect":
//设置画笔颜色Color(红色值,绿色值,蓝色值) 红绿蓝三色取值范围0-255 组合起来可以组成人类可见的任何颜色
g.setColor(new Color(255,0,0));
//画矩形,x,y分别为起始位置,后面两个参数为宽,高 Random.nextInt(200) 为伪随机数
g.drawRect(20,20,random.nextInt(200),random.nextInt(200));
break;
case "oval":
//画椭圆
g.setColor(new Color(10,100,30));
g.drawOval(40,20,random.nextInt(200),random.nextInt(200));
}
}
}
};
canvas.setSize(250,250);
frame.add(canvas); //容器
Panel panel = new Panel();
//按钮
Button drawRectBtn = new Button("画矩形");
Button drawOvalBtn = new Button("画椭圆");
//按钮绑定事件
drawRectBtn.addActionListener(e ->{
shape.set("rect");
canvas.repaint(); //清除后重新绘制
});
drawOvalBtn.addActionListener(e ->{
shape.set("oval");
canvas.repaint(); //清除后重新绘制
});
panel.add(drawOvalBtn);
panel.add(drawRectBtn);
frame.add(panel,BorderLayout.SOUTH);
//窗口自动调整大小
frame.setLocation(400,300);
frame.pack();
frame.setVisible(true);
}
}

开发弹球小游戏
- KeyListener 实现监听键盘按键 触发移动球拍
- 画图逻辑:球到了画布的X轴左右端,向相反方向移动位置,到了Y轴顶端位置0,或者到了球拍接触区域向相反方向移动位置
- Timer定时器,每隔毫秒级别重新画图
- 用到的变量全部定义为类变量


示例代码:
import com.sun.source.tree.NewClassTree; import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random; /**
* @ClassName Pinball
* @projectName: object1
* @author: Zhangmingda
* @description: XXX
* date: 2021/5/7.
*/
public class Pinball {
//定义球拍初始位置用随机对象
private Random random = new Random();
/**
* 设置画布大小:宽高
*/
private int canvaWidth = 300;
private int canvaHeight = 400;
/**
* 球拍初始参数
*/
//拍子大小位置
private int rectX = random.nextInt(200); //拍子所在横坐标位置,要在画布范围之内,
private int rectY = 355; //拍子所在Y轴坐标位置小于400,和底部留一定空隙
private int rectWidth = 60; //宽度60
private int rectHeight = 15; //厚度
//拍子按下按键拍子移动的像素大小(步伐)
int pace =10; /**
* 小球的尺寸位置初始参数
*/
private int ballSize =15;
private int ballX = random.nextInt(200);
private int ballY = random.nextInt(100); /**
* 小球运动速度值
*/
private int ballYSpeed = 5; //Y 轴移动速度
private double xyRate = random.nextDouble() - 0.5; //X轴相对比Y轴运动速度的比率,返回一个-0.5 ~0.5之间的数,移动方向为向左或者向右
private int ballXSpeed = (int) (ballYSpeed * xyRate * 2); // X 轴运动的速度 /**
* 定时器Timer
*/
private Timer timer; /**
* 游戏是否结束
*/
private boolean gameOver = false; /**
* 方法
*/
public void play(){
/**
* 定义窗口,设置位置和关闭动作
*/
Frame frame = new Frame("弹球小游戏");
frame.setLocation(400,300);
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.out.println("关闭游戏");
System.exit(0);
}
}); /**
* 定义画布
*/
Canvas canvas = new Canvas(){
@Override
public void paint(Graphics g) {
//如果没有结束
if (!gameOver){
//画球
g.setColor(new Color(30,200,150));
g.fillOval(ballX,ballY,ballSize, ballSize);
//画下面的矩形拍子
g.setColor(new Color(75, 79, 194));
g.fillRect(rectX, rectY, rectWidth, rectHeight);
}else { //gameOver了
g.setColor(Color.RED);
g.setFont(new Font("Times",Font.BOLD,30)); // 设置字体格式字体
g.drawString("Game Over",70, 200);
}
}
};
//设置画布大小
canvas.setPreferredSize(new Dimension(canvaWidth,canvaHeight));
frame.add(canvas);
/**
* 游戏核心逻辑:动画效果
*/
timer = new Timer(50, new ActionListener() {
@Override
public void actionPerformed(ActionEvent actionEvent) {
/**
* 如果到了X轴的两端,就向反方向画图
*/
if (ballX < 0 || ballX >= canvaWidth - ballSize)
ballXSpeed = -ballXSpeed;
/**
* 如果球接触到了球拍的X轴和Y轴区域内,或者跑到顶端(ballY 坐标小于0)就把Y轴反向移动
*/
if (ballY < 0 || (ballY >= rectY - ballSize && ballY < rectY - ballSize/2) && ballX + ballSize /2 >= rectX && ballX + ballSize /2 <= rectX + rectWidth) {
System.out.println("ballX:"+ ballX + "ballY:"+ ballY + "rectX:" + rectX + "rectY:" +rectY);
ballYSpeed = -ballYSpeed; //反向速度
}else if (ballY >= canvaHeight){ //如果球已经掉到画布之外或者 球拍下 就停止timer循环
timer.stop();
gameOver = true;
}
ballX += ballXSpeed;
ballY += ballYSpeed;
canvas.repaint();
}
});
timer.start();
/**
* 窗口监听键盘
*/
KeyListener keyListener = new KeyAdapter() { //添加键盘监听器
@Override
public void keyPressed(KeyEvent e) { //当键盘被按下时触发
// System.out.println("按下键盘");
int KeyCode = e.getKeyCode(); //获取按下的键盘代号
switch (KeyCode){
case KeyEvent.VK_LEFT://左键按下
if(rectX - pace > 0){
rectX -= pace;
}else {
rectX = 0;
}
break;
case KeyEvent.VK_RIGHT://右键按下
if (rectX + pace < canvaWidth - rectWidth){
rectX += pace;
}else {
rectX = canvaWidth -rectWidth;
}
break;
}
canvas.repaint();
}
};
frame.addKeyListener(keyListener);
/**
* 窗口大小自动调节到最优,显示窗口
*/
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new Pinball().play();
}
}
java 图形化小工具Abstract Window Toolit :画笔Graphics,画布Canvas(),弹球小游戏的更多相关文章
- java 图形化小工具Abstract Window Toolit 画笔 处理位图
具体编程来处理位图 知识点: 实现逻辑: 画板上的图片 new BufferedImage(canvasWidth,canvasHeight,BufferedImage.TYPE_INT_BGR); ...
- java 图形化小工具Abstract Window Toolit
老掉牙的历史 Java1.0在发布的时候,就为我们提供了GUI操作的库,这个库系统在所有的平台下都可以运行,这套基本的类库被称作抽象窗口工具集(Abstract Window Toolit),简称 ...
- java 图形化小工具Abstract Window Toolit 事件处理
事件处理设计到了三个对象: EventSource(事件源):事件发生的场所,通常就是各个组件,例如按钮.窗口,菜单等. Event (事件封装了GUI组件上发生的特定事情(通常就是一次用户操作).如 ...
- java 图形化小工具Abstract Window Toolit 常用组件:对话框Dialog FileDialog
对话框 Dialog是Window类的子类,是1个容器类,属于特殊组件,对话框是可以独立存在的顶级窗口,因此用法与普通窗口的用法几乎完全一样.但对话框有如下两点需要注意. (1),对话框通常依赖于其他 ...
- java 图形化小工具Abstract Window Toolit ImageIO缩放图片,添加水印
实现步骤: 读取图像Image src = ImageIO.read 创建目标图像BufferedImage distImage = new BufferedImage(dstWidth, dstHe ...
- java 图形化小工具Abstract Window Toolit 菜单项
AWT 中的菜单由如下几个类组合而成 MenuBar: 菜单条,菜单的容器. Menu: 菜单组件,菜单项的容器,它也是Menultem的子类,所以可作为菜单项使用. PopupMenu: 上下文菜单 ...
- java 图形化小工具Abstract Window Toolit 常用组件
基本组件 Button: 按钮,可接受单击操作 Canvas: 用于绘图的画布 Checkbox: 复选框组(也可变成单选框组件) CheckboxGroup: 用于将多个checkbox组件组合成一 ...
- java 图形化小工具Abstract Window Toolit ;布局管理器FlowLayout流式布局;BorderLayout边界布局;GridLayout网格布局;CardLayou重叠卡片布局;BoxLayout方框布局;绝对定位
1.FlowLayout流式布局管理器: FlowLayout布局管理器中,组件像水流一样向某方向流动(排列),遇到障碍(边界)就折回,重头开始排列 .在默认情况下,FlowLayout局管理器从左向 ...
- 转:二十七、Java图形化界面设计——容器(JFrame)
转:http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计——容器(JFrame) 程序是为了方便用户使用的, ...
随机推荐
- 关于uni-app导航栏中 中间大图标的设置
在uni-app的开发过程中,想要将位于中间的图标设置更大,通过一般的更改导航栏图标大小方式实现不了.经过查看官方文档可以发现,我们可以通过midbutton来设置中间tabbar的样式. 但前提是, ...
- SpringCloud升级之路2020.0.x版-44.避免链路信息丢失做的设计(2)
本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 我们在这一节我们将继续讲解避免链路信息丢失做的设计,主要针对获取到现有 Span 之后,如 ...
- c语言用指针交换两个变量
#include<stdio.h> #include<math.h> int main(){ void swap(int a,int b); void swapPointer( ...
- 洛谷 P4497 - [WC2011]拼点游戏(数据结构综合)
题面传送门 神仙 DS. 首先关于第一问可以轻松想到一个 DP,\(dp_{i,j}\) 表示考虑到第 \(i\) 位,这一位奇偶性为 \(j\) 的最大权值,时间复杂度 \(n^2q\),可以拿到 ...
- DTOJ 4030: 排列计数
[题目描述] 求有多少个1到n的排列满足恰有$k$对在排列中相邻的数满足前小于后,答案对2012取模. [输入] 一行2个正整数$n,k$. [输出] 输出一个整数表示答案. [样例输入] 5 2 ...
- 【R】ggplot2的facet_warp/grid如何实现超过两类水平的分面?
之前最多只做过两类单水平的分面,即两两组合的面板图.如果某类超过两个水平呢? 一类的分面:facet_wrap(~ align) 两类的分面(x轴和y轴):facet_grid(align ~ gen ...
- 毕业设计之zabbix集合
lnmp环境请查看https://www.cnblogs.com/betterquan/p/12285956.html 但是!!!注意php的编译: https://www.zabbix.com/do ...
- linux系统中安装MySQL
linux系统中安装MySQL 检查原来linux系统中安装的版本 rpm -qa | grep mysql 将其卸载掉 以 mysql-libs-5.1.71-1.el6.x86_64 版本为例 r ...
- Hadoop入门 常见错误及解决方案
常见错误及解决方案 目录 常见错误及解决方案 ResourceManager连接失败 root用户和ranan用户两个用户启动集群不统一 不识别主机名 DataNode和NameNode进程同时只能工 ...
- linux "/tmp/crontab.14QJ49":1: bad minute errors in crontab file, can't install" 错误
目录 报错及原因 crontab语句格式 报错及原因 这个错误的原因是crontab格式错误 "/tmp/crontab.sdXvj4":5: bad minute errors ...