elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


  Mostrar Mensajes
Páginas: 1 ... 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 [52] 53 54 55 56 57 58 59
511  Programación / Java / Re: Aclaración de conceptos teóricos en: 4 Febrero 2015, 13:25 pm
De donde sacas eso  :huh:

Las alternativas B y D supongo son correctas.

Ya en la alternativa C ya se esta implementado L2 gracias a la clase D entonces no le veo el caso de reimplementar.

Y bueno la A no porque estas heredando una interfaz. /* No tomen en cuenta esto, se me fue la cabeza   :rolleyes:  :silbar:*/
512  Foros Generales / Foro Libre / Re: chats en: 4 Febrero 2015, 12:54 pm
pero como es más fácil sentarse en la pc y hacer un ddos con un programa hecho por terceros, usando la red pagada por sus padres por lo general, para dañar a una organización que a ellos les dicen que están mal, por lo general información que viene de los medios, los cuales son controlados por los que ellos mismos afirman ser el enemigo...

Yo creo que la respuesta va por ahí. Anonymous a diferencia de muchos otros grupos hacktivistas invito a todo el mundo formar parte de el, distribuyendo un software ilegal.

No pudieron controlar la masa, y la masa no piensa, la masa es estúpida. Esto mancho los ideales de Anonymous y no quedaron mas que un montón de cabezas revueltas que solo hacían mal para sus propios interés.

Muchos dirán... Bueno, pero eso no quiere decir que Anonymous sea malo.

El problema recae en que Anonymous es la masa, no las primeras personas y nosotros juzgamos por lo que son, no por lo que fueron ni por lo que dijeron ser.

Bueno, pero toda esta problemática yo creo que daría para un nuevo tema. No? Que lo del chat no se lo han respondido al pobre chico  :xD

PD: Los fantasmitas estan geniales.  ;-)
513  Seguridad Informática / Seguridad / Re: ¿como atrapar al secuestrador? en: 4 Febrero 2015, 04:50 am
Con la dirección ip no lograras mucho. Nose de donde seas pero las direcciones IPs publicas de clientes normales (en mi país) son dinámicas y según pruebas que he hecho no podrás obtener una dirección física real con los métodos que te ofrece internet, ya que muchas de estas direcciones están desactualizadas y no son exactas. Para que te hagas una idea mi dirección IP apunta a unos 3 o 4 kilometros de mi casa.

Tengo entendido que la policía tiene acceso a las direcciones físicas con exactitud absoluta (Esto es claro por motivos de seguridad) así que los mas indicados son ellos.

Ten en cuenta también que en este momento podrías estar interviniendo con la investigación, y se que es frustrante el saber que no puedes  hacer nada (yo pase por algo similar con mi madre). Pero la verdad es así, y lo mejor que puedes hacer es lo que dice angel lex, se insistente y sigue las indicaciones de especialistas.
514  Programación / Desarrollo Web / Re: Css. Problema con los selectores. en: 4 Febrero 2015, 02:48 am
A esto me refiero con el indentado:
Código
  1. <div id="comunidades">
  2. <div id="andalucia">
  3. <ul>
  4. <li>
  5. Cursos Andalucía <br/>
  6. <img src="images/comunidades/Andalucia.svg.png">
  7.            </li>
  8.        </ul>
  9.        <div class="provincias">
  10.            <img src="images/comunicacion/cursos_almeria_comunicacion.png" alt="Cursos comunicación Almería"
  11.                     title= "Cursos comunicación Almería">
  12.           <br/>Cursos Almería
  13.        </div>
  14.        <div class="provincias">
  15.            <img src="images/comunicacion/cursos_cordoba_comunicacion.png" alt="Cursos comunicación Cordoba"
  16.                    title="Cursos comunicación Córdoba">
  17.           <br/>Cursos Córdoba  
  18.        </div>
  19.    </div>
  20. </div>

Te enviare un mensaje, para ver si te puedo ayudar. Me es muy complicado hacerlo por acá sin ver tu código completo y sin ver algún boceto delo que quieres.

(yo le haría un indentado menor porque aun asi es dificil de entender)



He hecho un ejemplo que quizás te ayude, espero que te sea de ayuda.

Código
  1.  
  2.  
  3. <meta charset="utf8"/>
  4.  
  5. *{margin:0;padding:0;font-family:corbel;}
  6. .tr{width:1240px;}
  7. .tr span {display:block;text-align:center;}
  8. .tr .td img{display:block;width:200px;height:75px;margin:0 auto;}
  9. .tr .td{width:20%;padding:10px;background:#F1F1F1;border:solid 1px #000;box-sizing:border-box;float:left;}
  10. .tr .td ul{list-style-position: inside;}
  11.  
  12. </head>
  13.  
  14.  
  15. <div class = "tr">
  16. <div class = "td">
  17. <img src="ImagenComunidad.png" title="Comunidad"/>
  18. <span>Nombre Comunidad</span>
  19. </div>
  20.  
  21. <div class = "td">
  22. <img src="ImagenComunidad.png" title="Comunidad"/>
  23. <span>Nombre Comunidad</span>
  24. </div>
  25.  
  26. <div class = "td">
  27. <img src="ImagenComunidad.png" title="Comunidad"/>
  28. <span>Nombre Comunidad</span>
  29. </div>
  30.  
  31. <div class = "td">
  32. <img src="ImagenComunidad.png" title="Comunidad"/>
  33. <span>Nombre Comunidad</span>
  34. </div>
  35.  
  36. <div class = "td">
  37. <img src="ImagenComunidad.png" title="Comunidad"/>
  38. <span>Nombre Comunidad</span>
  39. </div>
  40. </div>
  41.  
  42. <div class = "tr">
  43. <div class = "td">
  44. <ul>
  45. <li><b>Nombre: </b>Nombre Comunidad</li>
  46. <li><b>Descripción: </b>Descripcion de la comunidad</li>
  47. <li><b>Otros: </b>Otras cosas de la comunidad</li>
  48. </ul>
  49. </div>
  50.  
  51. <div class= "td">
  52. <ul>
  53. <li><b>Nombre: </b>Nombre Comunidad</li>
  54. <li><b>Descripción: </b>Descripcion de la comunidad</li>
  55. <li><b>Otros: </b>Otras cosas de la comunidad</li>
  56. </ul>
  57. </div>
  58.  
  59. <div class= "td">
  60. <ul>
  61. <li><b>Nombre: </b>Nombre Comunidad</li>
  62. <li><b>Descripción: </b>Descripcion de la comunidad</li>
  63. <li><b>Otros: </b>Otras cosas de la comunidad</li>
  64. </ul>
  65. </div>
  66.  
  67. <div class= "td">
  68. <ul>
  69. <li><b>Nombre: </b>Nombre Comunidad</li>
  70. <li><b>Descripción: </b>Descripcion de la comunidad</li>
  71. <li><b>Otros: </b>Otras cosas de la comunidad</li>
  72. </ul>
  73. </div>
  74.  
  75. <div class= "td">
  76. <ul>
  77. <li><b>Nombre: </b>Nombre Comunidad</li>
  78. <li><b>Descripción: </b>Descripcion de la comunidad</li>
  79. <li><b>Otros: </b>Otras cosas de la comunidad</li>
  80. </ul>
  81. </div>
  82. </div>
  83.  
  84. <div class = "tr">
  85. <div class = "td">
  86. <ul>
  87. <li><b>Nombre: </b>Nombre Comunidad</li>
  88. <li><b>Descripción: </b>Descripcion de la comunidad</li>
  89. <li><b>Otros: </b>Otras cosas de la comunidad</li>
  90. </ul>
  91. </div>
  92.  
  93. <div class= "td">
  94. <ul>
  95. <li><b>Nombre: </b>Nombre Comunidad</li>
  96. <li><b>Descripción: </b>Descripcion de la comunidad</li>
  97. <li><b>Otros: </b>Otras cosas de la comunidad</li>
  98. </ul>
  99. </div>
  100.  
  101. <div class= "td">
  102. <ul>
  103. <li><b>Nombre: </b>Nombre Comunidad</li>
  104. <li><b>Descripción: </b>Descripcion de la comunidad</li>
  105. <li><b>Otros: </b>Otras cosas de la comunidad</li>
  106. </ul>
  107. </div>
  108.  
  109. <div class= "td">
  110. <ul>
  111. <li><b>Nombre: </b>Nombre Comunidad</li>
  112. <li><b>Descripción: </b>Descripcion de la comunidad</li>
  113. <li><b>Otros: </b>Otras cosas de la comunidad</li>
  114. </ul>
  115. </div>
  116.  
  117. <div class= "td">
  118. <ul>
  119. <li><b>Nombre: </b>Nombre Comunidad</li>
  120. <li><b>Descripción: </b>Descripcion de la comunidad</li>
  121. <li><b>Otros: </b>Otras cosas de la comunidad</li>
  122. </ul>
  123. </div>
  124. </div>
  125.  
  126. <div class = "tr">
  127. <div class = "td">
  128. <ul>
  129. <li><b>Nombre: </b>Nombre Comunidad</li>
  130. <li><b>Descripción: </b>Descripcion de la comunidad</li>
  131. <li><b>Otros: </b>Otras cosas de la comunidad</li>
  132. </ul>
  133. </div>
  134.  
  135. <div class= "td">
  136. <ul>
  137. <li><b>Nombre: </b>Nombre Comunidad</li>
  138. <li><b>Descripción: </b>Descripcion de la comunidad</li>
  139. <li><b>Otros: </b>Otras cosas de la comunidad</li>
  140. </ul>
  141. </div>
  142.  
  143. <div class= "td">
  144. <ul>
  145. <li><b>Nombre: </b>Nombre Comunidad</li>
  146. <li><b>Descripción: </b>Descripcion de la comunidad</li>
  147. <li><b>Otros: </b>Otras cosas de la comunidad</li>
  148. </ul>
  149. </div>
  150.  
  151. <div class= "td">
  152. <ul>
  153. <li><b>Nombre: </b>Nombre Comunidad</li>
  154. <li><b>Descripción: </b>Descripcion de la comunidad</li>
  155. <li><b>Otros: </b>Otras cosas de la comunidad</li>
  156. </ul>
  157. </div>
  158.  
  159. <div class= "td">
  160. <ul>
  161. <li><b>Nombre: </b>Nombre Comunidad</li>
  162. <li><b>Descripción: </b>Descripcion de la comunidad</li>
  163. <li><b>Otros: </b>Otras cosas de la comunidad</li>
  164. </ul>
  165. </div>
  166. </div>
  167. </body>
  168.  
  169. </html>
515  Programación / Java / [Aporte] Desarrollo Videojuego Java [Muy Basico] en: 4 Febrero 2015, 02:24 am
Saludos gente, en este aporte busco dar un primer paso para el desarrollo de videojuegos 2D de escritorio en Java.

Quiero dar entender que esta no es la mejor manera para desarrollar un videojuego en java y que tanpoco representa una arquitectura completa. Con esto ultimo me refiero a que el proyecto que mostrare de ejemplo no esta terminado y faltan piezas importantes para ser viable. (La razón por la cual no hice un proyecto completo es porque no busco imponer la forma en la cual programo, y a que no puedo encontrar un patrón ideal para el desarrollo de este tipo de proyectos ya que son muy variados).

Si gustan pondré mas ejemplos y ahondare mas en el tema a futuro, pero como no se cual es el real interés de este foro para este tipo de proyectos no explicare con mucho detalle el presente documento.

Se recomienda saber como funcionan los elementos Thread, JFrame y JPanel de java para poder comprender este documento.

En el presente documento se trataran los siguientes puntos:

  • Como controlar los gráficos (Muy básico, no se hablaran de sprites ni nada por el estilo).
  • Como controlar los FPS. (Intentare detallar en el tema)
  • Como recibir datos del teclado.

Este documento utilizara herramientas de las librerías java.awt y javax.swing (no se utilizara JavaFX).

Lo único que se hará en este proyecto es dibujar un simple cuadrado el cual se moverá por la pantalla utilizando teclado.



Empecemos creando un proyecto (no importa el nombre que le des). crea un paquete (nuevamente no importa el nombre) y posterior crea dos clases:

GameEsta contendrá el método de inicio donde se creara la ventana del juego.
GamePanelEsta clase sera el motor principal del videojuego en donde se dibujaran los gráficos y captara los datos del teclado.

Primero trabajaremos con la clase Game la cual contendrá el siguiente código:

Código
  1. package net.elhacker.game;
  2.  
  3. import javax.swing.JFrame; /* Importamos JFrame necesario para crear la ventana */
  4.  
  5. public class Game {
  6.  
  7.    public static void main(String[] args) {
  8.        JFrame window = new JFrame("Title"); /* Creamos la ventana del juego */
  9.        window.setContentPane(new GamePanel()); /* Establecemos el panel del juego */
  10.        window.setResizable(false); /* Bloqueamos el tamaño de la ventana */
  11.        window.pack(); /* Ajustamos el tamaño de la ventana al tamaño del juego */
  12.        window.setLocationRelativeTo(null); /* Colocamos la ventana en el centro */
  13.        window.setVisible(true); /* Hacemos la ventana visible */
  14.        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); /* Indicamos que al cerrar la ventana finaliza el proceso */
  15.    }
  16.  
  17. }
  18.  

No te preocupes es normal que de error en este momento el método setContentPane

Bien, explicare los aspectos mas importantes de esta clase:

El método setContentPane nos permite cambiar el panel por defecto de JFrame por nuestro panel en el cual dibujaremos los gráficos del videojuego.

Establecemos en el método setResizable que sea imposible alterar el tamaño del JFrame (A menos que lo hagamos nosotros por código) Este método inhabilita la opción de agrandar la ventana.

El método pack nos permite ajustar el tamaño de la ventana al tamaño del panel. (De esta manera no tendremos que preocuparnos de las medidas del panel)

el método setLocationRelativeTo(null) nos ahorrara mucho trabajo a la hora de posicionar la ventana de nuestro juego en medio. (Con este método nos ahorramos el tener que hacer cálculos para posicionar la ventana en medio de la pantalla)

En este momento window.setContentPane(new GamePanel()) da error debido a que GamePanel no es aun un panel, ahora trabajaremos con GamePanel y arreglaremos esto.

El código de GamePanel es el siguiente (No te preocupes se que es extenso pero intentare explicar cada  una de las partes por separado.)

Código
  1. package net.elhacker.game;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Dimension;
  5. import java.awt.Graphics;
  6. import java.awt.Rectangle;
  7. import java.awt.event.KeyEvent;
  8. import java.awt.event.KeyListener;
  9. import javax.swing.JPanel;
  10.  
  11. public class GamePanel extends JPanel implements Runnable, KeyListener {
  12.  
  13.    public static final int GAME_WIDTH = 640; /* Ancho sin escala del panel */
  14.    public static final int GAME_HEIGHT = 480; /* Largo sin escala del panel */
  15.  
  16.  
  17.    private int expectedFps = 60; /* FPS esperados */
  18.    private Thread gameThread; /* Thread del juego  */
  19.  
  20.    private final Rectangle rectangle = new Rectangle(0,0,32,32); /* Rectangulo blanco */
  21.                                                                  /* Los primeros dos valores son las cordenadas */
  22.                                                                  /* Los siguientes dos son el ancho y largo */
  23.  
  24.  
  25.    public GamePanel() {
  26.        this.setPreferredSize(new Dimension(
  27.                GamePanel.GAME_WIDTH, GamePanel.GAME_HEIGHT)); /* Se establece el tamaño del juego */
  28.        this.gameThread = new Thread(this); /* inicializamos el thread del juego */
  29.    }
  30.  
  31.    /*
  32.      * Thread que controla los FPS del juego
  33.      */
  34.  
  35.    @Override
  36.    public void run() {
  37.        long start;        
  38.        long elapsed;      
  39.        long wait;
  40.        while(true){
  41.            start = System.nanoTime();  /* Tomamos tiempo de inicio */
  42.            this.repaint();
  43.            elapsed = System.nanoTime(); /* Tomamos tiempo de fin */
  44.            wait = 1000/expectedFps - (elapsed-start)/1000000; /* Utilizamos formula de FPS */
  45.            wait = (wait < 0)? 0 : wait;  /* Prevenimos posibles errores */
  46.            try {
  47.                Thread.sleep(wait); /* Pausamos el thread */
  48.            } catch (InterruptedException ex) { /* Reportar Error */ }
  49.  
  50.        }
  51.    }
  52.  
  53.  
  54.    /*
  55.      * Este metodo inicializa el motor del juego
  56.      */
  57.  
  58.    private void init(){
  59.        this.gameThread.start();    /* iniciamos el motor del juego */
  60.        this.addKeyListener(this);  /* Hacemos que el juego capte las teclas del teclado */
  61.        this.setFocusable(true); /* Hacemos que sea posible hacer un focus a la ventana */
  62.        this.requestFocus();    /* Establecemos el foco al juego */
  63.    }
  64.  
  65.    /*
  66.      * Este metodo se activa al hacer visible el juego
  67.      */
  68.  
  69.    @Override
  70.    public void addNotify() {  
  71.        super.addNotify();
  72.        init(); /* se inicia el motor del juego */
  73.    }
  74.  
  75.    /*
  76.      * Metodo para pintar
  77.      */
  78.  
  79.    @Override
  80.    public void paintComponent(Graphics g) {
  81.        g.setColor(Color.DARK_GRAY); /* Seleccionamos el color gris oscuro */
  82.        g.fillRect(0, 0, GamePanel.GAME_WIDTH,
  83.                GamePanel.GAME_HEIGHT); /* Pintamos el fondo gris oscuro */
  84.  
  85.        g.setColor(Color.WHITE); /* Seleccionamos el color blanco */
  86.        g.fillRect(rectangle.x, rectangle.y, rectangle.width, rectangle.height); /* Pintamos el rectangulo */
  87.    }
  88.  
  89.  
  90.  
  91.  
  92.    @Override
  93.    public void keyTyped(KeyEvent e) { }
  94.  
  95.  
  96.    /*
  97.      * Metodo de escucha que nos permite realizar acciones dependiendo de las
  98.      * teclas presionadas
  99.      */
  100.    @Override
  101.    public void keyPressed(KeyEvent e) {
  102.        switch(e.getExtendedKeyCode()){
  103.            case KeyEvent.VK_LEFT:
  104.                rectangle.x-=32;
  105.                break;
  106.            case KeyEvent.VK_RIGHT:
  107.                rectangle.x+=32;
  108.                break;
  109.            case KeyEvent.VK_UP:
  110.                rectangle.y-=32;
  111.                break;
  112.            case KeyEvent.VK_DOWN:
  113.                rectangle.y+=32;
  114.                break;
  115.        }
  116.    }
  117.  
  118.    @Override
  119.    public void keyReleased(KeyEvent e) {
  120.  
  121.    }

Partamos por esta parte:

Código
  1. public class GamePanel extends JPanel implements Runnable, KeyListener

Heredamos de JPanel el cual nos permitirá transformar nuestra clase a una clase tipo Container (GamePanel hereda de container) la cual repara el error de window.setContentPane(new GamePanel()). GamePanel tiene un método de doble buffer el cual nos permitirá controlar mas fácilmente las imágenes.

También implementamos Runnable el cual utilizaremos para crear el Thread que permitirá controlar los FPS de nuestro juego e implementamos KeyListener el cual nos permitirá escuchar datos del teclado.

Bien Ahora veamos los atributos de nuestra clase:

Código
  1. public static final int GAME_WIDTH = 640; /* Ancho sin escala del panel */
  2. public static final int GAME_HEIGHT = 480; /* Largo sin escala del panel */
  3.  
  4. private int expectedFps = 60; /* FPS esperados */
  5. private Thread gameThread; /* Thread del juego  */
  6.  
  7. private final Rectangle rectangle = new Rectangle(0,0,32,32); /* Rectangulo blanco */
  8.                                                              /* Los primeros dos valores son las cordenadas */
  9.                                                              /* Los siguientes dos son el ancho y largo */

GAME_WIDTH y GAME_HEIGHT serán las que indicaran respectivamente el ancho y largo de la ventana.

expectedFps representaran a los FPS esperados (FPS = Frames Per Second)

gameThread sera el thread que utilizaremos para repintar nuestro juego cada X milisegundos utilizando.

rectangle sera en este caso nuestro cuadrado blanco que se moverá por la pantalla (representando a un elemento del juego). Los dos primeros valores representan las cordenadas y los dos ultimos el ancho y largo.

Posterior a esto declaramos nuestro constructor en donde define el ancho y largo de nuestra ventana. Ten en cuenta que esto lo hacemos por el método PreferredSize y no por el método setSize (esto es necesario ya que pack() funciona teniendo en cuenta el tamaño preferido, no el real). Y en el mismo contructor crearemos nuestro Thread señalando que se utilizara la misma clase como Thread.

Código
  1. public GamePanel() {
  2.    this.setPreferredSize(new Dimension(
  3.            GamePanel.GAME_WIDTH, GamePanel.GAME_HEIGHT)); /* Se establece el tamaño del juego */
  4.    this.gameThread = new Thread(this); /* inicializamos el thread del juego */
  5. }

Ahora definiremos el método run (el cual implementamos de runnable)

Código
  1. @Override
  2.    public void run() {
  3.        long start;        
  4.        long elapsed;      
  5.        long wait;
  6.        while(true){
  7.            start = System.nanoTime();  /* Tomamos tiempo de inicio */
  8.            this.repaint();
  9.            elapsed = System.nanoTime(); /* Tomamos tiempo de fin */
  10.            wait = 1000/expectedFps - (elapsed-start)/1000000; /* Utilizamos formula de FPS */
  11.            wait = (wait < 0)? 0 : wait;  /* Prevenimos posibles errores */
  12.            try {
  13.                Thread.sleep(wait); /* Pausamos el thread */
  14.            } catch (InterruptedException ex) { /* Reportar Error */ }
  15.  
  16.        }
  17.    }
   
   
Nos detendremos un poco acá para explicar un par de cosas:

Las películas, videojuegos o cualquier animación no son mas que un montón de fotografías pasadas a una gran velocidad. La velocidad por la cual pasan estas fotografías es medida en FPS(Framies Per Second) (Cuadros Por Segundo)  y  la velocidad optima son unos 60 fotografías por segundo en el caso de los videojuegos.

Entonces nuestro thread tiene como objetivo pintar 60 fotografías por segundo, para esto se utiliza un algoritmo que explicare a continuación.

bien te explico, utilizando el metodo repaint() obligamos a nuestro panel volver a pintarse, luego utilizando Thread.sleep() hacemos que nuestro Thread se detenga por una cantidad minúscula de tiempo ya que si no hiciéramos esto el Thread no pararía de pintar a la mayor velocidad posible. Lo cual ocasionaría problemas de rendimiento (Esto tenemos que evitarlo. Claro, porque despues dicen que java es lento) pues bien aqui es cuando entra el concepto de FPS, ¿Cuanto tiempo es necesario que duerma nuestro Thread para lograr que se pinte 60 veces por segundo?

Sabiendo que Thread.sleep() recibe como parámetro milisegundos usaremos la siguiente formula 1000/60. De esta manera cada unos 16.6 milisegundos nuestro programa pintara un nuevo cuadro (esto medido en 1 segundo serán 60 cuadros).

Código
  1. while (true) {
  2. this.repaint();
  3. Thread.sleep(1000/60);
  4. }

Pero si fuera tan fácil porqué a algunos videojuegos le cuesta tanto llegar a los 60 cuadros por segundo?

Pues esto es porque la formula no termina acá. nos ha faltado algo importante. Y es que no tuvimos el cuenta la cantidad de tiempo que se demora en repintar nuestro panel.

Te daré un ejemplo simple. Imagina un pintor. Este pintor tiene por obligación pintar un cuadro todos los días.
Su obligación es empezar a pintar a las 8AM y se puede ir a dormir cuando termine de pintar el cuadro.

Si el primer día se demora 12 horas en pintar el cuadro el hombre podrá dormir 12 horas.
Si el segundo día se demora 10 horas en pintar el cuadro entonces el pintor dormirá 14 horas.
Pero si el tercer día se demora 23 horas en pintar el cuadro, el pobre hombre solo podrá dormir una hora.

Pues bien, si nuestro programa se demora 3 milisegundos en pintar el cuadro entonces tendremos que restar esos 3 milisegundos a los 16.6 milisegundos lo que daria un total de 13.6 milisegundos. El problema es que nosotros no sabremos cuanto se demora en pintar el cuadro ya que esto depende de cuantos recursos disponibles hay en el sistema (si la computadora esta ejecutando el antivirus mientras juegan nuestro juego, lo mas natural es que nuestro juego no funcione al 100% de velocidad)

Para saber cuanto se demora en pintar el cuadro necesitaremos tomar el tiempo antes de pintar, y después de pintar el cuadro luego hacer una resta y obtendremos el tiempo. Este tiempo lo restamos a los 1000/60 y obtendremos el tiempo real en que nuestro thread puede dormir.

Si te fijas bien para prevenir errores verifique que el tiempo nunca sea menor a 0.

Código
  1. start = System.nanoTime();  /* Tomamos tiempo de inicio */
  2. this.repaint();
  3. elapsed = System.nanoTime(); /* Tomamos tiempo de fin */
  4. wait = 1000/expectedFps - (elapsed-start)/1000000; /* Utilizamos formula de FPS */
  5. wait = (wait < 0)? 0 : wait;  /* Prevenimos posibles errores */
  6. try {
  7.    Thread.sleep(wait); /* Pausamos el thread */
  8. } catch (InterruptedException ex) { /* Reportar Error */ }
  9.  

sleep puede causar errores, por eso se utiliza un try-catch

Posterior mente declararemos el método init, en el cual pondremos todo lo necesario para que nuestro juego sea funcional y visible, para esto iniciamos el Thread previamente declarado, y hacemos que la ventana pueda escuchar las teclas presionadas en el teclado.

Código
  1. private void init(){
  2.    this.gameThread.start();    /* iniciamos el motor del juego */
  3.    this.addKeyListener(this);  /* Hacemos que el juego capte las teclas del teclado */
  4.    this.setFocusable(true); /* Hacemos que sea posible hacer un focus a la ventana */
  5.    this.requestFocus();    /* Establecemos el foco al juego */
  6. }

(para que el juego capte las teclas del teclado tenemos que hacer que sea posible hacer focus en el panel, si tienes una duda respecto a esto comentalo e intentare responderte a la brevedad.)

La siguiente parte no es nada complicada, solo redefinimos el metodo addNotify (Este método se activa cuando hacemos el juego visible) y agregamos nuestro metodo init() el cual a su vez hará que nuestro Thread se ejecute.

Código
  1. @Override
  2. public void addNotify() {  
  3.    super.addNotify();
  4.    init(); /* se inicia el motor del juego */
  5. }

Ahora redefinimos el método paintComponent que es el encargado de dibujar los gráficos de nuestro juego.

Código
  1. @Override
  2. public void paintComponent(Graphics g) {
  3.    g.setColor(Color.DARK_GRAY); /* Seleccionamos el color gris oscuro */
  4.    g.fillRect(0, 0, GamePanel.GAME_WIDTH,
  5.            GamePanel.GAME_HEIGHT); /* Pintamos el fondo gris oscuro */
  6.  
  7.    g.setColor(Color.WHITE); /* Seleccionamos el color blanco */
  8.    g.fillRect(rectangle.x, rectangle.y, rectangle.width, rectangle.height); /* Pintamos el rectangulo */
  9. }

Graphics funciona como si utilizaras paint, primero le indicas el color y luego lo que quieres hacer, en este caso primero indicamos el color gris oscuro y pintamos un cuadrado del mismo tamaño que nuestro panel (de esta manera hacemos un fondo oscuro), luego seleccionamos el color blanco y pintamos nuestro rectángulo.

Ahora solo es necesario redefinir los métodos del teclado (cada vez que se apreté una tecla se hará algo que nosotros queramos). En este caso solo redefiniremos keyPressed (este se activa al presionar una tecla)

Código
  1. /*
  2.  * Metodo de escucha que nos permite realizar acciones dependiendo de las
  3.  * teclas presionadas
  4.  */
  5. @Override
  6. public void keyPressed(KeyEvent e) {
  7.    switch(e.getExtendedKeyCode()){
  8.        case KeyEvent.VK_LEFT:
  9.            rectangle.x-=32;
  10.            break;
  11.        case KeyEvent.VK_RIGHT:
  12.            rectangle.x+=32;
  13.            break;
  14.        case KeyEvent.VK_UP:
  15.            rectangle.y-=32;
  16.            break;
  17.        case KeyEvent.VK_DOWN:
  18.            rectangle.y+=32;
  19.            break;
  20.    }
  21. }
  22.  
  23. @Override
  24. public void keyReleased(KeyEvent e) { }


Con ayuda de un switch y case haremos cada caso posible.

  • Si se aprieta la direccional izquierda nuestro cuadro se mueve 32 pixeles a la izquierda
  • Si se aprieta la direccional derecha nuestro cuadro se mueve 32 pixeles a la derecha
  • Si se aprieta la direccional arriba nuestro cuadro se mueve 32 pixeles a la arriba
  • Si se aprieta la direccional abajo nuestro cuadro se mueve 32 pixeles a la abajo

Ten en cuenta que los pixeles se miden desde el extremo superior izquierdo de la pantalla por esta razón tienes que restar para ir hacia arriba y sumar para ir hacia abajo.

Intentalo tu:

  • Actualmente el cuadrado puede salir de los bordes, intenta evitar que esto sea posible.
  • Intenta crear un segundo cuadra que se mueva con las teclas ASDW
  • Intenta crear una cuadricula amarilla que se se haga visible al apretar la tecla c, y si se apreta nuevamente esta se haga invisible otra vez

Espero la tutorial les haya sido de ayuda. Estoy pensando en hacer un vídeo ya que entiendo que puede ser difícil de entender con tan solo esto. Por otro lado, para los mas experimentados, se que esta tutorial es simple y que no abordo algunos temas importante, pero la verdad es que no se como sera recibido por la comunidad así que no quería hacer algo muy complejo.
516  Foros Generales / Foro Libre / Re: ¿Me ayudais a hacer un trabajo con vuestra experiencia? en: 3 Febrero 2015, 23:04 pm
Te contare una queja:

Al mundo comercial le interesa que las cosas se hagan rápido y que funcionen, no les interesa que este bien hecho, mientras funcione basta. Esto me mata por el simple hecho de que hace poco tuve que reparar un problema con una pagina web...

Tal que me encuentro con el código y era un maldito plato de fideos todo enredado no se entendía nada.

Borre todo el modulo y lo reescribí... claro cobré lo mismo. Ya que a ellos solo les interesa que funcione.

Mi recomendación es que digas "Lo haré" después de analizar el problema  :xD
517  Programación / Scripting / Re: ayuda en: 3 Febrero 2015, 22:48 pm
Eso?

Código
  1. "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" https://login.live.com

Esto.. no soy de este sub-foro ya que no se mucho, pero creo que seria mejor si pusieras un titulo mas descriptivo y que buscaras en google antes de publicar :-[



Copia, pega y guardalo como .bat (solo funciona si utilizas chrome, si no cambia la dirección)
518  Foros Generales / Foro Libre / Re: chats en: 3 Febrero 2015, 22:35 pm
 :laugh: :laugh: :laugh:
Y pensar que la discusión empezó porque el quería contactar con Anonymous y ahora estamos hablando de la libertad y corrupción. (supongo que si angel lex esta hablando en el tema no hay lio  :xD)

Yo hablare según mi experiencia. En mas de una ocasiona he representado a gran cantidad de personas (dirigí grupos de estudiantes en huelga y participe en marchas pro educación entre otras cosas).

  • El 30% de las personas que se manifiestan lo hacen para lograr un cambio positivo, respetan las reglas y creen que hablando se solucionaran las cosas.
  • Un 40% ya no quiere hablar, solo quiere pelear, están cansados y aburridos de que  nunca  se llegue a nada, pero aun así apoyan la causa.
  • El 30% restante no le interesa nada, solo están ahí para causar problemas.

Y con Anonymous yo diría que ese ultimo 30% era mas bien un 60%....
519  Programación / Java / Re: Aclaración de conceptos teóricos en: 3 Febrero 2015, 22:05 pm
Un método estático es también llamado "método de clase"
Los métodos estáticos no necesitan de un objeto para ser utilizado, y por esta razón tu puedes acceder a este método utilizando el nombre de la clase:

Código
  1. Clase.metodoEstatico();

Un método estático solo puede modificar atributos estáticos ya que de alguna manera ambos no pertenecen al objeto (si creas 10 objetos con un atributo estático, los 10 objetos tendrán el mismo valor en aquel atributo, si cambias ese valor en uno de los objetos, se cambiara en todos)

En otras palabras, las variables de clase solo pueden ser modificadas por métodos de clase, de hecho, tu no deberías poder usar la palabra this. para acceder a una variable estática.

En respuesta a tu pregunta 3 es muy deducible el porque. La razón por la cual no puedes crear un método estático y abstracto es porque los métodos estáticos se utilizan sin necesidad de un objeto, y si no creas un objeto de una clase abstracta nunca podrás definir sus métodos estáticos, por lo tanto es imposible el utilizar un método estático y abstracto, ya que simplemente no esta definido. (espero me entiendas)

Respecto a tu ultima pregunta, solo puedo decir que todo en una interface es publico, y por esa razón es recomendable que si declaras algún atributo tiene que ser por  recomendación final (regla de encapsulamiento). Si un atributo es publico, sera accesible desde cualquier lugar, por lo tanto lo mejor de todo es que esta variable sea FINAL de esta manera no tendrás problemas en que cambien el valor desde cualquier otro lugar. Pero según se no es obligatorio el que sea estático o final.



Modifico, efectivamente tienes razón tiene que ser public estatico y final... la verdad no sabría que decirte, pero según se las interfaces se utilizan siempre para redefinir métodos (no he tenido necesidad de utilizar variables)
520  Foros Generales / Foro Libre / Re: chats en: 3 Febrero 2015, 21:49 pm
Como dice angel lex

que sean actros criminales contra criminales no dejan de ser poco eticos e ilegales XD

Por otro lado Anonymous no hizo las cosas de una forma responsable. Claro, querían que todo el mundo se uniera a la causa pero Anonymous no es capas de controlar a todo el mundo. Esparcieron un software que hacia ataques DDoS el cual fue usado por muchos Lammers quienes solo causaron problemas y utilizaron dicho software para bienes propios.

No digo que Anonymous hiciera eso queriendo (o siquiera que realmente fuera Anonymous y no alguien que utilizara su nombre).

El mundo no es un comic de V of vendetta y tampoco es una película...
Páginas: 1 ... 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 [52] 53 54 55 56 57 58 59
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines