现实生活中,有很多物体,每个物体的长相、行为都不同。

物体存在于不同的空间内,它只在这个空间内发生作用。

物体没用了,空间就把它剔除,不然既占地方,又需要花精力管理。

需要它的时候,就把它造出来,不需要它的时候,就把它销毁。


按照面向对象的设计思想,游戏里的物体,我们也把它定义为一个类。

一个类就定义了一种物体的属性、行为。类是对象的模板,对象是类的实例。

我们用一个集合,把所有的游戏物体都放在里面,对它们进行统一的管理。

随着游戏线程的运行,集合里的物体,它们的逻辑和绘制也不断被调用执行。


我这里实现一个例子:游戏里,鼠标点击哪里,哪里就出现一个方块,方块先向上

运动,再往下,当掉落出屏幕后,方块就从游戏中消除。注意方块的加速度机制。

package game7;

import java.awt.Color;
import java.awt.Graphics; /**
* java游戏开发杂谈
* ---demo7:游戏物体
*
* @author 台哥编程课堂
* https://www.cnblogs.com/chaohi/
*
* @date 2019-04-25
*/
public class FangKuai extends GameObject{ private GamePanel panel; public FangKuai(GamePanel panel){
this.panel = panel;
} //纵坐标超出多少,就销毁
public int limit_y ; private int u = -10; //速度
private int a = 1; //加速度 @Override
public void logic() {
x = x + 1;
y = y + u;
u = u + a;
if(y > limit_y){
destory();
}
} @Override
public void paint(Graphics g) {
g.setColor(Color.red);
g.fillRect(x, y, 30, 30);
} /**
* 自身销毁方法,即从游戏屏幕中消失
*/
private void destory(){
panel.remove(this);
} }
package game7;

import java.awt.Graphics;

/**
* java游戏开发杂谈
* ---demo7:游戏物体
*
* @author 台哥编程课堂
* https://www.cnblogs.com/chaohi/
*
* @date 2019-04-26
*/
public class GameObject { //所在位置
public int x, y; //自身逻辑
public void logic(){ } //自身绘制
public void paint(Graphics g){ } }
package game7;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.LinkedList;
import java.util.List; import javax.swing.JPanel;
/**
* java游戏开发杂谈
* ---demo7:游戏物体
*
* @author 台哥编程课堂
* https://www.cnblogs.com/chaohi/
*
* @date 2019-04-25
*/ public class GamePanel extends JPanel implements MouseListener{
/** 屏幕的宽和高 */
private int width,height; public GamePanel(int width, int height) {
this.width = width;
this.height = height;
this.setSize(width, height); //设置当前画布可以获得焦点。
this.setFocusable(true); this.addMouseListener(this);
} /**
* 游戏物体所在的集合
*/
private List<GameObject> objects = new LinkedList<GameObject>(); /**
* 画布的绘制
*/
public void paintComponent(Graphics g) {
super.paintComponent(g); //画绿色背景
g.setColor(new Color(0x9391d6));
g.fillRect(0, 0, width, height); //绘制出所有游戏物体
for (int i = 0; i < objects.size(); i++) {
GameObject go = objects.get(i);
go.paint(g);
}
} /**
* 游戏逻辑,调用所有游戏物体的逻辑
*/
public void logic()
{
for (int i = 0; i < objects.size(); i++) {
GameObject g = objects.get(i);
g.logic();
}
} public void remove(GameObject object){
objects.remove(object);
} @Override
public void mouseClicked(MouseEvent e) {
} @Override
public void mousePressed(MouseEvent e) {
FangKuai fk = new FangKuai(this);
fk.x = e.getX() - 15;
fk.y = e.getY() - 15;
fk.limit_y = this.height;
this.objects.add(fk);
} @Override
public void mouseReleased(MouseEvent e) {
} @Override
public void mouseEntered(MouseEvent e) {
} @Override
public void mouseExited(MouseEvent e) {
} }

另外的GameFrame和GameThread两个类,跟前面两篇博客的一样,这里就不重复贴出了。


游戏的运行截图也不发了,大家可以自己运行下代码,反正就是方块的生成、运动、销毁。

方块继承的是GameObject类,我们继续定义圆形、三角形、五角星等,都让它们继承GameObject,

也可以定义子弹、飞机、植物、地图、人物、怪物等等,只要有行为的物体,都可以继承GameObject。

然后用一个集合来统一管理它们。顺便说下为什么用LinkedList,因为这个链表列表,删除的效率高。


讲到这里,基本上一个游戏的雏形,已经建立起来了,剩下的就是在这个框架上,进行完善。

如同我们学绘画,先要临摹那些正方体、椎体,正是这些基础性的东西,构造出很复杂的图案。

游戏里那些很酷、很炫、很复杂的效果,也都是基于绘制、刷新、线程、事件、有限状态机。

万变不离其宗,掌握好基本的东西,剩下的都是些技巧,运用之妙,存乎一心也。

去开发自己的游戏,享受编程的乐趣吧。。

java游戏开发杂谈 - 游戏物体的更多相关文章

  1. java游戏开发杂谈 - 游戏编程浅析

    每个游戏,你所看到的它的一切,都是计算机画出来的! 地图是画出来,人物是画出来的,树木建筑是画出来的,菜单按钮是画出来的,滚动的文字.闪烁的图标.云雾烟火,都是画出来的. 游戏编程,所要做的,就是控制 ...

  2. java游戏开发杂谈 - 线程

    线程,让游戏拥有了动态变化的能力. java的图形界面,在启动的时候,就开始了一个线程. 这个线程负责处理:JFrame.JPanel等的绘制.事件处理. 它是由操作系统调用的,在程序启动时开启,程序 ...

  3. java游戏开发杂谈 - 创建一个窗体

    package game1; import javax.swing.JFrame; /** * java游戏开发杂谈 * ---demo1:创建一个窗体 * * @author 台哥 * @date ...

  4. java游戏开发杂谈 - 有限状态机

    在不同的阶段,游戏所运行的逻辑.所显示的界面,都是不同的. 以五子棋举例,游戏开始.游戏中.胜负已分,对应的界面和逻辑都不同. 在游戏中,又分为:自己下棋.对方下棋.游戏暂停.悔棋等多个状态. 再比如 ...

  5. java游戏开发杂谈 - 实现游戏主菜单

    经常玩游戏的同学,大家都知道,游戏都会有个主菜单,里面有多个菜单选项:开始游戏.游戏设置.关于游戏.退出游戏等等,这个菜单是怎么实现的呢. 有一定桌面软件开发基础的同学可能会想到,用JButton组件 ...

  6. java游戏开发杂谈 - 事件处理

    大家都知道,游戏需要跟玩家交互,需要接收玩家的鼠标.键盘发出的命令,比如在地图上点击一下,人物就自动寻路走过去:键盘上按下某个键,就弹出一个背包界面. 这些逻辑是怎么处理的呢? 大家先不用深究太详细的 ...

  7. java游戏开发杂谈 - 画布和画笔

    在Eclipse里,编写如下两个类: package game2; import java.awt.Color; import java.awt.Graphics; import javax.swin ...

  8. [libGDX游戏开发教程]使用libGDX进行游戏开发(1)-游戏设计

    声明:<使用Libgdx进行游戏开发>是一个系列,文章的原文是<Learning Libgdx Game Development>,大家请周知.后续的文章连接在这里 使用Lib ...

  9. java游戏开发杂谈 - java是什么

    java是一门编程语言, 它有三个开发平台:j2ee.j2se. j2me.(其实android也算一个了)      j2ee, 也就是web开发,比如网站.各类管理系统,主要是围绕数据库.网页等进 ...

随机推荐

  1. andorid下从相册选取/拍照选取一张相片并剪切

    http://www.2cto.com/kf/201401/270144.html 在Android编程中,从相册选取或是拍照选取一张照片然后对其进行剪切的需求非常的多 之前的一篇文章只说到如何从相册 ...

  2. java数据库之JDBC

    任何一个项目,都离不开数据,而对于数据的存储以及其他操作,就会用到数据库了. 在这里是主要针对MySQL数据库的操作. 1.软件 当然首先要下载MySQL,为了操作起来更加方便,这里推荐一个比较方便的 ...

  3. 搭建centos7的开发环境2-单机版Hadoop2.7.3配置

    最近公司准备升级spark环境,主要原因是生产环境的spark和hadoop版本都比较低,但是具体升级到何种版本还不确定,需要做进一步的测试分析.这个任务对于大数据开发环境配置有要求,这里记录一下配置 ...

  4. Java开源生鲜电商平台-盈利模式详解(源码可下载)

    Java开源生鲜电商平台-盈利模式详解(源码可下载) 该平台提供一个联合买家与卖家的一个平台.(类似淘宝购物,这里指的是食材的购买.) 平台有以下的盈利模式:(类似的平台有美菜网,食材网等) 1. 订 ...

  5. AVL Tree 操作

    1.AVL树是带有平衡条件的二叉查找树, 一棵AVL树是其每个节点的左子树和右子树的高度最多差1的二叉查找树. 2.AVL树的删除要比插入复杂.如果删除相对较少,那么用懒惰删除的方法是最好的策略. 3 ...

  6. javascript 用函数语句和表达式定义函数的区别详解

    通常我们会看到以下两种定义函数的方式: // 函数语句 function fn(str) { console.log(str); }; // 表达式定义 var fnx=function(str) { ...

  7. Python并发编程之线程消息通信机制任务协调(四)

    大家好,并发编程 进入第四篇. 本文目录 前言 Event事件 Condition Queue队列 总结 . 前言 前面我已经向大家介绍了,如何使用创建线程,启动线程.相信大家都会有这样一个想法,线程 ...

  8. Python并发编程之线程中的信息隔离(五)

    大家好,并发编程 进入第三篇. 上班第一天,大家应该比较忙吧.小明也是呢,所以今天的内容也很少.只要几分钟就能学完. 昨天我们说,线程与线程之间要通过消息通信来控制程序的执行. 讲完了消息通信,今天就 ...

  9. Eclipse开发前,常用设置

    设置工作空间的项目编码, 防止出现乱码    Window - Preferences - General - Workspace    将"Text file encoding" ...

  10. springboot项目利用devtools实现热部署,改动代码自动生效

    一.前言 spring-boot-devtools是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去.原理是在发现代码有更改之后,重新启动应用,但是速度比手动停止后 ...