Fire Rate Issue in Java 2D Gaming











up vote
1
down vote

favorite












I am creating a 2D tank game and I want my tank to be able to shoot immediately once the fire button is pressed and then again every half second, while the fire button is held. Currently In my game, my first bullet shoots immediately after the fire button is pressed, then there is a delay (I presume half second) until my tank starts shooting a stream of bullets. I'm wondering why the initial delay after the first bullet works, but the successive ones fail. Below I have included the method which creates bullets which is called every frame in my 144Hz main game loop:



public void addBullets(ArrayList<Animate> animates, ArrayList<Drawable> drawables){
if (this.ShootPressed) {
if( firstShot || (System.currentTimeMillis() - timeSinceLastShot) >= 500) {
Bullet newBullet = this.addBullet();
animates.add(newBullet);
drawables.add(newBullet);
firstShot = false;
timeSinceLastShot = System.currentTimeMillis();
}
}
}


Here are the associated methods in my KeyListener class:



public void keyPressed(KeyEvent key) {
int keyPressed = key.getKeyCode();
if (keyPressed == up) {
this.t1.toggleUpPressed();
}
if (keyPressed == down) {
this.t1.toggleDownPressed();
}
if (keyPressed == left) {
this.t1.toggleLeftPressed();
}
if (keyPressed == right) {
this.t1.toggleRightPressed();
}
if(keyPressed == shoot) {
this.t1.toggleShootPressed();
this.t1.setFirstShot(true);
}


I am including this for additional information even though the bug happens before the key is released:



public void keyReleased(KeyEvent ke) {
int keyReleased = ke.getKeyCode();
if (keyReleased == up) {
this.t1.unToggleUpPressed();
}
if (keyReleased == down) {
this.t1.unToggleDownPressed();
}
if (keyReleased == left) {
this.t1.unToggleLeftPressed();
}
if (keyReleased == right) {
this.t1.unToggleRightPressed();
}
if (keyReleased == shoot) {
this.t1.unToggleShootPressed();
}

}









share|improve this question







New contributor




yungvinsantos is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.
























    up vote
    1
    down vote

    favorite












    I am creating a 2D tank game and I want my tank to be able to shoot immediately once the fire button is pressed and then again every half second, while the fire button is held. Currently In my game, my first bullet shoots immediately after the fire button is pressed, then there is a delay (I presume half second) until my tank starts shooting a stream of bullets. I'm wondering why the initial delay after the first bullet works, but the successive ones fail. Below I have included the method which creates bullets which is called every frame in my 144Hz main game loop:



    public void addBullets(ArrayList<Animate> animates, ArrayList<Drawable> drawables){
    if (this.ShootPressed) {
    if( firstShot || (System.currentTimeMillis() - timeSinceLastShot) >= 500) {
    Bullet newBullet = this.addBullet();
    animates.add(newBullet);
    drawables.add(newBullet);
    firstShot = false;
    timeSinceLastShot = System.currentTimeMillis();
    }
    }
    }


    Here are the associated methods in my KeyListener class:



    public void keyPressed(KeyEvent key) {
    int keyPressed = key.getKeyCode();
    if (keyPressed == up) {
    this.t1.toggleUpPressed();
    }
    if (keyPressed == down) {
    this.t1.toggleDownPressed();
    }
    if (keyPressed == left) {
    this.t1.toggleLeftPressed();
    }
    if (keyPressed == right) {
    this.t1.toggleRightPressed();
    }
    if(keyPressed == shoot) {
    this.t1.toggleShootPressed();
    this.t1.setFirstShot(true);
    }


    I am including this for additional information even though the bug happens before the key is released:



    public void keyReleased(KeyEvent ke) {
    int keyReleased = ke.getKeyCode();
    if (keyReleased == up) {
    this.t1.unToggleUpPressed();
    }
    if (keyReleased == down) {
    this.t1.unToggleDownPressed();
    }
    if (keyReleased == left) {
    this.t1.unToggleLeftPressed();
    }
    if (keyReleased == right) {
    this.t1.unToggleRightPressed();
    }
    if (keyReleased == shoot) {
    this.t1.unToggleShootPressed();
    }

    }









    share|improve this question







    New contributor




    yungvinsantos is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
    Check out our Code of Conduct.






















      up vote
      1
      down vote

      favorite









      up vote
      1
      down vote

      favorite











      I am creating a 2D tank game and I want my tank to be able to shoot immediately once the fire button is pressed and then again every half second, while the fire button is held. Currently In my game, my first bullet shoots immediately after the fire button is pressed, then there is a delay (I presume half second) until my tank starts shooting a stream of bullets. I'm wondering why the initial delay after the first bullet works, but the successive ones fail. Below I have included the method which creates bullets which is called every frame in my 144Hz main game loop:



      public void addBullets(ArrayList<Animate> animates, ArrayList<Drawable> drawables){
      if (this.ShootPressed) {
      if( firstShot || (System.currentTimeMillis() - timeSinceLastShot) >= 500) {
      Bullet newBullet = this.addBullet();
      animates.add(newBullet);
      drawables.add(newBullet);
      firstShot = false;
      timeSinceLastShot = System.currentTimeMillis();
      }
      }
      }


      Here are the associated methods in my KeyListener class:



      public void keyPressed(KeyEvent key) {
      int keyPressed = key.getKeyCode();
      if (keyPressed == up) {
      this.t1.toggleUpPressed();
      }
      if (keyPressed == down) {
      this.t1.toggleDownPressed();
      }
      if (keyPressed == left) {
      this.t1.toggleLeftPressed();
      }
      if (keyPressed == right) {
      this.t1.toggleRightPressed();
      }
      if(keyPressed == shoot) {
      this.t1.toggleShootPressed();
      this.t1.setFirstShot(true);
      }


      I am including this for additional information even though the bug happens before the key is released:



      public void keyReleased(KeyEvent ke) {
      int keyReleased = ke.getKeyCode();
      if (keyReleased == up) {
      this.t1.unToggleUpPressed();
      }
      if (keyReleased == down) {
      this.t1.unToggleDownPressed();
      }
      if (keyReleased == left) {
      this.t1.unToggleLeftPressed();
      }
      if (keyReleased == right) {
      this.t1.unToggleRightPressed();
      }
      if (keyReleased == shoot) {
      this.t1.unToggleShootPressed();
      }

      }









      share|improve this question







      New contributor




      yungvinsantos is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      I am creating a 2D tank game and I want my tank to be able to shoot immediately once the fire button is pressed and then again every half second, while the fire button is held. Currently In my game, my first bullet shoots immediately after the fire button is pressed, then there is a delay (I presume half second) until my tank starts shooting a stream of bullets. I'm wondering why the initial delay after the first bullet works, but the successive ones fail. Below I have included the method which creates bullets which is called every frame in my 144Hz main game loop:



      public void addBullets(ArrayList<Animate> animates, ArrayList<Drawable> drawables){
      if (this.ShootPressed) {
      if( firstShot || (System.currentTimeMillis() - timeSinceLastShot) >= 500) {
      Bullet newBullet = this.addBullet();
      animates.add(newBullet);
      drawables.add(newBullet);
      firstShot = false;
      timeSinceLastShot = System.currentTimeMillis();
      }
      }
      }


      Here are the associated methods in my KeyListener class:



      public void keyPressed(KeyEvent key) {
      int keyPressed = key.getKeyCode();
      if (keyPressed == up) {
      this.t1.toggleUpPressed();
      }
      if (keyPressed == down) {
      this.t1.toggleDownPressed();
      }
      if (keyPressed == left) {
      this.t1.toggleLeftPressed();
      }
      if (keyPressed == right) {
      this.t1.toggleRightPressed();
      }
      if(keyPressed == shoot) {
      this.t1.toggleShootPressed();
      this.t1.setFirstShot(true);
      }


      I am including this for additional information even though the bug happens before the key is released:



      public void keyReleased(KeyEvent ke) {
      int keyReleased = ke.getKeyCode();
      if (keyReleased == up) {
      this.t1.unToggleUpPressed();
      }
      if (keyReleased == down) {
      this.t1.unToggleDownPressed();
      }
      if (keyReleased == left) {
      this.t1.unToggleLeftPressed();
      }
      if (keyReleased == right) {
      this.t1.unToggleRightPressed();
      }
      if (keyReleased == shoot) {
      this.t1.unToggleShootPressed();
      }

      }






      java 2d-games






      share|improve this question







      New contributor




      yungvinsantos is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.











      share|improve this question







      New contributor




      yungvinsantos is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      share|improve this question




      share|improve this question






      New contributor




      yungvinsantos is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.









      asked 20 hours ago









      yungvinsantos

      61




      61




      New contributor




      yungvinsantos is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.





      New contributor





      yungvinsantos is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.






      yungvinsantos is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
      Check out our Code of Conduct.
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          0
          down vote













          I suspect it's an issue with key-repeats which will repeatedly call KeyPressed while the key is held. It is usually setup to behave as you describe. Consequently, "firstShot" will be repeatedly set to true and a shot will be fired.



          I advise restricting your event code, mainly as it's continuous in nature, to only toggling actions, rather than performing any logic. You can determine whether a shot is first or not in your game loop, with the help of some messages from your events.



          However, the firstShot variable is not really necessary at all as the time delta will account for it. Removing it would also prevent firing faster than every 500ms by pressing the fire key rapidly, which you may or may not want.






          share|improve this answer










          New contributor




          Hayden Ness is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
          Check out our Code of Conduct.


















            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });






            yungvinsantos is a new contributor. Be nice, and check out our Code of Conduct.










             

            draft saved


            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53237825%2ffire-rate-issue-in-java-2d-gaming%23new-answer', 'question_page');
            }
            );

            Post as a guest
































            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            0
            down vote













            I suspect it's an issue with key-repeats which will repeatedly call KeyPressed while the key is held. It is usually setup to behave as you describe. Consequently, "firstShot" will be repeatedly set to true and a shot will be fired.



            I advise restricting your event code, mainly as it's continuous in nature, to only toggling actions, rather than performing any logic. You can determine whether a shot is first or not in your game loop, with the help of some messages from your events.



            However, the firstShot variable is not really necessary at all as the time delta will account for it. Removing it would also prevent firing faster than every 500ms by pressing the fire key rapidly, which you may or may not want.






            share|improve this answer










            New contributor




            Hayden Ness is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.






















              up vote
              0
              down vote













              I suspect it's an issue with key-repeats which will repeatedly call KeyPressed while the key is held. It is usually setup to behave as you describe. Consequently, "firstShot" will be repeatedly set to true and a shot will be fired.



              I advise restricting your event code, mainly as it's continuous in nature, to only toggling actions, rather than performing any logic. You can determine whether a shot is first or not in your game loop, with the help of some messages from your events.



              However, the firstShot variable is not really necessary at all as the time delta will account for it. Removing it would also prevent firing faster than every 500ms by pressing the fire key rapidly, which you may or may not want.






              share|improve this answer










              New contributor




              Hayden Ness is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
              Check out our Code of Conduct.




















                up vote
                0
                down vote










                up vote
                0
                down vote









                I suspect it's an issue with key-repeats which will repeatedly call KeyPressed while the key is held. It is usually setup to behave as you describe. Consequently, "firstShot" will be repeatedly set to true and a shot will be fired.



                I advise restricting your event code, mainly as it's continuous in nature, to only toggling actions, rather than performing any logic. You can determine whether a shot is first or not in your game loop, with the help of some messages from your events.



                However, the firstShot variable is not really necessary at all as the time delta will account for it. Removing it would also prevent firing faster than every 500ms by pressing the fire key rapidly, which you may or may not want.






                share|improve this answer










                New contributor




                Hayden Ness is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.









                I suspect it's an issue with key-repeats which will repeatedly call KeyPressed while the key is held. It is usually setup to behave as you describe. Consequently, "firstShot" will be repeatedly set to true and a shot will be fired.



                I advise restricting your event code, mainly as it's continuous in nature, to only toggling actions, rather than performing any logic. You can determine whether a shot is first or not in your game loop, with the help of some messages from your events.



                However, the firstShot variable is not really necessary at all as the time delta will account for it. Removing it would also prevent firing faster than every 500ms by pressing the fire key rapidly, which you may or may not want.







                share|improve this answer










                New contributor




                Hayden Ness is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.









                share|improve this answer



                share|improve this answer








                edited 17 hours ago





















                New contributor




                Hayden Ness is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.









                answered 17 hours ago









                Hayden Ness

                11




                11




                New contributor




                Hayden Ness is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.





                New contributor





                Hayden Ness is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.






                Hayden Ness is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                Check out our Code of Conduct.






















                    yungvinsantos is a new contributor. Be nice, and check out our Code of Conduct.










                     

                    draft saved


                    draft discarded


















                    yungvinsantos is a new contributor. Be nice, and check out our Code of Conduct.













                    yungvinsantos is a new contributor. Be nice, and check out our Code of Conduct.












                    yungvinsantos is a new contributor. Be nice, and check out our Code of Conduct.















                     


                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53237825%2ffire-rate-issue-in-java-2d-gaming%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest




















































































                    Popular posts from this blog

                    Bressuire

                    Vorschmack

                    Quarantine