我一直在loocking 10小时(直译)和我做,我要问。 事情是我正在学习如何使用LibGdx编程Java游戏。 我做了水平空间船舶游戏。 所以,我在这里最严重的问题是,我不知道该怎么做滚动(我认为抽签将更好地解释)。 我想画一个hudge背景(空间),让我OrthographicCamera向右移动就像我的飞船,所以它会创建一个空间背景滚动效果。 没有敌人并没有什么,但在屏幕上了船。
我triying这
public void moveCamera(float x,float y){
cam.position.set(x, y, 0);
}
然后我使用该方法在我WorldRender render()方法:
public void render(float delta){
ship.Move(delta);
moveCamera(ship.getPosition().x,ship.getPosition().y);
cam.update();
System.out.println(""+cam.position);
spriteBatch.begin();
drawBackground();
drawShip();
spriteBatch.end();
}
我真正移动相机的位置(我可以看到,由于println的),但它不是在比赛中的移动,所以飞船只是由窗口的边缘自败。
spriteBatch.end之前我也试过这个()
spriteBatch.setProjectionMatrix(camera.combined);
但是当我做了Windows OLY显示黑屏,没有船,什么都没有。 正如我说过的,我绝望了,我看到很多的例子(滚动鼠标,paralexscrolling等),但都是以先进的或只是没有我的代码做。 任何帮助西港岛线可以理解
这是我画的东西。 背景和船舶都在里面WorldRender纹理。 我画的背景图片很广,所以我的本意是做一些滚动了,我说。 这是代码
private void loadTextures(){
shipTexture=new Texture(Gdx.files.internal("nave.png"));
background=new Texture(Gdx.files.internal("fondo.jpg"));
}
public void drawShip(){
spriteBatch.draw(shipTexture,ship.getPosition().x*ppuX,ship.getPosition().y*ppuY, ship.WIDTH*ppuX,ship.HEIGHT*ppuY);
}
public void drawBackground(){
spriteBatch.draw(background, -10*ppuX,0*ppuY, Gdx.graphics.getWidth()*10,Gdx.graphics.getHeight());
}
在这里,您可以下载代码,如果有人想在极限模式,以帮助
我的代码(不工作)
我终于解决了IT !!!! WIIIIIIIIII! 这是我在一个类名WorldRenderer使用的代码,有至极是内GameScreen卡勒为呈现方式,调整等
public WorldRenderer(World world) {
// TODO Auto-generated constructor stub
this.world=world;
this.ship=world.getShip();
this.cam = new OrthographicCamera(CAMERA_WIDTH,CAMERA_HEIGHT);
this.cam.setToOrtho(false,CAMERA_WIDTH,CAMERA_HEIGHT);
this.cam.position.set(ship.getPosition().x,CAMERA_HEIGHT/2,0);
this.cam.update();//actualizamos la camara
spriteBatch=new SpriteBatch();
loadTextures();
}
private void loadTextures(){
shipTexture=new Texture(Gdx.files.internal("nave.png"));
background=new Texture(Gdx.files.internal("fondo.jpg"));
}
public void drawShip(){
spriteBatch.draw(shipTexture,ship.getPosition().x,ship.getPosition().y,10,10);
}
public void drawBackground(){
spriteBatch.draw(background, 0,0, 500,50);
}
public void render(float delta){
ship.Move(delta);
moveCamera(ship.getPosition().x);
spriteBatch.setProjectionMatrix(cam.combined);
spriteBatch.begin();
drawBackground();
drawShip();
spriteBatch.end();
}
public void moveCemara(float x){
cam.position.set(x+20,cam.position.y, 0);
cam.update();
}
在船内我有这样的方法至极我称之为内呈现WorldRenderer移动它
public void Move(float delta){
if(Gdx.input.isKeyPressed(Keys.LEFT)) this.position.x -=velocity *delta;
if(Gdx.input.isKeyPressed(Keys.RIGHT)) this.position.x +=velocity *delta;
if(Gdx.input.isKeyPressed(Keys.UP)) this.position.y +=velocity *delta;
if(Gdx.input.isKeyPressed(Keys.DOWN)) this.position.y -=velocity *delta;
}
此外,我要非常感谢谁帮助我的人。 我标志着第一个答案为好,但,混合使用这两个是什么给了我真正的解决方案。
我离开这里有些TUTOS我跟着至极是菜鸟不错
那是一个很好的一切-从划伤,政党成员LiGdxForNoobs
一个简单的游戏plataform platformGame
一个非常简单的游戏bucketGame
它不清楚如何绘图? 我不知道你是否在做正确的这一做法..你能提供你的背景和船舶的细节? 你可以在你的背景图片提供细节,它是一个巨大的形象,你的周围滚动还是要重复你滚动重复的图像?
- 编辑 -
好吧,我想我有一个想法,可能是什么了。 我将相机通常适用于当前的环境。
请将下列的大小调整
public void resize(int width, int height) {
cam = new OrthographicCamera(width, height);
cam.translate(width / 2, height / 2, 0);
}
放在开始下面的渲染()
cam.position.set(posX,posY,0);
cam.update();
cam.apply(Gdx.gl10);
Gdx.gl.glClearColor(0,0,0,1);
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // #14
这会让你有设置在窗口的左下角的原点清晰的屏幕。 然后,您应该先画你的背景
spriteBatch.setProjectionMatrix(cam.combined);
spriteBatch.begin();
spriteBatch.draw(background,0,0,sizeX,sizeY);
spriteBatch.end()
怎么看,看起来当您移动相机的位置POSX和波西。 然后你的船加进来
- 多个编辑---
那么你就可以计算出POSX和波西作为
POSX = defaultOffsetX + shipX
等等..
总之希望这可以帮助我还在学习只有自己,所以这可能不是最好的方法..但它似乎工作。
我不知道如果这是你唯一的错误,但是这是一个错误。 如果这是你说你在做:
spriteBatch.begin();
drawBackground();
drawShip();
spriteBatch.setProjectionMatrix(camera.combined);
spriteBatch.end();
你不会看到任何东西。 当setProjectionMatrix被称为开始()/结束()块内。 当前批次刷新到GPU。 所以,你实际上是不拉丝用相机矩阵东西。 你应该这样做,而不是:
spriteBatch.setProjectionMatrix(camera.combined);
spriteBatch.begin();
drawBackground();
drawShip();
spriteBatch.end();
编辑:
如果你不叫那行,spriteBatch使用它自己默认的摄像头(这不会注意到你的camera.update()的修改,所以这不是你想要的)。
您现在应该更多地关注您所使用的坐标。 我不太清楚你真正需要的PPU转换的东西。 首先,在虚构的世界坐标定义的一切,请注意,你会看到一些伸展在你的世界。
public void drawShip(){
spriteBatch.draw(shipTexture,ship.getPosition().x,ship.getPosition().y, 10, 10);
}//your ship is 10 units wide and tall!
public void drawBackground(){
spriteBatch.draw(background, -10,0, 500, 100);
} //your background is 500 units wide, and 100 units tall
//camera setup
camera = new OrthographicCamera(50, 50);
//your camera will print to screen 50 units of your world
如果你能看到一个拉伸的世界,试着去了解它是如何工作的(如果你看不到任何东西,有什么不对的地方)。
编辑2
我接过来一看你的代码。 首先拆下PPU的,因为它掩盖了你的代码。 你设置你的凸轮位置到ship.postion,而在ship.position * PPU绘制。 此外,您的背景是太大了(这就是为什么你看到它的像素化)。 你应该看到的东西合理的与此有关。 (有一天你会不得不初始化你的相机以另一种方式来处理拉伸,却忘记了,直到你了解所有的作品)。
this.cam = new OrthographicCamera(CAMERA_WIDTH,CAMERA_HEIGHT);
public void drawShip(){
spriteBatch.draw(shipTexture, ship.getPosition().x ,ship.getPosition().y, 10, 10);
}
public void drawBackground(){
spriteBatch.draw(background, -CAMERA_WIDTH/2, -CAMERA_HEIGHT/2, 100, 100); //let bg begin where camera starts. (0,0)
}
public void render(float delta){
ship.Move(delta);
moverCamara(ship.getPosition().x, ship.getPosition().y);
spriteBatch.setProjectionMatrix(cam.combined);
spriteBatch.begin();
drawBackground();
drawShip();
spriteBatch.end();
}
嘿,我已经编辑代码看看以下
public class WorldRenderer {
private World world;
private Ship ship;
private Texture shipTexture,background;
private SpriteBatch spriteBatch;
private OrthographicCamera cam;
float screenSizeX = 100;
float screenSizeY = 100;
float shipSizeX = 10;
float shipSizeY = 10;
public void setSize (int w, int h) {
cam = new OrthographicCamera(screenSizeX,screenSizeY);
}
public WorldRenderer(World world) {
this.world=world;
this.ship=world.getShip();
spriteBatch=new SpriteBatch();
loadTextures();
}
private void loadTextures(){
shipTexture=new Texture(Gdx.files.internal("nave.png"));
background=new Texture(Gdx.files.internal("fondo2.jpg"));
}
public void drawShip(){
spriteBatch.draw(shipTexture, ship.getPosition().x,ship.getPosition().y, shipSizeX,shipSizeY);
}
public void drawBackground(){
spriteBatch.draw(background, 0,0);
}
public void render(float delta){
ship.Move(delta);
moverCamara(ship.getPosition().x,ship.getPosition().y);
spriteBatch.setProjectionMatrix(cam.combined);
spriteBatch.begin();
drawBackground();
drawShip();
spriteBatch.end();
}
public void moverCamara(float x,float y){
cam.position.set(x, y, 0);
cam.update();
}
}
这样,你的船总是在屏幕的中间和后台移动。 希望这可以帮助