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) 程序是为了方便用户使用的, ...
随机推荐
- redis实现最简单的锁
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifact ...
- Spring Cloud Gateway过滤器精确控制异常返回(实战,控制http返回码和message字段)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 前文<Spring Cloud Gat ...
- 洛谷 P5902 [IOI2009]salesman(dp)
题面传送门 题意: 有 \(n\) 个展销会,每个展销会给出它的时间 \(t_i\),举办展销会的位置 \(l_i\),和参加这个展销会你能得到的收益 \(m_i\). 你现在在位置 \(s\),你可 ...
- 微信小程序扫描普通二维码打开小程序的方法
很久没有写博客了,之前换了一份工作,很久没有做Android开发了,现在转做前端开发了,记录一下遇到的问题及解决的方法. 最近做微信小程序开发,遇到一个需求,后台管理系统生成的问卷和投票会有一个二维码 ...
- ui自动化测试,页面方法的使用
悬浮下拉框 的设置选择 下拉框的选择 显性等待 双击, ActionChains类的方法行动链 提示框 双击,右击 双击用到行动连,提示框用到Alert的类 右击用到的也是行动连 UI自动化测试 #h ...
- 学习java 7.25
学习内容: 特殊边框 1. TitledBorder:它的作用并不是直接为其他组件添加边框,而是为其他边框设置标题,创建该类的对象时,需要传入一个其他的Border对象; 2. CompoundBor ...
- apostrophe
apostrophe 者,', 0x27, 十进制39,ASCII里的single quote (单引号) 也.one of the 'inverted commas'. 在书写上可以表示所有格.省略 ...
- [PE结构]导入表与IAT表
导入表的结构导入表的结构 typedef struct _IMAGE_IMPORT_DESCRIPTOR { union { DWORD Characteristics; // 0 for termi ...
- 时光网内地影视票房Top100爬取
为了和艺恩网的数据作比较,让结果更精确,在昨天又写了一个时光网信息的爬取,这次的难度比艺恩网的大不少,话不多说,先放代码 # -*- coding:utf-8 -*-from __future__ i ...
- 【分布式】Zookeeper客户端基本的使用
与mysql.redis等软件一样,zookeeper的软件包中也提供了客户端程序用于对服务器上的数据进行操作.本节我们就来学习zookeeper客户端的使用方法.不过在详细讲解zk客户端的使用方法之 ...