Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.awt.*;
- import java.awt.event.*;
- import javax.swing.*;
- public class Sigue extends JComponent {
- private final static int ANCHO = 500, ALTO = 500, DIAMETRO = 20;
- private float x, y, vx, vy, xf, yf, vxf, vyf;
- private boolean arriba, abajo, izquierda, derecha;
- public Sigue() {
- setPreferredSize(new Dimension(ANCHO, ALTO));
- addKeyListener(new KeyAdapter() {
- public void keyPressed(KeyEvent e) {
- actualiza(e.getKeyCode(), true);
- }
- public void keyReleased(KeyEvent e) {
- actualiza(e.getKeyCode(), false);
- }
- private void actualiza(int keyCode, boolean pressed) {
- switch (keyCode) {
- case KeyEvent.VK_UP:
- arriba = pressed;
- break;
- case KeyEvent.VK_DOWN:
- abajo = pressed;
- break;
- case KeyEvent.VK_LEFT:
- izquierda = pressed;
- break;
- case KeyEvent.VK_RIGHT:
- derecha = pressed;
- break;
- }
- }
- });
- setFocusable(true);
- }
- private float clamp(float valor, float min, float max) {
- if (valor > max)
- return max;
- if (valor < min)
- return min;
- return valor;
- }
- public void paint(Graphics g) {
- // BOX
- g.setColor(Color.WHITE);
- g.fillRect(0, 0, ANCHO, ALTO);
- // FOLLOWER
- g.setColor(Color.BLUE);
- g.fillRect(Math.round(xf), Math.round(yf), DIAMETRO, DIAMETRO);
- // PLAYER
- g.setColor(Color.RED);
- g.fillOval(Math.round(x), Math.round(y), DIAMETRO, DIAMETRO);
- }
- private void dibuja() throws Exception {
- SwingUtilities.invokeAndWait(new Runnable() {
- public void run() {
- paintImmediately(0, 0, ANCHO, ALTO);
- }
- });
- }
- public void fisica() throws Exception {
- long tiempoViejo = System.nanoTime();
- x = 20; y = 20; xf = 480 ; yf = 480;
- while (true) {
- long tiempoNuevo = System.nanoTime();
- float dt = (tiempoNuevo - tiempoViejo) / 1000000000f;
- tiempoViejo = tiempoNuevo;
- vx = 0; vy = 0;
- float modulo = (float) Math.sqrt(Math.pow(x-xf,2)+Math.pow(y-yf,2));
- vxf = (x-xf)/modulo*200; vyf = (y-yf)/modulo*200;
- if ( arriba && !derecha && !izquierda ) vy = -300;
- if ( abajo && !derecha && !izquierda ) vy = 300;
- if ( izquierda && !arriba && !abajo ) vx = -300;
- if ( derecha && !arriba && !abajo ) vx = 300;
- if ( arriba && derecha )
- {
- vy = (float) -Math.sin(45*Math.PI/180.0)*300;
- vx = (float) Math.cos(45*Math.PI/180.0)*300;
- }
- if ( arriba && izquierda )
- {
- vy = (float) -Math.sin(45*Math.PI/180.0)*300;
- vx = (float) -Math.cos(45*Math.PI/180.0)*300;
- }
- if ( abajo && derecha )
- {
- vy = (float) Math.sin(45*Math.PI/180.0)*300;
- vx = (float) Math.cos(45*Math.PI/180.0)*300;
- }
- if ( abajo && izquierda )
- {
- vy = (float) Math.sin(45*Math.PI/180.0)*300;
- vx = (float) -Math.cos(45*Math.PI/180.0)*300;
- }
- x = clamp(x + vx * dt, 0, ANCHO - DIAMETRO);
- y = clamp(y + vy * dt, 0, ALTO - DIAMETRO);
- xf = clamp(xf + vxf * dt, 0, ANCHO - DIAMETRO);
- yf = clamp(yf + vyf * dt, 0, ALTO - DIAMETRO);
- dibuja();
- }
- }
- public static void main(String[] args) throws Exception {
- JFrame jf = new JFrame("Sigue");
- jf.addWindowListener(new WindowAdapter() {
- public void windowClosing(WindowEvent e) {
- System.exit(0);
- }
- });
- jf.setResizable(false);
- Sigue sigue = new Sigue();
- jf.getContentPane().add(sigue);
- jf.pack();
- jf.setVisible(true);
- sigue.fisica();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement