java游戏开发杂谈 - 游戏物体
java游戏开发杂谈 - 游戏物体
现实生活中,有很多物体,每个物体的长相、行为都不同。
物体存在于不同的空间内,它只在这个空间内发生作用。
物体没用了,空间就把它剔除,不然既占地方,又需要花精力管理。
需要它的时候,就把它造出来,不需要它的时候,就把它销毁。
按照面向对象的设计思想,游戏里的物体,我们也把它定义为一个类。
一个类就定义了一种物体的属性、行为。类是对象的模板,对象是类的实例。
我们用一个集合,把所有的游戏物体都放在里面,对它们进行统一的管理。
随着游戏线程的运行,集合里的物体,它们的逻辑和绘制也不断被调用执行。
我这里实现一个例子:游戏里,鼠标点击哪里,哪里就出现一个方块,方块先向上
运动,再往下,当掉落出屏幕后,方块就从游戏中消除。注意方块的加速度机制。
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,因为这个链表列表,删除的效率高。
讲到这里,基本上一个游戏的雏形,已经建立起来了,剩下的就是在这个框架上,进行完善。
如同我们学绘画,先要临摹那些正方体、椎体,正是这些基础性的东西,构造出很复杂的图案。
游戏里那些很酷、很炫、很复杂的效果,也都是基于绘制、刷新、线程、事件、有限状态机。
万变不离其宗,掌握好基本的东西,剩下的都是些技巧,运用之妙,存乎一心也。
去开发自己的游戏,享受编程的乐趣吧。。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Fundebug支付宝小程序BUG监控插件更新至0.2.0,新增test()方法,报错增加Page数据
摘要: 0.2.0新增fundebug.test()方法,同时报错增加了Page数据。 Fundebug提供专业支付宝小程序BUG监控服务,可以第一时间为您捕获生存环境中小程序的异常、错误或者BUG,及时给开发者发送报警,帮助您快速修复BUG。欢迎大家免费试用,也欢迎各位用户反馈建议或者问题。 test(name, message) fundebug.test()用于测试,可以将测试数据发送到Fundebug,并收到报警邮件。 name: 错误名称,参数类型为字符串,默认值为"Test" message: 错误信息,参数类型为字符串,默认值为"Hello, Fundebug!" 示例: fundebug.test() fundebug.test("Test", "Hello, Fundebug!") fundebug.test() 主要用于测试,它发送的错误每次都会报警邮件(每天的限额是 20 封),这样可能会给您造成困扰。为了避免重复报警,请使用其他 API 记录错误,这样同一个错误将只会在错误数达到阈值(10, 100, 100...)的时候报警。 notify notifyErr...
-
下一篇
Java调用Javascript、Python算法总结
Java调用Javascript、Python算法总结最近项目中经常需要将Javascript或者Python中的算法发布为服务,而发布Tomcat服务则需要在Java中调用这些算法,因此就不免要进行跨语言调用算法。不管是调用Javascript文件还是python脚本,都需要将原来的算法文件进行适当的更改,以便可以在Java中传入参数,并且得到算法运算结果。 一、Java调用Javascript 需要注意的是Javascript是弱类型语言,定义变量只需要一个var就可以搞定,但是在Java中却要注意变量类型,不同的输入参数会有不同的类型。 调用js文件时,需要对其进行调整,设置好需要调用的function和相关参数,使用的js文件代码如下(其中有些核心算法不能展示): 复制代码 1 function get3DCode(Latitude,Longitude,Height,level){ 2 var latcode=[];var lngcode=[]; 3 latcode=GeoSOTCode1D(Latitude,level); 4 lngcode=GeoSOTCode1D(Lon...
相关文章
文章评论
共有0条评论来说两句吧...