Как заставить игрока упасть и удариться о землю?

0

Как заставить игрока (Графика) упасть и удариться о границу окна? У меня нет сценария для физики, но моя интерпретация того, как может работать код, такова:


//class ProgramGUI
import java.awt.*;

public void actionPerformed(ActionEvent ae) {
      posX += vlx;
      posY += vly;
}

public void paint(Graphics g) {
      Graphics2D player = (Graphics2d) g;
      player.fillRect(posX, posY, sizeX, sizeY)
}

public void fallDown() {
       posY = posY--; //is this correct? [^-^]
}
Новый участник
Athran123_ is a new contributor to this site. Take care in asking for clarification, commenting, and answering. Check out our Code of Conduct.
3
  • Спасибо за (Абра), который помог мне в том, как заставить графику перемещаться ТОЛЬКО внутри JFrame, а не за пределы JFrame? Это не относится к этому вопросу и было удалено. Смотрите: Что мне делать, когда кто-то отвечает на мой вопрос, правильно ли это? - попробуйте и посмотрите, что получится.
    camickr
    2 дня назад
  • Учти это. У вас есть дельта вверх (энергия) и дельта вниз (сила тяжести). Со временем величина восходящей дельты будет уменьшаться (из-за силы тяжести), пока вы не достигнете вершины прыжка, в этот момент восходящая дельта станет отрицательной (и будет продолжать уменьшаться, пока вы не коснетесь земли или не достигнете точки прыжка). предельная скорость). Я не физик, поэтому я бы начал с начальной восходящей дельты, и у меня была бы какая-то дельта «перетаскивания», которая вычиталась бы из нее при каждом обновлении. Я бы также проверил диапазон, чтобы восходящая дельта никогда не опускалась ниже «конечной» суммы. 2 дня назад
  • Для примера и примера 2 дня назад
1

Немного упрощенный пример. При нажатии Spaceобъект начнет падать. Небольшая «сила тяжести» постоянно добавляется к вертикальной дельте до тех пор, пока вы не достигнете нижней части изображения, либо она не достигнет предельной скорости.

import java.awt.Color;
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 java.awt.geom.Rectangle2D;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.Timer;

public class Test {
    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private double yDelta = 0;
        private double gravityDelta = 0.01;
        private double terminalVelocity = 4.0;

        private boolean isFalling = false;

        private Timer timer;

        private Rectangle2D player;

        public TestPane() {
            player = new Rectangle2D.Double(90, 0, 20, 20);

            getInputMap(WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0, false), "start");
            getActionMap().put("start", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (isFalling) {
                        return; 
                    }
                    yDelta = 0;
                    isFalling = true;
                    player = new Rectangle2D.Double(90, 0, 20, 20);
                }
            });
        }

        protected void doNextUpdate() {
            if (isFalling) {
                yDelta += gravityDelta;
                if (yDelta > terminalVelocity) {
                    yDelta = terminalVelocity;
                }

                player.setRect(player.getX(), player.getY() + yDelta, player.getWidth(), player.getHeight());
                if (player.getY() + player.getHeight() > getHeight()) {
                    yDelta = 0;
                    isFalling = false;
                    player.setRect(player.getX(), getHeight() - player.getHeight(), player.getWidth(), player.getHeight());
                }
            }

            repaint();
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 400);
        }

        @Override
        public void addNotify() {
            super.addNotify();
            if (timer != null) {
                timer.stop();
            }
            timer = new Timer(5, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    doNextUpdate();
                }
            });
            timer.start();
        }

        @Override
        public void removeNotify() {
            super.removeNotify();
            if (timer != null) {
                timer.stop();
            }
            timer = null;
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g.create();
            g2d.setColor(Color.RED);
            g2d.fill(player);
            g2d.dispose();
        }

    }
}

Кое-что нужно иметь в виду. Положительная вертикальная дельта будет перемещать вас вниз, отрицательная - вверх.