¿Cómo hacer sprite jump en java?

Tengo KeyEvents para un sprite para mover hacia la izquierda, derecha, arriba y abajo. Solo estaba jugando y estaba pensando en otro proyecto en el que quiero que el sprite salte. No tiene que ser completamente realista ya que estoy recién comenzando. Lo que tengo es que cuando se presiona la barra espaciadora, hará que el sprite salte, digamos “dy = -3”. Entonces, tengo el KeyEvent para keyReleased, caerá, “dy = -2”. Esto no funciona ya que el duende simplemente sigue cayendo … ¿alguien puede brillar algo de luz?

Código completo: colisión del paquete;

import java.awt.Image; import java.awt.Rectangle; import java.awt.event.KeyEvent; import java.util.ArrayList; import javax.swing.ImageIcon; public class Craft { private String craft = "pelican.png"; private int dx; private int dy; private int x; private int y; private int width; private int height; private boolean visible; private Image image; private ArrayList missiles; public Craft() { ImageIcon ii = new ImageIcon(this.getClass().getResource(craft)); image = ii.getImage(); width = image.getWidth(null); height = image.getHeight(null); missiles = new ArrayList(); visible = true; x = 100; y = 300; } public void move() { x += dx; y += dy; if (x < 1) { x = 1; } if (y < 1) { y = 1; } } public int getX() { return x; } public int getY() { return y; } public Image getImage() { return image; } public ArrayList getMissiles() { return missiles; } public void setVisible(boolean visible) { this.visible = visible; } public boolean isVisible() { return visible; } public Rectangle getBounds() { return new Rectangle(x, y, width, height); } public void keyPressed(KeyEvent e) { int key = e.getKeyCode(); if (key == KeyEvent.VK_SPACE) { } if (key == KeyEvent.VK_V){ dx = 6; } if (key == KeyEvent.VK_LEFT) { dx = -1; } if (key == KeyEvent.VK_RIGHT) { dx = 2; } if (key == KeyEvent.VK_UP) { dy = -1; } if (key == KeyEvent.VK_DOWN) { dy = 1; } } public void fire() { missiles.add(new Missile(x + width, y + height/2)); } public void keyReleased(KeyEvent e) { int key = e.getKeyCode(); if (key == KeyEvent.VK_LEFT) { dx = 0; } if (key == KeyEvent.VK_SPACE) { } if (key == KeyEvent.VK_RIGHT) { dx = 0; } if (key == KeyEvent.VK_UP) { dy = 0; } if (key == KeyEvent.VK_DOWN) { dy = 0; } } } 

Como habrás notado, soy nuevo en Java, así como en la progtwigción de juegos. Todo lo que quiero es que el sprite suba, luego regrese. Siempre permanecerá estacionario si eso ayuda. El duende sigue saltando hasta que es golpeado por un obstáculo que viene. Sé que hay código para otros movimientos, pero esos se eliminarán una vez que empiece en el siguiente sprite.

Este es un concepto básico. Su implementación cambiará dependiendo de la implementación de su motor.

La idea básica es que el jugador tiene un delta vertical que cambia con el tiempo por gravedad. Esto afecta a la velocidad vertical de los sprites.

Esta implementación también tiene un delta re-bound, que permite que el sprite se vuelva a unir, en lugar de “detenerse” repentinamente. El re-límite se efectúa mediante una degradación re-unida, que reduce la cantidad de re-límite en cada re-límite.

Esto simula un personaje del juego, por lo que tendrás que presionar Space para comenzar a rebotar …

 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(); } } } 

Bueno, puedo pensar de una manera. Implica algunas cantidades complejas de matemática (parábola). Así que voy a dar una respuesta muy simple.

 int y = 0; 

y en el método que prueba la barra espaciadora …

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

Aún no lo he probado, pero debería funcionar en teoría … Pero no animará nada, este código solo tomará el valor Y de los sprites y lo hará subir. Es el método de salto más fácil que puede existir …