2014-06-17 36 views
0

我正在用Java编写JApplet,但是配音缓冲不会消除闪烁!Java Applet_Dubble缓冲不起作用

我该怎么办?

这是代码的重要组成部分,我想(告诉我,如果你需要了解更多,请):

// Background (dubble buffering) 
    private Image backbuffer; 
    private Graphics backg; 

//Init method 
      // Dubble-Buffering 
     backbuffer = createImage(getWidth(), getHeight()); 
     backg = backbuffer.getGraphics(); 
     backg.setColor(this.getBackground()); 

//Overrided update method 
     public void update(Graphics g) { 
      g.drawImage(backbuffer, 0, 0, this); 
      getToolkit().sync(); 
     } 

我感谢所有帮助我能! :)

+0

'Swing'是[双默认缓冲](http://docs.oracle.com/javase/tutorial /extra/fullscreen/doublebuf.html),恕我直言。为什么手动使用'update()'方法?是什么促使你做出这个决定?关于你想要完成什么的一些想法,对你的想法以及未完成的工作或以何种方式会有很大的帮助? –

+0

'Java Docs Container' Class的一个小引用声明:__“更新容器,将更新转发给这个容器的任何轻量级组件,如果这个方法被重新实现,super.update(g)应该被调用轻量级组件被正确渲染,或者直接调用paint(g)。如果一个子组件被g中的当前剪裁设置完全剪裁,update()将不会被转发给该子组件。“__ –

+0

对不起,但我对Java游戏编程颇为陌生,所以我只是试着解决这个问题。显然你是对的,因为它根本不起作用,但我应该如何修复闪烁?你需要看到所有的代码? –

回答

0

我做了一个MCVE,让你更好地了解这个问题(感谢Andrew Thompson)!

“主” 级:

import java.awt.Color; 
import java.awt.Font; 
import java.awt.Graphics; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JApplet; 
import javax.swing.JButton; 
import javax.swing.Timer; 

public class Test extends JApplet implements ActionListener { 

JButton start; 

int delay; 
Timer tm; 

// Falling balls 
int n; // Total balls 
Ball[] ball; // Array with the balls in 

int score; 

// The amount of balls falling at the same time (increases by one every 
// 10:th score) 
int ballNr; 

// Comment to the game 
String comment; 

public void init() { 

    this.setLayout(null); 
    this.setSize(600, 500); 
    this.getContentPane().setBackground(Color.cyan); 
    this.setFocusable(true); 

    score = 0; 
    ballNr = 3; 
    comment = "Avoid the balls!"; 

    // Buttons 
    start = new JButton("START"); 
    add(start); 
    start.setBounds(0, 400, 200, 100); 
    start.addActionListener(this); 

    // The timer 
    delay = 12; 
    tm = new Timer(delay, this); 

    // The falling balls 
    n = 12; // Number of balls in total 
    ball = new Ball[n]; 
    // Declaring twelve new instances of the ball-object with a 
    // "reference array" 
    for (int i = 0; i < n; i++) { 
     ball[i] = new Ball(); 
    } 
} 

// Paint-method // 
public void paint(Graphics g) { 
    super.paint(g); 

    // Every 10:th score, the game adds one ball until you reach 100 = 
    // win! (ballNr + (int)(score * 0.1) -> ballNr increases by one 
    // every 10:th score 
    for (int i = 0; i < ballNr + (int) (score * 0.1); i++) { 
     // Score can't be higher than 100 
     if (score < 100) { 
      g.setColor(ball[i].getCol()); 
      g.fillOval(ball[i].getXLoc(), ball[i].getYLoc(), 
        ball[i].getSize(), ball[i].getSize()); 
     } 
    } 

    // Draw the score and the comment 
    g.setColor(Color.black); 
    g.setFont(new Font("Arial", Font.BOLD, 24)); 
    g.drawString("SCORE: " + score, 440, 40); 

    g.setColor(Color.red); 
    g.setFont(new Font("Arial", Font.BOLD + Font.ITALIC, 28)); 
    g.drawString(comment, 0, 40); 

} 

// ACTIONLISTENER // 
public void actionPerformed(ActionEvent e) { 

    if (e.getSource() == start) { 
     tm.start(); 
     this.requestFocusInWindow(); // Make the runner component have focus 
    } 

    // Every 10:th score, the game adds one ball until you reach 100 = 
    // win! (ballNr + (int)(score * 0.1) -> ballNr increases by one 
    // every 10:th score 
    for (int i = 0; i < ballNr + (int) (score * 0.1); i++) { 
     // Score can't pass 100, because then you have won the game 
     if (score < 100) { 
      ball[i].setYLoc(ball[i].getYLoc() + ball[i].getVel()); 
     } 
    } 

    // If any ball is out of bounds (then the score increases by one) 
    for (int i = 0; i < n; i++) { 
     if (outOfBounds(ball[i])) { 
      ball[i] = new Ball(); 
     } 
    } 
    repaint(); 
} 

// If the ball is out of the screen 
public boolean outOfBounds(Ball ball) { 
    if (ball.getYLoc() >= 500) { 
     score++; 
     return true; 
    } else { 
     return false; 
    } 
} 

// Updates new balls 
public void updateBalls() { 
    for (int i = 0; i < n; i++) { 
     ball[i] = new Ball(); 
    } 
} 
} 

子类

import java.awt.Color; 
import java.util.Random; 

public class Ball { 
// Private variables 
private Random r; // Generating random positions and 
        // sizes; 
private int size; // Size of the ball 
private int vel; // Ball velocity 
private int nrOfCol; // Color code (see ballColor-method) 
private Color col; 
private int xLoc; 
private int yLoc; 

// Constructor 
public Ball() { 
    r = new Random(); 
    size = r.nextInt(40) + 10; // 10px - 50 px 
    vel = r.nextInt(6) + 1; // Speed btw 1-5 px/delay 
    nrOfCol = r.nextInt(8) + 1; // Specific nr from 1-9 
    col = ballColor(); 
    xLoc = r.nextInt(550); 
    yLoc = 0;} 

public Ball(int xPos, int yPos, int size, int vel, Color col) { 
    this.xLoc = xPos; 
    this.yLoc = yPos; 
    this.size = size; 
    this.vel = vel; 
    this.col = col; 
} 

// A method to generate different colors of the balls 
public Color ballColor() { 
    Color col; 
    switch (nrOfCol) { 
    case 1: 
     col = Color.black; 
     break; 
    case 2: 
     col = Color.red; 
     break; 
    case 3: 
     col = Color.green; 
     break; 
    case 4: 
     col = Color.yellow; 
     break; 
    case 5: 
     col = Color.pink; 
     break; 
    case 6: 
     col = Color.magenta; 
     break; 
    case 7: 
     col = Color.white; 
     break; 
    case 8: 
     col = Color.orange; 
     break; 
    case 9: 
     col = Color.blue; 
     break; 
    default: 
     col = Color.black; 
     // All colors except cyan as it is the background color 
    } 
    return col; 
} 

// Getters & setters 

public int getXLoc() { 
    return xLoc; 
} 

public int getYLoc() { 
    return yLoc; 
} 

public void setYLoc(int y) { 
    yLoc = y; 
} 

public int getSize() { 
    return size; 
} 

public int getVel() { 
    return vel; 
} 

public Color getCol() { 
    return col; 
} 
}