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
相关产品推荐
相关产品推荐

