我正在尝试开发一种从[100] [100]矩阵中导入背景图像的游戏.矩阵将保持int值以与应在背景上绘制的内容相关联.循环将图像绘制到画布并根据用户的键输入更新它.然而,一切都是油漆和移动都很好,它很慢.是否有更好的方法来加载图像而不是我正在做的方式?

这是主要的游戏类:

package com.game.src.main;

import java.awt.Canvas;

import java.awt.Dimension;

import java.awt.Graphics;

import java.awt.GraphicsDevice;

import java.awt.GraphicsEnvironment;

import java.awt.event.KeyEvent;

import java.awt.image.BufferStrategy;

import java.awt.image.BufferedImage;

import java.io.IOException;

import javax.swing.JFrame;

public class Game extends Canvas implements Runnable{

static GraphicsEnvironment environment;

static GraphicsDevice device;

private static final long serialVersionUID = 1L;

public static final int WIDTH = 320;

public static final int HEIGHT = WIDTH / 12 * 9;

public static final int SCALE = 2;

public static final String TITLE = "fgfdsa";

private boolean running = false;

private Thread thread;

private Player p;

private Background b;

private Controller c;

private BufferedImage spriteSheet;

boolean isFiring = false;

public void init(){

BufferedImageLoader loader = new BufferedImageLoader();

try{

spriteSheet = loader.loadImage("/sprite_sheet_test.png");

}catch(IOException e){

e.printStackTrace();

}

requestFocus();

addKeyListener(new KeyInput(this));

c = new Controller();

p = new Player(getWidth() / 2, getHeight() / 2, this);

b = new Background(this);

}

private synchronized void start(){

if(running)

return;

running = true;

thread = new Thread(this);

thread.start();

}

private synchronized void stop(){

if(!running)

return;

running = false;

try {

thread.join();

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

System.exit(1);

}

public void run(){

init();

long lastTime = System.nanoTime();

final double amountOfTicks = 60.0;

double ns = 1000000000 / amountOfTicks;

double delta = 0;

int updates = 0;

int frames = 0;

long timer = System.currentTimeMillis();

while(running){

long now = System.nanoTime();

delta += (now - lastTime) / ns;

lastTime = now;

if(delta >= 1){

tick();

updates++;

delta--;

}

render();

frames++;

if(System.currentTimeMillis() - timer > 1000){

timer += 1000;

System.out.println(updates + " Ticks, Fps " + frames);

updates = 0;

frames = 0;

}

}

stop();

}

public void tick(){

p.tick();

b.tick();

c.tick();

}

public void render(){

BufferStrategy bs = this.getBufferStrategy();

if(bs == null){

createBufferStrategy(3);

return;

}

Graphics g = bs.getDrawGraphics();

b.render(g);

p.render(g);

c.render(g);

g.dispose();

bs.show();

}

public void keyPressed(KeyEvent e){

int key = e.getKeyCode();

switch(key){

case 37:

b.setX(5);

break;

case 38:

b.setY(5);

break;

case 39:

b.setX(-5);

break;

case 40:

b.setY(-5);

break;

case 32:

if(!isFiring){

c.addBullet(new Bullet(p.getX(), p.getY(), this));

isFiring = true;

}

}

}

public void keyReleased(KeyEvent e){

int key = e.getKeyCode();

switch(key){

case 37:

b.setX(0);

break;

case 38:

b.setY(0);

break;

case 39:

b.setX(0);

break;

case 40:

b.setY(0);

break;

case 32:

isFiring = false;

}

}

public static void main(String[] args){

Game game = new Game();

game.setPreferredSize(new Dimension(600, 600));

game.setMaximumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));

game.setMinimumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));

JFrame frame = new JFrame(game.TITLE);

frame.add(game);

frame.pack();

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setResizable(false);

frame.setLocationRelativeTo(null);

frame.setVisible(true);

environment = GraphicsEnvironment.getLocalGraphicsEnvironment();

device = environment.getDefaultScreenDevice();

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

game.start();

}

public BufferedImage getSpriteSheet(){

return spriteSheet;

}

}

这是用于将图像绘制到屏幕的背景类:

package com.game.src.main;

import java.awt.Graphics;

import java.awt.image.BufferedImage;

public class Background {

private BufferedImage grass;

private BufferedImage background;

private BufferedImage tree;

int[][] matrix;

Game game;

//original starting coordinates of matrix to be drawn

int setX = -3200;

int setY = -3200;

//integers used to update coordinates of the matrix to be drawn

int helpX = 0;

int helpY = 0;

public Background(Game game){

this.game = game;

// load matrix into matrix array

GetMatrix gm = new GetMatrix();

matrix = gm.getMatrix();

//import the sprite from game class

background = game.getSpriteSheet();

//call sprite sheet class

SpriteSheet ss = new SpriteSheet(background);

//get coordinates of grass image

grass = ss.grabImage(1, 1, 32, 32);

// get coordinates of tree image

tree = ss.grabImage(4, 1, 32, 32);

}

public void tick(){

//update the start pixel of the background

setX += helpX;

setY += helpY;

if(setX > 0)

setX = 0;

if(setX < -4500)

setX = -4500;

if(setY > 0)

setY = 0;

if(setY < -5340)

setY = -5340;

}

public void render(Graphics g){

int x = 0;

int y = 0;

for(int i = setX; i < setX + 6400; i +=64){

x = 0;

for(int j = setY; j < setY + 6400; j += 64){

switch(matrix[x][y]){

case 0: g.drawImage(grass, i, j, i + 64, j + 64,

0, 0, 32, 32, null);

break;

case 1:

g.drawImage(grass, i, j, i + 64, j + 64,

0, 0, 32, 32, null);

g.drawImage(tree, i, j, i + 64, j + 64,

0, 0, 32, 32, null);

}

x++;

}

y++;

}

}

//sets the background start coordinates from key input

public void setX(int x){

helpX = x;

}

public void setY(int y){

helpY = y;

}

}

java的游戏图片怎么加载_java游戏图像加载速度非常慢相关推荐

  1. angular 图片引入_推荐一个 angular 图像加载插件

    推荐一个简单的 Angular 图片加载插件:vgSrc,插件根据图片资源的不同加载状态,显示不同图片,亲测兼容IE-8. 使用 推荐使用 bower 加载: bower install vgSrc ...

  2. java的显示图片的控件_java Swing GUI 入门-图片和控件可视化

    java Swing GUI 入门-图片和控件可视化 觉得有用的话,欢迎一起讨论相互学习~ 加入一张图片 一个Imagelabel 设置居中,命名为logoLabel,Custom Create 打勾 ...

  3. Java处理图片后图片变小了_JAVA改变图片大小,该怎么处理

    JAVA改变图片大小 我实现了改变图片大小,但是分辨率有很大的影响,求教JAVA中的类或者算法解决这个问题,使之可以改变图片大小,同时不影响图片质量 java 图片 算法 类 分享到: ------解 ...

  4. java 时间加减_Java中时间加减的比较

    public class TestDate{ public static void main(String[] args){ try{ Date date=new Date(); DateFormat ...

  5. java 整数加减_Java计算长整数加减(字符串表示)

    1 /** 2 * Created by areful on 2019/11/133 */ 4 public classCalcStringNumber {5 private static final ...

  6. java文件名加时间戳_Java处理文件名加时间戳

    Overview 第一个项目中,输入框内的sequence传入后台,并在Action中用String类型的seq接收,继而处理成txt文件形式保存.由于以后的项目均要频繁使用io以及这种中间处理方式, ...

  7. android h5游戏图片不缓存,H5小游戏资源缓存方法与流程

    本发明涉及H5资源缓存领域,尤其涉及H5小游戏资源缓存方法. 背景技术: 随着移动互联网的发展和手机硬件性能的不断提升,H5小游戏这种不需要下载安装即可使用的全新游戏应用得到了爆发式发展.这种用完即走 ...

  8. java绘制半透明图片_如何使绘制的图像在Java中透明

    正如另一个提到的答案,最简单的方法可能是简单地使用具有透明背景的PNG图像(您可以使用像GIMP这样的图像编辑器创建这些图像).或者,如果您仅限于具有纯色背景的PNG图像,以下是如何将PNG中的给定颜 ...

  9. java实现将图片转换成ascii字符文本图像

    基本原理 实现原理比较简单,计算图像中像素的灰度值,使用一些ascii字符,如"@#&$%*o!;.",粗略代表几个梯度的灰度值,根据灰度值计算需要填充的ASCII字符,假 ...

最新文章

  1. linux php版本升级_玩转Linux,介绍一个强大的Linux服务器管理面板,比宝塔更强...
  2. Python使用技巧
  3. 如何给Blazor.Server加个API鉴权?
  4. ubuntu vim8.0源码安装
  5. Python机器学习:决策树003使用信息熵寻找最优划分
  6. html5仿微博弹出,JS 仿腾讯发表微博的效果代码
  7. Linux操作系统 (二)下载以及安装
  8. 最全的Vim操作快捷键
  9. 斯坦福大学CS224N-深度学习与自然语言处理:课程1-笔记
  10. Matlab之min()、max()函数(求最小、最大值)
  11. java.lang.IllegalArgumentException: Scrapped or attached views may not be recycled.
  12. matlab gram schmidt,如何在 MATLAB 中用 行代码实现 Gram-Schmidt 正交化
  13. 规范小区电瓶车充电桩的分布保障充电安全
  14. 爬虫豆瓣读书top250,保存为本地csv文件,可用excel查看(具体步骤和容易遇到的坑)
  15. 如何在Windows server 2012配置DHCP服务器
  16. 小米手机安装推特后频繁闪退
  17. Spring Boot面试必问:启动流程
  18. 机器学习:最大熵模型
  19. Redis Latency Monitoring 功能简述
  20. 大盘最可能走出的两种局势(转 封起De日子)

热门文章

  1. java分布式锁解决方案 redisson or ZooKeeper
  2. android NinePatch图片制做
  3. 字节跳动pest分析_字节跳动小程序分析:前景及优势都是什么?
  4. Java 最常见的 100+ 面试题和答案:面试必备
  5. 各计算机语言之父,四大编程语言之父
  6. 用计算机创造的音乐,计算机音乐创作(普通组)
  7. 快速交付 敏捷开发的特点_什么是敏捷开发?它有什么特点
  8. python 数据库订阅_发布/订阅数据库和客户端编程数据库有什么区别?
  9. 文件标识符必须为双精度类型的整数值标量_【翻译】VTK官方文档 - vtk文件格式
  10. winxp 连接linux ftp,Linux和XP之间使用FTP互传文件