当前位置: 首页 > 面试题库 >

平滑快速移动并重新绘制()

裴建华
2023-03-14
问题内容

我正在写容易的太空入侵者,并且在移动船只时遇到问题。基本上我先改变船的位置,然后再改变repaint()。如果变化很大,那就更像是跳跃而不是移动。如果更改很小,则动画会更平滑,但会变得更慢。有什么解决办法吗?

我正在使用JPanel并使用paintComponent()

@edit:我不太了解我的电脑如何流畅地显示普通(新)游戏,而简单的绘图图像的帧率却很低。这就是为什么我认为这是软件问题而不是硬件问题。因此,也许我做了一些会影响帧速率的事情。

@edit:好的,粘贴了一些代码,但要理解-我从Java开始,大约在2周前开始对图形进行编程。

    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) {


    }

}

}


问题答案:

Java 教程中的 Space
Invaders-2D渲染

教程可能会非常有用,例如使用显式的BufferStrategy



 类似资料:
  • 移动互联快速开发平台 采用Mongodb为底层数据库:数据设计随需而变; 采用Mongodb集群,支撑大数据量,大并发实时查询,便于扩展; 采用SpringMongodb简化开发,简单得令人发指; 采用SpringRest提供JSON的输出,支持各种转换; 提供程序整合、兼容中文、跨域JSONP的支持; 进行了大数据量的压力测试,参数的最优配置; 各种最佳实践。 HTML5 快速开发的前端架构,专

  • 我正试图找到一种方法,以编程方式在合理的时间和移动量内解决一个24块的滑动拼图。下面是我正在描述的谜题中已解决状态的一个示例: 我已经发现IDA*算法可以很好地完成15个拼图(4x4网格)。IDA*算法能够在非常合理的时间内找到任何4x4滑动拼图的最小移动次数。我对这段代码进行了修改,以测试4x4滑动拼图,并通过使用PyPy进一步显著减少了运行时间。不幸的是,当这段代码被改编为5x5滑动拼图时,它

  • 问题内容: 我有我的.. 我加入的一个。当页面内容为屏幕时,它起作用。但是当我没有收到太多数据并且不是时,就会出现问题,该功能无法正常工作。:( 我没有使用。 有人可以帮我解决这个问题吗? 问题答案: var alwaysBounceVertical:Bool //默认为NO。如果是,并且反弹为是,即使内容小于界限,也允许垂直拖动

  • 问题内容: 我有以下绘制图形的简单脚本: 就目前而言,这条线从一条直线到另一条直线看起来不错,但在我看来可能会更好。我想要的是使两点之间的线变得平滑。在中,我会用绘制。 在PyPlot中有一种简单的方法吗?我找到了一些教程,但是它们看起来都相当复杂。 问题答案: 你可以自己整理数据: scipy 0.19.0中不推荐使用spline,请改用BSpline类。 从切换到复制并不是简单的复制/粘贴操作

  • 我目前正在通过斯坦福大学的编程方法论(2008)课程学习Java。我正在试图创建游戏突破,并试图目前动画桨,这是一个GRect类型的对象。这是我的代码: 问题是,如果我用鼠标移动拨片,它会很好地跟随,比我用键盘移动它要流畅得多。改变移动()方法中的值只会改变拨片移动的速度。 我尝试过谷歌搜索,人们做的一件事是逐渐增加和减少划桨移动的速度,但我不确定如何通过这个库正确实现这一点。以下是我的尝试: 在

  • 我正在处理一个应用程序,它以透明的锚窗格开始(没有标题栏和圆角)。我想要能够拖动和移动窗口周围。我已经让它工作了,但是当我点击它时,窗口会向上弹到你从中心拖动的地方,而不是你点击的地方。 CSS: main.java: 控制器: 我有一种感觉,我需要说明光标在哪里,但我不确定如何。我是正确的还是我遗漏了一些更容易的东西?