您现在的位置是:首页 > 文章详情

java游戏开发杂谈 - 游戏物体

日期:2019-04-27点击:347

java游戏开发杂谈 - 游戏物体
现实生活中,有很多物体,每个物体的长相、行为都不同。

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

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

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

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

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

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

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

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

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

package game7;

import java.awt.Color;
import java.awt.Graphics;

/**

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;

/**

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;
/**

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,因为这个链表列表,删除的效率高。

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

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

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

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

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

原文地址https://www.cnblogs.com/chaohi/p/10782259.html

原文链接:https://yq.aliyun.com/articles/700463
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章