Java游戏学习

Java初学者必备:10款基础小游戏项目实战指南 本文还有配套的精品资源,点击获取 简介:本集合包含了10款用Java开发的基础小游戏项目,非常适合Java初学者进行学习和实践。这些项目有助于初学者掌握Java编程的基础知识,并通过直接运行和调试代码来提升编程技能。游戏源代码和资源文件可通过解压提供,兼容多种操作系统。通过这些项目的实践,初学者将学会Java语法、面向对象概念、事件处理、图形界面设计以及游戏开发的关键技术。... 阅读详情
这几天一直在看 <<Killer Game Programming in Java>>,非常经典的好书,现在对游戏有了一个基本的认识,过几天就写个贪吃蛇出来.
因为看得有点快,真正准备写代码的时候又发现自己对一些基本知识点还是比较模糊,又返回去看前面.边看边做笔记,感觉确实理解得要更加清楚了.

*FPS 和 按时间准确的Sleeping*
============================

FPS
--------
  一个测量animation速度的常用指标就是桢速(每秒显示桢的数量:frames per second),简称FPS.在下面的
代码中,做一次gameUpdate和gameRender的循环就对应一个桢.
  比如100FPS表示run()中的每次迭代应该用1000/100 == 10ms.这个迭代时间存在period变量中.

//code example:

public void run() {
  long beforeTime, timeDiff, sleepTime;
  beforeTime = System.currentTimeMillis();
  running = true;
  while(running) {
    gameUpdate();//计算game中的model
    gameRender();//画一个image, "double buffer"
    paintScreen();//在screen上显示image
    
    timeDiff = System.currentTimeMillis() - beforeTime;
    sleepTime = period - timeDiff;//计算需要sleep的时间

    if (sleepTime <= 0)
      sleepTime = 5;

    try {
      Thread.sleep(sleepTime);
    }catch(InterruptedException e);

    beforeTime = System.currentTimeMillis();
  }
}

--------
Timer Resolution
  连续调用两次timer中间必需的最小时间.这样才能保证每次调用返回不同的时间.
  比如:
          long t1 = System.currentTimeMillis( );
        long t2 = System.currentTimeMillis( );
        long diff = t2 - t1;  // 实际输出是0,单位是ms

  在win95和win98上,resolution值是55ms,说明只有在每隔55ms后调用timer才会返回不同的值.
  在animation loop中,resolution的会导致animation比期望的要慢而且减小了FPS.因为如果gameUpdate
和gameRender的时间小于55ms,那么timeDiff变量就会设为0,那么sleepTime就会比实际需要的时间要大.
  为了防止这个问题,每个循环周期时间必须大于55ms,表示最高限制是大约18FPS.这个frame rate被广泛接
受,因为屏幕刷新过慢会表现得象闪屏(excessive flicker)一样.
 
  在Windows2000, NT和XP上, currentTimeMillis()的resolution是10到15ms,这样就可以获得67-100FPS.
这个值对游戏来说是可以接受的.在Mac OS X和Linux上的resolution是1ms,相当好了.

--------
改进过的J2SE Timers

  J2SE 1.4.2有一个没有被写入到文档的精确到微秒的timer class: sum.misc.Perf.
  Pref计算diff的方法:

      Pref perf = Perf.getPerf();
    long countFrep = perf.highResFrequency();
    
    long count1 = perf.highResCounter();
    long count2 = perf.highResCounter();
    long diff = (count2 - count1) * 1000000000L / countFreq;
                    //转换成纳秒nanoseconds
  nanoseconds:十忆分之1秒

  J2SE 5.0中解决了这个timer的问题,System.nanoTime(),可以象Pref timer一样来计算时间.
      long count1 = System.nanoTime();
    long count2 = System.nanoTime();
    long diff = (count1 - count2);//单位是纳秒

--------
Non-J2SE Timers

  Java 3D timer的计算方法:
      long t1 = J3DTimer.getValue();
    long t2 = j3DTimer.getValue();
    long diff = t2 - t1;//单位是纳秒


*更好的Sleeping*
================
  animation循环依赖一个好的timer和精确的sleep方法调用.现在在前面的基础上改进代码,以保证需要
的桢速.
//code example:

private static final int NO_DELAYS_PER_YIELD = 16;

public void run() {
  long beforeTime, afterTime, timeDiff, sleepTime;
  long overSleepTime = 0L;
  int noDelays = 0;

  beforeTime = J3DTimer.getValue();
 
  running = true;
  while(running) {
    gameUpdate();
    gameRender();
    paintScreen();

    afterTime = J3DTimer.getValue();
    timeDiff = afterTime - beforeTime;
    sleepTime = (period - timeDiff) - overSleepTime;

    if (sleepTime > 0) {
      try{
        Thread.sleep(sleepTime/1000000L); //nano -> ms
      }catch(InterrruptedException ex){}
      overSleepTime = (J3DTimer.getValue() - afterTime) - sleepTime;
    }else {    //sleepTime <= 0; 桢的时间大于期望的period,
        //不sleep直到sleepTime > 0 或 连续运行了NO_DELAYS_PER_YIELD次
      overSleepTime = 0L;
     
      if (++noDelays >= NO_DELAYS_PER_YIELD) {
        Thread.yield();
     noDelays = 0;
      }
    }
    
    beforeTime = J3DTimer.getValue();

  }
}

  如果sleep()设置成sleep 10 ms,但是确用了12 ms,那么overSleepTime会被设置成2 ms,下次就会少
sleep 2ms.
  如果桢的时间大于期望的period,那么就不浪费时间sleep,而是一直循环,一定次数后调用Thread.yield(),
这样来节省时间而又保证其它线程有机会运行.

*FPS和UPS*
==========

  除了FPS,还有一个有用的测量animation速度的指标:UPS. 在现在的animation循环中每次迭代拥有一次
update和render.但是这个对应不是必需的.在循环中,可以每一次render前做两次updates.
 
//code example:
 
public void run() {
  ...
  running = true;
  while(running) {
    gameUpdate();//update 游戏状态
    gameUpdate();//再一次update 游戏状态
 
    gameRender();
    paintScreen();

    //sleep
  }
  System.exit(0);
}
  在上面的代码中,如果游戏提供了50FPS,那么就每秒就会做100次updates.

从Rendering中分离Updates
--------

  对于高FPS速率的一个限制是update和render所需要的时间.假设period = 5ms(1000/5 == 200FPS),如果
update和render需要的时间大于5ms,那么200FPS就不可能达到.而它们所需要的时间中大部分是被render所消耗的.
  在这种情况下,增加游戏速度的方法是增加UPS的速率.在编程中,也就是在每次迭代中增加gameUpdate的次数.
但是注意,如果增加gameUpdate的次数过多的话会造成游戏不连续,因为有许多游戏状态没有显示出来.

新的代码:

//code example:

private static int MAX_FRAME_SKIPS = 5;

public void run() {
  long beforeTime, afterTime, timeDiff, sleepTime;
  long overSleepTime = 0L;
  int noDelays = 0;
  long excess = 0L;

  beforeTime = J3DTimer.getValue();
 
  running = true;
  while(running) {
    gameUpdate();
    gameRender();
    paintScreen();

    afterTime = J3DTimer.getValue();
    timeDiff = afterTime - beforeTime;
    sleepTime = (period - timeDiff) - overSleepTime;

    if (sleepTime > 0) {
      try{
        Thread.sleep(sleepTime/1000000L); //nano -> ms
      }catch(InterrruptedException ex){}
      overSleepTime = (J3DTimer.getValue() - afterTime) - sleepTime;
    }else {    
      excess -= sleepTime;
      overSleepTime = 0L;
     
      if (++noDelays >= NO_DELAYS_PER_YIELD) {
        Thread.yield();
     noDelays = 0;
      }
    }
    
    beforeTime = J3DTimer.getValue();

    int skips = 0;
    while((excess > period) && (skips < MAX_FRAME_SKIPS)) {
      excess -= period;
      gameUpdate();
      skips++;
    }

  }
}

  如果update/render实际需要12ms,但是需要的period是10ms,那么sleepTime会是-2ms(由于引入overSleepTime,
所以可能会更小一点).额外的执行时间被加到excess变量中.
  当excess达到period大小时,那么相当于丢失了一个桢,在while循环中,为每次丢失执行gameUpdate.但是限制在
MAX_FRAME_SKIPS里.
  这样做的优点是,如果一个游戏的update/render速度不能满足期望的FPS时,那么就会另外执行gameUpdate.
这样改变了游戏的状态但是没有马上显示出来,最后用户会看见游戏移动更"快"了,虽然每秒钟显示的桢数并没有
改变.
Java小游戏源代码集合与学习指南 在面向对象编程(OOP)中,类是一个抽象概念,它定义了一组属性(也称为字段或成员变量)和方法。类可以被看作是创建对象的蓝图或模板。对象是根据类定义创建的实例,具有类定义的所有属性和方法。// 类定义示例// 属性// 方法// 实现攻击逻辑// 实现受伤逻辑在上面的例子中,是一个类,拥有name和health两个属性,以及attack和takeDamage两个方法。这些方法定义了对象的行为,比如如何攻击其他对象或如何处理受到的伤害。 阅读详情

相关推荐

Java 游戏项目完整源码(共四个项目,适合java初学者进一步学习和精通java,掌握面向对象编程技术)

适合java初学者进一步学习和精通java,掌握面向对象编程技术的几个非常有趣、适合java学习的游戏项目,共有四个,已经测试可以使用,并且包含完整源码和资源。

android "游戏循环" 帧速,Android基本游戏循环实例分析

// desired fpsprivate final static int MAX_FPS = 50;// maximum number of frames to be skippedprivate final static int MAX_FRAME_SKIPS = 5;// the frame periodprivate final static int FRAME_PERIOD = ...

weixin_39710966的博客 126

学习java编程的游戏robocode

Robocode 是一位IBM的工程师 Mat Nelson 用Java 语言所创造的机器人战斗仿真引擎。Robocode不是一个完整游戏,它是个半成品,一个专为程序员们准备的游戏。它使得你不用不面对一些无聊琐碎但又不得不做的工作,编写界面、处理图像、处理音频,。而是用一种更简单的办法,让我们享受游戏开发的乐趣。 Robocode 它为你处理好一切细节。你所做就是为你的机器人坦克编写智能程序,让它能够移动、进攻、防御、躲避、开火。而它的对手就是跟你一样其他程序员编写机器人程序。 该文件已经整合一些Robocode的介绍,以及开发文档,有国内外官方和民间的中英文介绍,包涵Robocode的官方开发jar包,安装包。API开发文档等。相信能帮助你很快的上手。在玩游戏中增强自己的技术~ 据说游戏已经支持 .net没有测试,熟悉.net的朋友可以下载测试一下啊

java开发转游戏开发,一文说清!

基础 JAVA基础 JAVA集合 JAVA多线程并发 网络 数据结构与算法 框架 Spring SpringMVC MyBatis 设计模式 分布式 负载均衡 Zookeeper Redis MQ/kafka 微服务 Netty与RPC Spring Boot Spring Cloud Dubbo 调优 MySQL JVM Tomcat 最后 小编在这里分享些我自己平时的学习资料,由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来

程序员环西 1816

JAVA小游戏,适合初学JAVA的新手

对于初学JAVA的小伙伴来说,没有练手的实例是很难学懂的,这个小游戏结合了面向对象等方面的知识,不过里面没有代码解析,只能依靠个人去理解,总而言之,还是挺适合初学JAVA的新手的。

STM32 IAP+APP合并Hex文件全自动脚本(Keil5一键生成)

本文详细介绍了一种基于Keil5开发环境的STM32 IAP与APP程序Hex文件全自动合并方案。通过编写批处理或Python脚本,并将其集成到Keil的编译后流程中,实现一键编译、自动合并,彻底解决手动操作繁琐易错的问题,极大提升STM32固件开发与远程升级的效率。

weixin_29191761的博客 307

Java游戏开发:从入门到精通

图形渲染:使用Java 2D或JavaFX进行图形绘制。物理引擎:集成如JBox2D等物理引擎来模拟真实世界的物理效果。游戏循环:实现一个高效的游戏循环来处理游戏逻辑和渲染。输入处理:捕获键盘、鼠标等输入设备的事件。

weixin_53840353的博客 4066

手把手教你用CANopen SDO报文控制步进电机(附CIA402协议详解)

本文详细解析了如何通过CANopen SDO报文控制步进电机,深入讲解CIA402协议的核心架构、状态机模型及对象字典管理,并提供实战代码示例。从SDO报文构造到多轴同步控制,帮助开发者掌握工业级步进电机的精确控制技术,适用于自动化设备开发。

weixin_33737774的博客 486

Java设置帧速度

帧速度(FPS)是指每秒钟图型切换的数量,一”帧“即指一幅静止的图像,在游戏中的一帧实质上就是游戏循环的一次执行。人眼能够识别的动画帧速度最小值是24,换句话说,每秒钟至少切换24幅图像才能让人眼觉得画面是活动的。这不仅仅适用于动画制作,页同样适用于游戏,为了让游戏画面更流畅,需要获得稳定的帧速率。一般来说,游戏中的帧速率在30~50之间比较合适,过低会使得画面产生间断感,过高又会浪费系统资源。为...

Canon_M的博客 2911

coze+飞书多维表格,批量分析小红书笔记,关键还能获取图片(附保姆级教程)

通过coze工作流,一键同步小红书账号和笔记链接到飞书多维表格,效率飞升~

qq_24403067的博客 4175

DSP28335新手避坑指南:手把手教你用CCS6.2生成10KHz SPWM(附完整工程)

本文详细介绍了如何使用DSP28335开发板和CCS6.2环境生成10KHz SPWM波形的完整工程指南。从开发环境配置、ePWM模块设置到SPWM算法实现,特别针对新手常见问题提供了解决方案和调试技巧,帮助工程师快速掌握DSP28335的SPWM生成技术。

weixin_42522374的博客 182

CodeGym:以游戏化的方式学习Java真的是事半功倍

说起编程语言的话、很多人可能就要问,现在学哪种语言最吃香呢?当下哪一种语言最火呢?这个咱们先不着急回答,先看下https://www.tiobe.com/tiobe-index/给出的排名,明显看出在近几年一直排名前3位,语言用的人越多,也越收欢迎,也就意味着高收入的工作机会。 二十年前成为一名程序员要困难得多,当时只能照着“枯燥”的书来学习。如今,有几十种在线课程和平台供学生使用,可以随意编写代码。今天,让我们看一下这个网站,它是一个学习和实践Java的游戏化在线平台,适合零基础进行学习.

java李阳勇的博客 1万+

<硬件设计> 阻抗设计(二) 使用Si9000计算阻抗

阻抗设计(二) 使用Si9000计算阻抗

杰克拉力船长个人博客 1万+

CodeGym:以游戏化的方式学习Java真的是事半功倍_java学习网站游戏化

Java面试核心知识点Java面试核心知识点二十年前成为一名程序员要困难得多,当时只能照着“枯燥”的书来学习。如今,有几十种在线课程和平台供学生使用,可以随意编写代码。今天,让我们看一下这个网站,它是一个学习和实践Java的游戏化在线平台,适合零基础进行学习。​是一个免费的代码学习网站。上面有很多不错的Java编程系统可以帮助新学些Java的同学学习Java更加轻松,软件中还设计了专属的Java程序制作,教学、自学、编程等等一应俱全,让Java学习的行云流水!也是朋友推荐的、我自己注册看了一下。

2401_84692226的博客 668

EtherCAT主站SOEM -- 19 --Qt-Soem通过CSP模式(周期同步位置模式)控制一个电机转圈圈

以上就是EtherCAT主站SOEM – 19 --Qt-Soem通过CSP模式(周期同步位置模式)控制一个电机转圈圈的内容。有不明白的地方欢迎留言;有建议欢迎留言,我后面编写文档好改进。创作不容,如果文档对您有帮助,记得给个赞。

常驻客栈的博客--嵌入式EtherCAT 1998

计算机网络基础:揭开网络世界的神秘面纱

计算机网络基础:揭开网络世界的神秘面纱,计算机网络已深度融入现代生活,这篇文章对其基础内容展开全面阐述。开篇介绍计算机网络的定义,说明其由计算机设备、网络设备和传输介质构成。接着从地域范围和拓扑结构两个维度对计算机网络进行分类,并详细讲解 OSI 和 TCP/IP 参考模型,明晰各层功能与联系。随后阐述网络通信协议的定义及常见协议,如 TCP/IP、HTTP 等。最后聚焦网络安全,涵盖定义、重要性以及防火墙、加密技术等常用安全技术。文章旨在帮助读者构建计算机网络基础知识体系,理解其在生活和工作中的应用与价值

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 6万+

《游戏学习》超简单益智小游戏java版推箱子游戏

1、看视频进行系统学习这几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。2、读源码,看实战笔记,学习大神思路“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。

2301_79055083的博客 626

AI自瞄原理剖析(四)从Yolo推理坐标到屏幕坐标:基于FOV视角与焦距的坐标变换与精准瞄准

从Yolo推理框架得到的坐标到屏幕坐标的转换是一个涉及到FOV视角、焦距以及分辨率的复杂过程。通过数学公式,我们可以将推理框坐标反推为游戏内的实际坐标,并最终映射到屏幕坐标系中。利用这些信息,AI自瞄系统能够精确计算出准星从当前位置移动到敌人位置的距离,实现精准的自动瞄准。通过这种方法,AI自瞄系统能够在不同的游戏环境下灵活应对,提供高度精确的操作体验。在AI自瞄系统中,目标检测仅仅是第一步,获取到预测框的坐标后,我们还需要将这些坐标转换为实际屏幕上的精确位置。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1334

用Robocod游戏来学习JAVA

Robocode(用游戏来学习Java技术还是用Java来玩游戏?)用你的JAVA编程技术来玩游戏吧!不会JAVA?那就用游戏来学习JAVA吧!什么是Robocode? 其实我对机器人一直很感兴趣。我记得在我还是初中的时候,就知道 AplleⅡ上有一个程序,用它来编写简单的机器人程序,然后相互作战。当时自己还完全不懂编程,总是向往着,那神秘的编程高手玩的游戏是怎样的? Robocod...

269

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java课程设计游戏_CodeGym.cc –游戏化的Java学习在线课程

java课程设计游戏In this article, we’ll review the benefits and perspectives of learning Java and probably the best way to master programming in it – through gamified education. 在本文中,我们将通过游戏化教育来回顾学习Java的好处和...

culing2941的博客 1111

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

《游戏学习》Java实现仿雷电游戏设计

2021年的金三银四一眨眼就到了,对于很多人来说是跳槽的好机会,大厂面试远没有我们想的那么困难,摆好心态,做好准备,你也可以的。另外,面试中遇到不会的问题不妨尝试讲讲自己的思路,因为有些问题不是考察我们的编程能力,而是逻辑思维表达能力;最后平时要进行自我分析与评价,做好职业规划,不断摸索,提高自己的编程能力和抽象思维能力。BAT面试经验实战系列:Spring全家桶+Redis等其他相关的电子书:源码+调优面试真题:《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》

2301_82242844的博客 871

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

通过构建安卓游戏学习 Java(一)

如果你完全不了解 Java、Android 或游戏编程,并且打算出版 Android 游戏以供娱乐或商业用途,但你不知道从哪里开始,那么这本书适合你。这本书也可以作为那些在其他平台上已经有经验的人的复习。Android 是增长最快的操作系统,Android 设备可以赋予、娱乐和教育全球。Android 使用最流行的编程语言之一——Java,这是一种高性能、安全、面向对象的语言。在每一章中,我们将在前一章学到的基础上构建,逐渐理解更高级的 Java 概念,并通过构建 Android 游戏来应用它们。

龙哥盟 866

【转】用游戏来学习Java技术(Robocode攻略)

转自 小众网友--skystar  Robocode(用游戏来学习Java技术还是用Java来玩游戏?)用你的JAVA编程技术来玩游戏吧!不会JAVA?那就用游戏来学习JAVA吧!什么是Robocode?记得在我还是初中的时候,就知道 AplleⅡ上有一个程序,用它来编写简单的机器人程序,然后相互作战。当时自己还完全不懂编程,总是向往着,那神秘的编程高手玩的游戏是怎样的?Roboc

路漫漫其修远,我哪里有时间去求索 1361

java单机小游戏资源包:轻松学习Java,享受游戏乐趣

java单机小游戏资源包:轻松学习Java,享受游戏乐趣 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 java单机小游戏资源包是一个集学习与娱乐于一体的开源项目。该项目专为Java编程爱好者设计,旨在通过一系列精心设计的单机游戏,帮助用户在轻松愉快的氛围中掌握Java编程技巧,提升逻辑思维能力。 项目技术分析 技术栈 本项目基于Java语言开发,游戏全部采用Java...

gitblog_06750的博客 360

学习java第8天,猜大小游戏

游戏规则:初始余额为30元,开始猜大小,猜1次2元 1.输入投注金额,输入1/2(大/小)猜大小 2.余额大于投注金额则开始游戏,余额不足则输入充值 3.公布中奖结果 4.结算中奖金额添加到账户余额 5.记录历史开奖记录

qq_42283582的博客 272
上一篇: 加入了开源项目jautogl: JautOGL Project
下一篇: 贪吃蛇0.1版
W1nt3rs
W1nt3rs 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄22年 977粉丝 301原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值