如何在java中进行精灵跳转?

编程入门 行业动态 更新时间:2024-10-04 21:17:57
本文介绍了如何在java中进行精灵跳转?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我有一个用于向左,向右,向上和向下移动的精灵的KeyEvents。我只是搞乱了,正在考虑另一个我希望精灵跳跃的项目。它不一定非常现实,因为我刚刚开始。我所拥有的是当按下空格键时,它将导致精灵跳跃,让我们说dy = -3。那么我有KeyRevent的KeyEvent,它会掉落,dy = -2。这不起作用,因为精灵只是继续下降...有人能发光吗?

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. It doesn't have to be fully realistic as I am just beginning. What I have is when the space bar is pressed, it will cause the sprite to jump, lets say "dy = -3". So then I have the KeyEvent for keyReleased, it will fall, "dy = -2". This does not work as the sprite just continues to fall...can someone shine some light?

整个代码:包冲突;

Entire code: package collision;

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

您可能已经注意到我Java新手以及游戏编程。我想要的只是精灵上升,然后回来。如果有帮助,它将始终保持静止。精灵只是继续跳跃,直到他被一个即将到来的障碍击中。我知道有其他动作的代码,但是一旦我开始下一个精灵就会删除它们。

As you may have noticed Im new to Java as well as game programming. All I want is the sprite to go up, then come back down. It will always remain stationary if that helps. The sprite just keeps jumping until he is hit by an on coming obstacle. I know there is code for other movements, but those will be removed once I start on next sprite.

推荐答案

这是基本概念。您的实现将根据引擎的实现而改变。

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.

这个实现也有一个重新绑定的delta,它允许sprite重新绑定而不是突然停止。重新绑定受到重新绑定的降级的影响,这会降低每次重新绑定的重新绑定量。

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.

这模拟了一个游戏角色,所以你我需要按 Space 开始弹跳...

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

更多推荐

如何在java中进行精灵跳转?

本文发布于:2023-11-29 15:21:18,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1646780.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:跳转   精灵   如何在   java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!