How to make sprite jump in java?

前端 未结 2 2024
忘了有多久
忘了有多久 2020-11-27 08:56

I have KeyEvents for a sprite for moving left, right, up and down. I was just messing around and was thinking ahead for another project in which I want the sprite to jump. I

相关标签:
2条回答
  • 2020-11-27 09:05

    Well I can think of one way. It involves some complex amounts of math (parabola). So i'm going to provide a very simple answer.

    int y = 0;
    

    and in the method that tests for the spacebar...

    if (y !< 1){
        if (y < 30){
    
       y += 1;
    
       }
    
       if (y > 30){
    
        y -= 1;
    
    
        }
    }
    

    I haven't tested it out yet, but it should work in theory....But it won't animate anything, this code is only going to take the sprites Y value and make it go up. That's just about the easiest jumping method that can exist....

    0 讨论(0)
  • 2020-11-27 09:10

    This is basic concept. Your implementation will change depending on the implementation of your engine.

    The basic idea is the player has a vertical delta which is changed over time by gravity. This effects the sprites vertical speed.

    This implementation also has a re-bound delta, which allows the sprite to re-bound rather the "stopping" suddenly. The re-bound is effected by a re-bound degradation, which reduces the amount of re-bound on each re-bound.

    This simulates a game character, so you'll need to hit Space to start it bouncing...

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.KeyEvent;
    import javax.swing.AbstractAction;
    import javax.swing.ActionMap;
    import javax.swing.InputMap;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.KeyStroke;
    import javax.swing.Timer;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class JumpingSprite {
    
        public static void main(String[] args) {
            new JumpingSprite();
        }
    
        public JumpingSprite() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    }
    
                    JFrame frame = new JFrame("Test");
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new TestPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public static class TestPane extends JPanel {
    
            protected static final int SPRITE_HEIGHT = 10;
            protected static final int SPRITE_WIDTH = 10;
            private float vDelta; // The vertical detla...
            private float rbDelta; // Rebound delta...
            private float rbDegDelta; // The amount the rebound is degradation...
            private int yPos; // The vertical position...
            private float gDelta; // Gravity, how much the vDelta will be reduced by over time...
            private Timer engine;
            private boolean bounce = false;
    
            public TestPane() {
    
                yPos = getPreferredSize().height - SPRITE_HEIGHT;
                vDelta = 0;
                gDelta = 0.25f;
                // This is how much the re-bound will degrade on each cycle...
                rbDegDelta = 2.5f;
    
                InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
                ActionMap am = getActionMap();
                im.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "jump");
                am.put("jump", new AbstractAction() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        // Can only bound when we're actually on the ground...
                        // You might want to add fudge factor here so that the 
                        // sprite can be within a given number of pixels in order to
                        // jump again...
                        if (yPos + SPRITE_HEIGHT == getHeight()) {
                            vDelta = -8;
                            rbDelta = vDelta;
                            bounce = true;
                        }
                    }
                });
    
                engine = new Timer(40, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        int height = getHeight();
                        // No point if we've not been sized...
                        if (height > 0) {
                            // Are we bouncing...
                            if (bounce) {
                                // Add the vDelta to the yPos
                                // vDelta may be postive or negative, allowing
                                // for both up and down movement...
                                yPos += vDelta;
                                // Add the gravity to the vDelta, this will slow down
                                // the upward movement and speed up the downward movement...
                                // You may wish to place a max speed to this
                                vDelta += gDelta;
                                // If the sprite is not on the ground...
                                if (yPos + SPRITE_HEIGHT >= height) {
                                    // Seat the sprite on the ground
                                    yPos = height - SPRITE_HEIGHT;
                                    // If the re-bound delta is 0 or more then we've stopped
                                    // bouncing...
                                    if (rbDelta >= 0) {
                                        // Stop bouncing...
                                        bounce = false;
                                    } else {
                                        // Add the re-bound degregation delta to the re-bound delta
                                        rbDelta += rbDegDelta;
                                        // Set the vDelta...
                                        vDelta = rbDelta;
                                    }
                                }
                            }
                        }
                        repaint();
                    }
                });
                engine.start();
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(200, 200);
            }
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2d = (Graphics2D) g.create();
                int width = getWidth() - 1;
                int xPos = (width - SPRITE_WIDTH) / 2;
                g2d.drawOval(xPos, yPos, SPRITE_WIDTH, SPRITE_HEIGHT);
                g2d.dispose();
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题