私は 10 時間 (文字通り) 探していました。問題は、LibGdx を使用して Java ゲームをプログラミングする方法を学んでいることです。水平宇宙船ゲームをやっています。したがって、ここでの私の最悪の問題は、スクロールの方法がわからないことです (draw の方が説明がわかりやすいと思います)。巨大な背景 (スペース) を描画し、OrthographicCamera を SpaceShip のように正しく動かしたいので、スペースの背景でスクロール効果が作成されます。敵はおらず、画面には船しかありません。
私はこれを試しています:
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 のおかげでわかります) が、ゲーム内では移動していないため、SpaceShip はウィンドウの端で消えるだけです。
spriteBatch.end() の前にもこれを試しました
spriteBatch.setProjectionMatrix(camera.combined);
しかし、それを行うと、ウィンドウには黒い画面しか表示されず、船も何も表示されません。私が言ったように、私は必死です、私は多くの例(マウスでスクロールする、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());
}
誰かがハードコアモードで助けたい場合は、ここでコードをダウンロードできます
私はついにそれを解決しました!
これは、レンダリング、サイズ変更などのために GameScreen 内で呼び出されるメソッドを持つクラス名 WorldRenderer で使用したコードです。
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 の render 内で呼び出して移動するこのメソッドがあります。
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;
}
また、私を助けてくれた人々にとても感謝しています。私は最初の答えを良いものとしてマークしていますが、両方を混ぜ合わせることで本当の解決策が得られました。
私が従ったいくつかのチュートリアルをここに残しておきます。
それは、スクラッチからすべてを学ぶ優れたチュートリアル LiGdxForNoobs です。
シンプルなプラットフォーム ゲーム プラットフォームGame
非常にシンプルなゲーム バケツゲーム