平稳快速移动并重绘() [英] Smooth fast move and repaint()

查看:121
本文介绍了平稳快速移动并重绘()的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在写简单的太空入侵者,并且在移动船舶时遇到问题。基本上我改变船的位置,然后 repaint()。如果变化很大,那就更像跳跃而不是移动。如果更改是小动画更平滑但变慢。有没有解决方案?



我使用JPanel并使用 paintComponent() b
@edit:我不太了解我的电脑如何顺利地显示正常(新)游戏,并且简单的绘图图像具有较低的帧速率。这就是为什么我认为这是软件问题而不是硬件问题。所以,也许我会做一些影响帧率的事情。

@edit:好的,粘贴一些代码,但要理解 - 大约两周前我开始使用java和一般编程图形。

  package pl.spaceInvaders; 
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;
import javax.swing.Timer;

类GamePanel扩展JPanel {
SpaceInvadersMain sim;
private Image dbImage;
私人图形dbg;
int moveDistHor = 0;
int moveDistVer = 0;
int shipMove = 0;
int dir = 1;

GamePanel(SpaceInvadersMain sim){
this.sim = sim;
setFocusable(true);
moveMonsters();
MyKeyListener mkl = new MyKeyListener();
addKeyListener(mkl);
Timer t = new Timer(500,new ActionListener(){
public void actionPerformed(ActionEvent e){
if(moveDistHor< 304){moveDistHor + = 16 * dir;}
)if(moveDistHor == 304 || moveDistHor == 0){dir * = - 1; moveDistHor + = 16 * dir; moveDistVer + = 16;}
moveMonsters(); $ b $ moveProjectiles();
detectColissions();
repaint();
}
});
t.start();
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
setBackground(Color.white);
Graphics2D g2 =(Graphics2D)g;
Insets insets = getInsets();
g2.translate(insets.left,insets.top); (int i = 0; i< SpaceInvadersMain.M_WIDTH; i ++){
//绘制怪物
$(b)if(sim.monsters [i] [j] .ifExists()){
if((moveDistHor + moveDistVer)%32 == 0)
g2.drawImage(sim.monsters [i] [j] .img,sim.monsters [i] [j] .posX,sim.monsters [i] [j] .posY,32,32,null);
else
g2.drawImage(sim.monsters [i] [j] .img2,sim.monsters [i] [j] .posX,sim.monsters [i] [j] .posY,32 ,32,null);
}}
}
//绘制出货
if(sim.ship.exists())g2.drawImage(sim.ship.img,sim.ship.getPosX() ,sim.ship.getPosY(),32,32,null);

protected void detectColissions(){
// TODO自动生成方法存根

$ b保护void moveProjectiles(){
// TODO自动生成的方法存根

$ b $保护void moveShip(){
if(sim.ship.posX + shipMove> 0&& sim.ship。 posX + shipMove <750){
sim.ship.posX + = shipMove;
shipMove = 0;


$ b protected void moveMonsters(){
for(int i = 0; i< SpaceInvadersMain.M_WIDTH; i ++){
for( int j = 0; j< SpaceInvadersMain.M_HIGHT; j ++){
if(sim.monsters [i] [j] .ifExists()){
sim.monsters [i] [j] .posX = 10 + I * 48 + moveDistHor;
sim.monsters [i] [j] .posY = 10 + j * 48 + moveDistVer;
$ b $}}
}
}
private class MyKeyListener实现KeyListener {
$ b $ @覆盖
public void keyPressed(KeyEvent e ){
switch(e.getKeyCode()){
case KeyEvent.VK_LEFT:
//System.out.println(\"Arrow left caught);
shipMove = -10;
休息;
case keyEvent.VK_RIGHT:
//System.out.println(\"Arrow right caught);
shipMove = 10;
休息;
}
moveShip();
repaint();
}

@Override
public void keyReleased(KeyEvent e){

}

@Override
public void keyTyped(KeyEvent e){


}

}

}

解决方案

The Space Invaders - Java中的2D渲染 教程可能会有帮助,例如使用显式 BufferStrategy


I'm writing easy space invaders and have a problem with moving ship. Basically I change position of ship and then repaint(). If the change is big it is more like jumping than moving. If the change is small animation is smoother but getting slower. Is there any solution?

I'm drawing on JPanel and using paintComponent().

@edit: I don't really understand how my pc can display normal(new) games smoothly and with simple drawing image has low frame rate. It is why i thought it was software problem rather than hardware. So maybe i do something what affects frame rate.

@edit: Ok, pasting some code, but be understanding - I started with java and generally programming graphics about 2 weeks ago.

    package pl.spaceInvaders;
    import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JPanel;
import javax.swing.Timer;

class GamePanel extends JPanel{
SpaceInvadersMain sim;
private Image dbImage; 
private Graphics dbg; 
int moveDistHor=0;
int moveDistVer=0;
int shipMove=0;
int dir=1;

GamePanel(SpaceInvadersMain sim){
    this.sim=sim;
    setFocusable(true);
    moveMonsters();
    MyKeyListener mkl = new MyKeyListener();
    addKeyListener(mkl);
    Timer t = new Timer(500, new ActionListener() {
          public void actionPerformed(ActionEvent e) {
              if(moveDistHor<304){moveDistHor+=16*dir;}
              if(moveDistHor==304 || moveDistHor==0){dir*=-1;moveDistHor+=16*dir;moveDistVer+=16;}
              moveMonsters();
              moveProjectiles();
              detectColissions();
              repaint();
          }
       });
    t.start();
}
@Override
public void paintComponent(Graphics g){
    super.paintComponent(g);
    setBackground(Color.white);
    Graphics2D g2 = (Graphics2D)g;
    Insets insets = getInsets();
    g2.translate(insets.left, insets.top);
    // drawing monsters
    for(int i=0;i<SpaceInvadersMain.M_WIDTH;i++){
        for(int j=0;j<SpaceInvadersMain.M_HIGHT;j++){
            if(sim.monsters[i][j].ifExists()){
            if((moveDistHor+moveDistVer)%32==0) 
                g2.drawImage(sim.monsters[i][j].img, sim.monsters[i][j].posX, sim.monsters[i][j].posY, 32, 32, null);
            else 
                g2.drawImage(sim.monsters[i][j].img2, sim.monsters[i][j].posX, sim.monsters[i][j].posY, 32, 32, null);
            }}
    }
    //drawing ship
    if(sim.ship.exists()) g2.drawImage(sim.ship.img, sim.ship.getPosX(), sim.ship.getPosY(),32,32,null);
}
protected void detectColissions() {
    // TODO Auto-generated method stub

}
protected void moveProjectiles() {
    // TODO Auto-generated method stub

}
protected void moveShip() {
    if(sim.ship.posX+shipMove>0 && sim.ship.posX+shipMove<750) {
        sim.ship.posX+=shipMove;
        shipMove=0;
    }

}
protected void moveMonsters(){
    for(int i=0;i<SpaceInvadersMain.M_WIDTH;i++){
        for(int j=0;j<SpaceInvadersMain.M_HIGHT;j++){
            if(sim.monsters[i][j].ifExists()){
                 sim.monsters[i][j].posX=10+i*48+moveDistHor;
                 sim.monsters[i][j].posY=10+j*48+moveDistVer;

            }}
    }
}
private class MyKeyListener implements KeyListener{

    @Override
    public void keyPressed(KeyEvent e) {
        switch(e.getKeyCode()){
        case KeyEvent.VK_LEFT:
            //System.out.println("Arrow left caught");
            shipMove=-10;
            break;
        case KeyEvent.VK_RIGHT:
            //System.out.println("Arrow right caught");
            shipMove=10;
            break;
        }
        moveShip();
        repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }

    @Override
    public void keyTyped(KeyEvent e) {


    }

}

}

解决方案

The Space Invaders - 2D Rendering in Java tutorial may be helpful as an example using an explicit BufferStrategy.

这篇关于平稳快速移动并重绘()的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆