You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java无外部库自制游戏:背景渲染覆盖玩家的解决求助

解决背景渲染覆盖玩家的问题

嘿,我一眼就看出问题出在哪了——渲染顺序搞反啦!你现在的代码是先渲染玩家等游戏对象,再渲染背景,这就导致背景画在了玩家的上方,把玩家完全挡住了。

问题根源

看你的游戏主类render方法就能发现问题:

private void render() {
    // render the Game
    BufferStrategy bs = this.getBufferStrategy();
    if(bs == null) {
        this.createBufferStrategy(3);
        return;
    }
    Graphics g = bs.getDrawGraphics();
    g.setColor(Color.black);
    g.fillRect(0,0,WIDTH,HEIGHT);
    
    handler.render(g); // 先渲染玩家等游戏对象
    hod.render(g);     // 再渲染背景,自然会覆盖玩家
    
    g.dispose();
    bs.show();
}

修复方案

只需要调换两个渲染方法的顺序,先渲染背景,再渲染玩家等游戏对象:

private void render() {
    // render the Game
    BufferStrategy bs = this.getBufferStrategy();
    if(bs == null) {
        this.createBufferStrategy(3);
        return;
    }
    Graphics g = bs.getDrawGraphics();
    g.setColor(Color.black);
    g.fillRect(0,0,WIDTH,HEIGHT);
    
    hod.render(g);     // 先画背景,让它处于最底层
    handler.render(g); // 再画玩家等游戏对象,它们会叠加在背景上面
    
    g.dispose();
    bs.show();
}

原理说明

在2D图形渲染里,元素的显示层级完全由绘制顺序决定:先画的元素会被后画的元素覆盖。所以正确的渲染顺序应该是从后到前依次绘制:

  • 最先画最底层的背景
  • 然后画游戏中的实体(玩家、子弹、敌人等)
  • 最后画UI元素(比如分数、操作按钮)

这样就能保证每个层级的元素都能正确显示,不会出现背景挡住玩家的情况啦!

附上你提供的相关代码方便参考:

玩家渲染代码

@Override 
public void render(Graphics g) { 
    int bulletcount = 0; 
    //render player 
    g.setColor(color); 
    g.fillRect(x,y,32,32); 
    if(shooting) { 
        handler.add(new bullet(x + 8, y - 24, ID.bullet, handler)); 
        bulletcount++; 
    } 
}

背景渲染代码

public class background extends GameObject{ 
    private int width; 
    private Random random = new Random(); 
    public background(int x, int y , ID id,Handler handler){ 
        super(x,y,id,handler); 
        valy = 2; 
        width = getWidth(x,800); 
    } 
    public void tick() { 
        y += valy; 
        if(y>650) handler.remove(this); 
    } 
    public void render(Graphics g) { 
        g.setColor(Color.white); 
        g.fillRoundRect(x,y,width,10,1,1); 
    } 
    public int getWidth(int x,int width1){ 
        int wid; 
        while(true){ 
            if((width - x) > 35) { 
                wid = random.nextInt((width-x-35)); 
                break; 
            } else{ 
                x -= 10; 
            } 
        } 
        return wid; 
    } 
}

内容的提问来源于stack exchange,提问作者Khushit Shah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:30:05