JAVA: 播放器的背景渲染?
JAVA: background rendeing over the player?
我正在 JAVA 中构建我的第一个非常基础的游戏,没有使用任何其他外部库。
我遇到的问题是
你可以看到背景渲染在播放器上我该如何解决
播放器渲染代码如下
@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;
}
}
主游戏class可以看到执行流程的顺序
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); //handler is rendering every object in game
g.dispose();
bs.show();
}
private void tick() {
//update Game
handler.tick();
hod.tick();
spawner.tick(); // background is generating in spawner class.
}
我知道用这么少的代码来说明问题对你们所有人来说都很难。但我对这个庞大而强大的社区充满信心。
提前致谢。不要犹豫编辑并指出我的错误谢谢!
如果我的代码正确,背景将在渲染播放器后生成,这会导致背景位于播放器之上。在调用 hod.tick() 之前,我会尝试调用 spawner.tick()(我猜背景来自给定的代码注释)。希望这应该能解决这个问题。
private void tick() { //update Game
spawner.tick();
handler.tick();
hod.tick();
}
我刚刚有了解决方案!
问题出在 handler.render(g);方法:- 以下是;
private void render(Graphics g){
for(int i =0; i<gameobj.size(); i++){//gameobj is linkedlist of GameObject
GameObject tempobj = gameobj.get(i);
tempobj.render(g);//getting every object and rendering them!
}
问题出在循环中,游戏中添加的第一个对象是 player.So,它先渲染,然后再渲染背景。
这是一个愚蠢的 mistake.which 通过以下更改得到正确的。->
private void render(Graphics g){
for(int i = gameobj.size()-1; i > 0; i--){//gameobj is linkedlist of GameObject
GameObject tempobj = gameobj.get(i);
tempobj.render(g);//getting every object and rendering them! from reverse
}
因此,最后一个对象首先呈现,第一个对象最后呈现。
和平!
我正在 JAVA 中构建我的第一个非常基础的游戏,没有使用任何其他外部库。
我遇到的问题是
你可以看到背景渲染在播放器上我该如何解决 播放器渲染代码如下
@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;
}
}
主游戏class可以看到执行流程的顺序
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); //handler is rendering every object in game
g.dispose();
bs.show();
}
private void tick() {
//update Game
handler.tick();
hod.tick();
spawner.tick(); // background is generating in spawner class.
}
我知道用这么少的代码来说明问题对你们所有人来说都很难。但我对这个庞大而强大的社区充满信心。
提前致谢。不要犹豫编辑并指出我的错误谢谢!
如果我的代码正确,背景将在渲染播放器后生成,这会导致背景位于播放器之上。在调用 hod.tick() 之前,我会尝试调用 spawner.tick()(我猜背景来自给定的代码注释)。希望这应该能解决这个问题。
private void tick() { //update Game
spawner.tick();
handler.tick();
hod.tick();
}
我刚刚有了解决方案! 问题出在 handler.render(g);方法:- 以下是;
private void render(Graphics g){
for(int i =0; i<gameobj.size(); i++){//gameobj is linkedlist of GameObject
GameObject tempobj = gameobj.get(i);
tempobj.render(g);//getting every object and rendering them!
}
问题出在循环中,游戏中添加的第一个对象是 player.So,它先渲染,然后再渲染背景。 这是一个愚蠢的 mistake.which 通过以下更改得到正确的。->
private void render(Graphics g){
for(int i = gameobj.size()-1; i > 0; i--){//gameobj is linkedlist of GameObject
GameObject tempobj = gameobj.get(i);
tempobj.render(g);//getting every object and rendering them! from reverse
}
因此,最后一个对象首先呈现,第一个对象最后呈现。 和平!