Advertisement
Kyrexar

Sigue

Jan 6th, 2013
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 4.58 KB | None | 0 0
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import javax.swing.*;
  4.  
  5. public class Sigue extends JComponent {
  6.  
  7.     private final static int ANCHO = 500, ALTO = 500, DIAMETRO = 20;
  8.     private float x, y, vx, vy, xf, yf, vxf, vyf;
  9.     private boolean arriba, abajo, izquierda, derecha;
  10.  
  11.     public Sigue() {
  12.         setPreferredSize(new Dimension(ANCHO, ALTO));
  13.        
  14.         addKeyListener(new KeyAdapter() {
  15.                 public void keyPressed(KeyEvent e) {
  16.                     actualiza(e.getKeyCode(), true);
  17.                 }
  18.  
  19.                 public void keyReleased(KeyEvent e) {
  20.                     actualiza(e.getKeyCode(), false);
  21.                 }
  22.  
  23.                 private void actualiza(int keyCode, boolean pressed) {
  24.                     switch (keyCode) {
  25.                         case KeyEvent.VK_UP:
  26.                             arriba = pressed;
  27.                             break;
  28.  
  29.                         case KeyEvent.VK_DOWN:
  30.                             abajo = pressed;
  31.                             break;
  32.  
  33.                         case KeyEvent.VK_LEFT:
  34.                             izquierda = pressed;
  35.                             break;
  36.  
  37.                         case KeyEvent.VK_RIGHT:
  38.                             derecha = pressed;
  39.                             break;
  40.                     }
  41.                 }
  42.             });
  43.         setFocusable(true);
  44.     }
  45.  
  46.     private float clamp(float valor, float min, float max) {
  47.         if (valor > max)
  48.             return max;
  49.         if (valor < min)
  50.             return min;
  51.         return valor;
  52.     }
  53.  
  54.     public void paint(Graphics g) {
  55.        
  56.         // BOX
  57.         g.setColor(Color.WHITE);
  58.         g.fillRect(0, 0, ANCHO, ALTO);
  59.        
  60.         // FOLLOWER
  61.         g.setColor(Color.BLUE);
  62.         g.fillRect(Math.round(xf), Math.round(yf), DIAMETRO, DIAMETRO);
  63.        
  64.         // PLAYER
  65.         g.setColor(Color.RED);
  66.         g.fillOval(Math.round(x), Math.round(y), DIAMETRO, DIAMETRO);
  67.        
  68.     }
  69.  
  70.     private void dibuja() throws Exception {
  71.         SwingUtilities.invokeAndWait(new Runnable() {
  72.                 public void run() {
  73.                     paintImmediately(0, 0, ANCHO, ALTO);
  74.                 }
  75.             });
  76.     }
  77.  
  78.     public void fisica() throws Exception {
  79.         long tiempoViejo = System.nanoTime();
  80.         x = 20; y = 20; xf = 480 ; yf = 480;
  81.        
  82.         while (true) {
  83.         long tiempoNuevo = System.nanoTime();
  84.             float dt = (tiempoNuevo - tiempoViejo) / 1000000000f;
  85.             tiempoViejo = tiempoNuevo;
  86.            
  87.             vx = 0; vy = 0;
  88.             float modulo = (float) Math.sqrt(Math.pow(x-xf,2)+Math.pow(y-yf,2));
  89.             vxf = (x-xf)/modulo*200; vyf = (y-yf)/modulo*200;
  90.  
  91.             if ( arriba && !derecha && !izquierda ) vy = -300;
  92.             if ( abajo && !derecha && !izquierda ) vy = 300;
  93.             if ( izquierda && !arriba && !abajo ) vx = -300;
  94.             if ( derecha && !arriba && !abajo ) vx = 300;
  95.            
  96.             if ( arriba && derecha )
  97.             {
  98.                 vy = (float) -Math.sin(45*Math.PI/180.0)*300;
  99.                 vx = (float) Math.cos(45*Math.PI/180.0)*300;
  100.             }
  101.            
  102.             if ( arriba && izquierda )
  103.             {
  104.                 vy = (float) -Math.sin(45*Math.PI/180.0)*300;
  105.                 vx = (float) -Math.cos(45*Math.PI/180.0)*300;
  106.             }
  107.            
  108.             if ( abajo && derecha )
  109.             {
  110.                 vy = (float) Math.sin(45*Math.PI/180.0)*300;
  111.                 vx = (float) Math.cos(45*Math.PI/180.0)*300;
  112.             }
  113.            
  114.             if ( abajo && izquierda )
  115.             {
  116.                 vy = (float) Math.sin(45*Math.PI/180.0)*300;
  117.                 vx = (float) -Math.cos(45*Math.PI/180.0)*300;
  118.             }
  119.            
  120.            
  121.             x = clamp(x + vx * dt, 0, ANCHO - DIAMETRO);
  122.             y = clamp(y + vy * dt, 0, ALTO - DIAMETRO);
  123.            
  124.             xf = clamp(xf + vxf * dt, 0, ANCHO - DIAMETRO);
  125.             yf = clamp(yf + vyf * dt, 0, ALTO - DIAMETRO);
  126.            
  127.             dibuja();
  128.         }
  129.     }
  130.  
  131.     public static void main(String[] args) throws Exception {
  132.         JFrame jf = new JFrame("Sigue");
  133.         jf.addWindowListener(new WindowAdapter() {
  134.                 public void windowClosing(WindowEvent e) {
  135.                     System.exit(0);
  136.                 }
  137.             });
  138.         jf.setResizable(false);
  139.         Sigue sigue = new Sigue();
  140.         jf.getContentPane().add(sigue);
  141.         jf.pack();
  142.         jf.setVisible(true);
  143.         sigue.fisica();
  144.     }
  145. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement