2016-08-02 3 views
0
public class gameMain implements Screen { 
    final main game; 



    SpriteBatch batch; 
    Texture img; 
    private Texture alexTexture; 
    private Rectangle alex; 

    private Texture cTex; 
    private Texture dropper; 
    private Texture ender; 
    private Texture partsImg; 
    private Texture toy; 

    private OrthographicCamera camera; 
    private Array<Rectangle> part;  // ****** 
    private long lastDropTime; 
    private int beltSpeed = 100;   // ****** 

    //Score Keeper 
    private int score; 
    private String scoreName; 



    //basically a create method 
    public gameMain(final main gam){ 
     this.game = gam; 

     // load images into memory 
     dropper = new Texture("android/assets/dropper.png"); 
     ender = new Texture("android/assets/endOfBelt.png"); 
     partsImg = new Texture("android/assets/unmadeToyParts.png"); 
     toy = new Texture("android/assets/toymade.png"); 
     cTex = new Texture("android/assets/conveyerBeltBackground.png"); 
     alexTexture = new Texture(Gdx.files.internal("android/assets/alexAlpha2.png")); 

     // set the game window resolution 
     camera = new OrthographicCamera(); 
     camera.setToOrtho(false, 1080,720); 

     // Alex's position/hitbox 
     alex = new Rectangle(); 
     alex.x = 250; 
     alex.y = 150; 
     alex.width = 126; 
     alex.height = 75; 

     // part stuff 
     part = new Array<Rectangle>(); 
     spawnPart(); 

     // score handler 
     score = 0; 
     scoreName = "Toys Made: "; 
    } 

    private void spawnPart(){    // ******* 
     Rectangle parts = new Rectangle(); 
     parts.x = 0; 
     parts.y = 210; 
     parts.width = 52; 
     parts.height = 60; 
     part.add(parts); 
     lastDropTime = TimeUtils.nanoTime(); 
    }           //******** 

    @Override 
    public void render(float delta) { 
     Gdx.gl.glClearColor(0, 0, 0, 1); 
     Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
     camera.update(); 

     // load alex sprite 
     game.batch.setProjectionMatrix(camera.combined); 
     // begin drawing to screen 
     game.batch.begin(); 
     batch.draw(cTex, -5, 200); // draw conveyer background 
     batch.draw(dropper, 0, 210); // draw the dropper 
     batch.draw(ender, 600, 200); // draw the ender 
     game.batch.draw(alexTexture, alex.x, alex.y); // draw alex 
     for(Rectangle parts: part){ 
      game.batch.draw(partsImg, parts.x, parts.y); // draw part 
     } 
     game.font.draw(game.batch, scoreName, 25, 100); // draw scoreboard 
     game.batch.end(); // end drawing to screen 

     //****************************************************************************** 
//HERE IS WHERE I AM TRYING TO PUT IT 

part.x += beltspeed; 
if (part.rectangle overlaps ender.rectangle){ 
despawn part; 
} 

//****************************************************************************** 



    } 

    @Override 
    public void show() { 

    } 

    @Override 
    public void hide() { 

    } 

    @Override 
    public void pause() { 

    } 

    @Override 
    public void resume() { 

    } 

    @Override 
    public void resize(int width, int height) { 

    } 

    @Override 
    public void dispose() { 

    } 
} 

Bonjour Je suis très nouveau à LibGDX, et après avoir fait quelques recherches, j'ai décidé de faire un jeu où vous êtes un ouvrier d'usine nommé Alex et vous construisez des jouets. Je me ferai un plaisir de répondre à vos questions afin de rendre mon code plus original ou mieux fonctionner. J'ai souligné tout ce que je crois être pertinent à ma question avec quelques astérisques. Mais ma question est: Comment faites-vous un 'rectangle' tel que mon 'partie' se déplace tout seul. J'ai ajouté une zone de réapparition et une zone de réapparition, et une fois que la hitbox pour elle passe sur la hitbox 'ender', je voudrais la faire disparaître. Je ne suis pas encore arrivé si loin, mais quand la hitbox 'hit' partit sur hitbox 'Alex' je voudrais un petit mini-jeu où vous devez appuyer vers le haut, le bas, la gauche, la droite (aléatoirement) pour construire le jouet. Si vous avez des suggestions sur la façon dont je devrais gérer cela, je serais très reconnaissant.LibGDX faire un mouvement de rectangle sur sa propre

"C:\Program Files\Java\jdk1.7.0_79\jre\bin\java" -Didea.launcher.port=7532 "-Didea.launcher.bin.path=C:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 2016.1.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.7.0_79\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jce.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jfxrt.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\resources.jar;C:\Program Files\Java\jdk1.7.0_79\jre\lib\rt.jar;C:\Users\RAFiredog\Desktop\Intellij\AlexTheTemp\out\production\desktop;C:\Users\RAFiredog\Desktop\Intellij\AlexTheTemp\out\production\core;C:\Users\RAFiredog\.gradle\caches\modules-2\files-2.1\com.badlogicgames.gdx\gdx\1.9.2\e641cb91bec06bc64d9ddf7a7d7062caceec73cd\gdx-1.9.2.jar;C:\Users\RAFiredog\.gradle\caches\modules-2\files-2.1\com.badlogicgames.gdx\gdx-box2d\1.9.2\b78eaa90aaaf7830e6dffff587ea6e859c2787b2\gdx-box2d-1.9.2.jar;C:\Users\RAFiredog\.gradle\caches\modules-2\files-2.1\com.badlogicgames.gdx\gdx-freetype\1.9.2\3609253d14edb1b3ca5aacff4e06989edde75be4\gdx-freetype-1.9.2.jar;C:\Users\RAFiredog\.gradle\caches\modules-2\files-2.1\com.badlogicgames.gdx\gdx-backend-lwjgl\1.9.2\d710a8704ed584ec2ba9ca52e3a6a5885dd759cc\gdx-backend-lwjgl-1.9.2.jar;C:\Users\RAFiredog\.gradle\caches\modules-2\files-2.1\com.badlogicgames.gdx\gdx-platform\1.9.2\dde4cf7e9ce61c24042f512203aed87657496639\gdx-platform-1.9.2-natives-desktop.jar;C:\Users\RAFiredog\.gradle\caches\modules-2\files-2.1\com.badlogicgames.gdx\gdx-box2d-platform\1.9.2\497cbfbf81e7e8b1e8433b19291c5af4bbc2ec66\gdx-box2d-platform-1.9.2-natives-desktop.jar;C:\Users\RAFiredog\.gradle\caches\modules-2\files-2.1\com.badlogicgames.gdx\gdx-tools\1.9.2\37d8e3009ae0febdf93717b21980c67c8cadac07\gdx-tools-1.9.2.jar;C:\Users\RAFiredog\.gradle\caches\modules-2\files-2.1\com.badlogicgames.gdx\gdx-freetype-platform\1.9.2\1e1afb0b6c9e8aeb7d495cb8f55c353d3da58cf0\gdx-freetype-platform-1.9.2-natives-desktop.jar;C:\Users\RAFiredog\.gradle\caches\modules-2\files-2.1\org.lwjgl.lwjgl\lwjgl\2.9.2\a9d80fe5935c7a9149f6584d9777cfd471f65489\lwjgl-2.9.2.jar;C:\Users\RAFiredog\.gradle\caches\modules-2\files-2.1\org.lwjgl.lwjgl\lwjgl_util\2.9.2\4b9e37300a87799856e0bd15ed81663cdb6b0947\lwjgl_util-2.9.2.jar;C:\Users\RAFiredog\.gradle\caches\modules-2\files-2.1\com.badlogicgames.jlayer\jlayer\1.0.1-gdx\7cca83cec5c1b2f011362f4d85aabd71a73b049d\jlayer-1.0.1-gdx.jar;C:\Users\RAFiredog\.gradle\caches\modules-2\files-2.1\org.jcraft\jorbis\0.0.17\8872d22b293e8f5d7d56ff92be966e6dc28ebdc6\jorbis-0.0.17.jar;C:\Users\RAFiredog\.gradle\caches\modules-2\files-2.1\com.badlogicgames.gdx\gdx-backend-headless\1.9.2\813e6020de85cd831f02cb5e9060fd7ea8cb208e\gdx-backend-headless-1.9.2.jar;C:\Users\RAFiredog\.gradle\caches\modules-2\files-2.1\org.lwjgl.lwjgl\lwjgl-platform\2.9.2\510c7d317f5e9e700b9cfaac5fd38bdebf0702e0\lwjgl-platform-2.9.2-natives-windows.jar;C:\Users\RAFiredog\.gradle\caches\modules-2\files-2.1\org.lwjgl.lwjgl\lwjgl-platform\2.9.2\d276cdf61fe2b516c7b7f4aa1b8dea91dbdc8d56\lwjgl-platform-2.9.2-natives-linux.jar;C:\Users\RAFiredog\.gradle\caches\modules-2\files-2.1\org.lwjgl.lwjgl\lwjgl-platform\2.9.2\d55b46b40b40249d627a83a7f7f22649709d70c3\lwjgl-platform-2.9.2-natives-osx.jar;C:\Users\RAFiredog\.gradle\caches\modules-2\files-2.1\net.java.jinput\jinput\2.0.5\39c7796b469a600f72380316f6b1f11db6c2c7c4\jinput-2.0.5.jar;C:\Users\RAFiredog\.gradle\caches\modules-2\files-2.1\net.java.jutils\jutils\1.0.0\e12fe1fda814bd348c1579329c86943d2cd3c6a6\jutils-1.0.0.jar;C:\Users\RAFiredog\.gradle\caches\modules-2\files-2.1\net.java.jinput\jinput-platform\2.0.5\7ff832a6eb9ab6a767f1ade2b548092d0fa64795\jinput-platform-2.0.5-natives-linux.jar;C:\Users\RAFiredog\.gradle\caches\modules-2\files-2.1\net.java.jinput\jinput-platform\2.0.5\385ee093e01f587f30ee1c8a2ee7d408fd732e16\jinput-platform-2.0.5-natives-windows.jar;C:\Users\RAFiredog\.gradle\caches\modules-2\files-2.1\net.java.jinput\jinput-platform\2.0.5\53f9c919f34d2ca9de8c51fc4e1e8282029a9232\jinput-platform-2.0.5-natives-osx.jar;C:\Program Files (x86)\JetBrains\IntelliJ IDEA Community Edition 2016.1.1\lib\idea_rt.jar" com.intellij.rt.execution.application.AppMain com.rafiredog.game.desktop.DesktopLauncher 
Exception in thread "LWJGL Application" java.lang.NullPointerException 
    at com.rafiredog.game.gameMain.render(gameMain.java:97) 
    at com.badlogic.gdx.Game.render(Game.java:46) 
    at com.rafiredog.game.main.render(main.java:45) 
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:223) 
    at com.badlogic.gdx.backends.lwjgl.LwjglApplication$1.run(LwjglApplication.java:124) 

Process finished with exit code 0 

Enfin, je reçois maintenant cette erreur. J'ai déplacé du code autour de 'batch.draw'. Cependant, cela pourrait ne pas être la cause de l'erreur? Je suis un peu perdu en ce moment. Mais je prendrai volontiers une capture d'écran de ce que j'ai du jeu dès que les erreurs seront résolues.

Nous vous remercions de votre avis sur la façon de réparer ce jeu.

Répondre

2

Vous devez effectuer des mises à jour de jeu, puis effectuer un rendu sur chaque cycle de la boucle de jeu. La partie de mise à jour du jeu de votre code peut parcourir vos objets pour leur faire des choses. Par exemple, votre méthode de rendu ressemblerait à ceci:

Vous devez utiliser explicitement un Iterator pour votre boucle for car vous ne pouvez pas supprimer des éléments de la liste pendant l'itération.

@Override 
public void render(float delta) { 

    //Update game 
    Iterator<Rectangle> iterator = parts.iterator(); 
    while (iterator.hasNext()){ 
     Rectangle part = iterator.next(); 
     part.x += beltSpeed * delta; //distance = speed * time 
     if (part.rectangle.overlaps(ender.rectangle)){ 
      iterator.remove(); //removes rectangle from the list 
     } 
    } 
    //This is also where you would update movement for anything else, 
    //such as a character jumping, or counting down a timer and spawning 
    //something when it reaches zero, for example. 

    //Draw everything 
    Gdx.gl.glClearColor(0, 0, 0, 1); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 
    camera.update(); 
    game.batch.setProjectionMatrix(camera.combined); 
    game.batch.begin(); 
    //... 
    game.batch.end(); 
} 

Si vous engendrez et « despawn » beaucoup d'objets, vous aurez probablement besoin d'utiliser la mise en commun pour éviter bégaiements de libération de la mémoire. Vous pouvez le faire en remplaçant new Rectangle() par Pools.obtain(Rectangle.class) et en ajoutant la ligne Pools.free(part) juste après iterator.remove().

J'ai également remarqué que vous avez une utilisation contre-intuitive des mots «partie» et «parties» en changeant de pluriel et de singulier. Assurez-vous que cela ne vous dérange pas.

Comme pour votre NullPointerException, read here.

+0

Ok merci pour votre aide! Pendant que j'attendais, j'ai compris comment utiliser les itérateurs et j'essaie de comprendre comment LibGDX utilise les boucles de jeu ... Y a-t-il quelque chose que vous recommanderiez à un novice de lire? J'ai l'impression d'être très désorganisé car je ne sais pas où le code est supposé aller. – RAFiredog