如何运用java程序设计进行键盘控制游戏

下面我们学习使用键盘来控制图形的运动。

在上一节的教程中,如何运用java程序设计认识了碰撞检测,那么现在我们在深入去制作,那么就是对于键盘控制游戏(相当于按键一样)。

在游戏中常常需要用键盘进行对游戏的控制,例如超级玛丽,贪吃蛇等等,这些游戏都需要我们也能够键盘去控制,那么我们现在学习一下,如何用JAVA程序设计键盘控制游戏。

1.新建一个java项目Ball2:

import java.awt.*;

import java.awt.image.*;

import java.util.*;

public class MyPanel extends Panel implements Runnable {

private int x;

private int y;

private int dx,dy;

private int diameter;

private int width;

private int height;

private Image im;

private Graphics dbg;

public MyPanel() {

x=50;

y=50;

dx=10;dy=10;

diameter=50;

width=300;

height=200;

setPreferredSize(new Dimension(width, height));//设置组件的大小

}

public void gamePaint() { //前屏绘制

Graphics g;

try {

g = this.getGraphics(); //获取当前屏幕的Graphics对象

if (g != null && im != null) {

g.drawImage(im, 0, 0, null);//将图像缓冲区中的内容复制到前屏缓冲区,显示出来

}

g.dispose();//释放当前屏幕的Graphics对象

} catch (Exception e) {

}

}

public void gameRender() { //离屏绘制

if (im == null) {

im = createImage(width, height);

if (im == null) {

System.out.println("im is null");

} else {

dbg = im.getGraphics();

}

}

dbg.setColor(Color.WHITE);

dbg.fillRect(0, 0, width, height);//用底色矩形填充画版,擦去图案

dbg.setColor(Color.blue);

dbg.fillOval(x, y, diameter, diameter); //画出椭圆

}

public void gameUpdate() { //更新游戏逻辑

x=x+dx;

y=y+dy;

if((x<0)||(x>width-diameter)){

dx=-dx;

}

if((y<0)||(y>height-diameter)){

dy=-dy;

}

}

public void run() {

while(true){

gameUpdate();

gameRender();

gamePaint();

//以下我们用一个延时函数代替空循环来延时,sleep(10)中的数字代表延时毫秒,数字越小越快

try {

Thread.sleep(200);} //括号里面的10代表10毫秒,也就是0.001秒,可以该成你需要的时间

catch (InterruptedException e) {

e.printStackTrace();}

}

}

}

2.然后新建一个MyPanel类,代码如下:

import java.awt.*;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.awt.image.*;

import java.util.*;

public  class MyPanelextends Panel implements Runnable, KeyListener  {

private int x;

private int y;

private int dx,dy,direction;

private int diameter;

private int width;

private int height;

private Image im;

private Graphics dbg;

privateThreadgamethread;

public MyPanel() {

x=50;

y=50;

dx=10;

dy=10;

diameter=50;

width=500;

height=500;

setPreferredSize(new Dimension(width, height));//设置组件的大小

this.setFocusable(true);//设置焦点

this.requestFocus();//获取焦点

this.addKeyListener(this);//添加键盘监听事件

}

public void gamePaint() { //前屏绘制

Graphics g;

try {

g = this.getGraphics(); //获取当前屏幕的Graphics对象

if (g != null && im != null) {

g.drawImage(im, 0, 0, null);//将图像缓冲区中的内容复制到前屏缓冲区,显示出来

}

g.dispose();//释放当前屏幕的Graphics对象

} catch (Exception e) {

}

}

public void gameRender() { //离屏绘制

if (im == null) {

im = createImage(width, height);

if (im == null) {

System.out.println("im is null");

} else {

dbg = im.getGraphics();

}

}

dbg.setColor(Color.WHITE);

dbg.fillRect(0, 0, width, height);//用底色矩形填充画版,擦去图案

dbg.setColor(Color.blue);

dbg.fillOval(x, y, diameter, diameter); //画出椭圆

}

public void gameUpdate() { //更新游戏逻辑

switch (direction){

case 1:

y=y+dy;//向下移

direction=0; //移动情况清零

break;

case 2:

y=y-dy; //向上移

direction=0;//移动情况清零

break;

case 3:

x=x+dx;//向右移

direction=0;//移动情况清零

break;

case 4:

x=x-dx;//向左移

direction=0;//移动情况清零

break;

}

}

public void keyPressed(KeyEvent e){

int keycode = e.getKeyCode();

if (keycode ==KeyEvent.VK_DOWN)

direction=1; //用1代表下

if (keycode ==KeyEvent.VK_UP)

direction=2;//用2代表上

if (keycode == KeyEvent.VK_RIGHT)

direction=3;//用3代表右

if (keycode == KeyEvent.VK_LEFT)

direction=4;//用4代表左

}

public void keyTyped(KeyEvent e){

}

public void keyReleased(KeyEvent e){

}

public void run() {

while(true){

gameUpdate();

gameRender();

gamePaint();

//以下我们用一个延时函数代替空循环来延时,sleep(10)中的数字代表延时毫秒,数字越小越快

try {

Thread.sleep(10);} //括号里面的10代表10毫秒,也就是0.001秒,可以该成你需要的时间

catch (InterruptedException e) {

e.printStackTrace();}

}

}

publicvoidgameStart(){

gamethread= new Thread(this);

gamethread.start();

}

}

上面代码可以当成新的游戏框架,它加上了键盘的监控事件。

五.练习:

根据上面的题目,做出一个动画,显示文件夹中的pic1.gif图像,用鼠标的上下左右能控制它的移动,而且移动到窗口边缘,就不能再继续移动。

提示:画图代码:

Imageimage=getToolkit().getImage("pic1.gif");//先载入图片

dbg.drawImage(image,x,y,100,130,this);//在x,y坐标处显示宽高为130的图像。

小编结语:其实对于这一节教程,运用JAVA程序游戏设计进行键盘控制游戏,设计起来不难,我们可以用一个游戏框架就可以了,那么难的是,你如何去修改你想要的类型。

java 键盘 映射 控制游戏_如何运用JAVA程序设计进行键盘控制游戏相关推荐

  1. 纯java语言做rpg游戏_【纯JAVA语言做个RPG游戏】2.游戏界面及角色移动的基本实现...

    继上次做的地图编辑器,我大致的做了一个4000X4000的游戏地图数组,不过只画了一部分,以后要加什么新东西继续编辑这个地图就行了,保存在了一个文件中. 现在便可以继续下一步,做出游戏的大致界面了. ...

  2. java小恐龙游戏_用Python实现谷歌的小恐龙游戏

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 谷歌流量器中有个很有名的彩蛋:当你网络出现问题时,就会出现一个"小恐龙游戏&quo ...

  3. 根据斗破苍穹改编的Java游戏_不仅《斗破苍穹》改编动漫游戏,这个作者才是游戏IP大师!...

    很多RPG游戏都是根据知名小说改编,吃桃鸽今天就挑出几部自己玩过游戏,还看过原文的小说来小评一下. <诛仙> <诛仙>这本小说刚出来的时候,吃桃鸽当时还在用诺基亚,上课的时候偷 ...

  4. python pygame模块怎么写游戏_使用 Python 和 Pygame 模块构建一个游戏框架

    这系列的第一篇通过创建一个简单的骰子游戏来探究 Python.现在是来从零制作你自己的游戏的时间. 在我的这系列的第一篇文章 中, 我已经讲解如何使用 Python 创建一个简单的.基于文本的骰子游戏 ...

  5. java 面试题合集_撩课-Java面试题合辑1-50题

    1.简述JDK.JRE.JVM? 一.JDK JDK(Java Development Kit) 是整个JAVA的核心, 包括了Java运行环境(Java Runtime Envirnment), 一 ...

  6. java中io是什么_深入理解Java中的IO

    深入理解Java中的IO 转载自:http://blog.csdn.net/qq_25184739/article/details/51205186 本文的目录视图如下: Java IO概要 a.Ja ...

  7. 深入java虚拟机 第四版_深入理解Java虚拟机-常用vm参数分析

    Java虚拟机深入理解系列全部文章更新中... https://blog.ouyangsihai.cn/shen-ru-li-jie-java-xu-ni-ji-java-nei-cun-qu-yu- ...

  8. java视频为什么这么多_为什么看java教学视频教的都是javase,两者难道语言相同吗?...

    Java 分类 Java SE(Java Platform Standard Edition) :Java平台标准版.主要用于桌面应用程序的开发,是Java技术的核心,提供基础 Java开发工具.执行 ...

  9. java的应用程序开发_开发一个Java应用程序(1)

    开发一个Java应用程序(1) App Engine上的Java Web应用程序通过Java Servlet标准接口与应用程序服务器交互.一个应用程序由一个或多个类组成,这些类都扩展自一个servle ...

  10. java 线程中创建线程_如何在Java 8中创建线程安全的ConcurrentHashSet?

    java 线程中创建线程 在JDK 8之前,还没有办法在Java中创建大型的线程安全的ConcurrentHashSet. java.util.concurrent包甚至没有一个名为Concurren ...

最新文章

  1. Vue.js slots: 为什么你需要它们?
  2. 71页《乌镇智库:全球人工智能发展报告(2018)》PDF下载
  3. Gitlab完整搭建手册+排错
  4. [转]关于int整形变量占有字节问题
  5. blockingqueue java_记录 Java 的 BlockingQueue 中的一些坑
  6. python实现文件上传功能_python实现上传下载文件功能
  7. 【ArcGIS风暴】基于ArcGIS空间分析功能研究渭河流域镇驻地空间分布格局
  8. java isempty_Optional.isEmpty()即将加入Java吗?
  9. 大数据之Hive教程
  10. 2013年度开源社区年会,3W咖啡免费让你更多接触开源
  11. Skywalking-02:如何写一个Skywalking trace插件
  12. docker入门与实战pdf_Docker-Kubernetes-k8s微服务实战视频教程+Docker技术入门精讲课程资料分享...
  13. iOS设计模式之备忘录模式
  14. soapui使用教程2-属性与脚本
  15. 国二考试报Wps还是c语言,2021 年全国计算机二级增考 WPS Office
  16. 第三章 平稳时间序列模型
  17. VOC2007数据集的下载和解压
  18. 中国土地市场销售规模状况与投资战略研究报告2022版
  19. 空间域和频域结合的图像增强技术及实现
  20. 捋一捋Python中的List(下)

热门文章

  1. 基于随机森林算法的葡萄酒种类识别
  2. 37.softmax多元逻辑回归
  3. 人员-组织 结构 数据库关系设计
  4. 计算机报名503,503 service temporarily unavailable是什么意思【解决方法】
  5. 消息队列返回错误:Resource temporarily unavailable
  6. 缓解眼睛疲劳:按摩+复调钢琴曲
  7. 学了这么多年精益思想,居然不知道还有第八种浪费 | IDCF
  8. 用基带等效的方式仿真8-DPSK载波调制信号在AWGN信道下的误码率和误比特率,并与理论值相比较。
  9. 查询计算机物理地址指令,怎么查询mac地址命令_如何查mac地址
  10. laravel admin里百度编辑器自定义路径和文件名