Fecha y hora actual: Martes 23 Abr 2019 18:45
Índice del Foro

Foros de programación informática, diseño gráfico y Web

En esta comunidad intentaremos dar soporte de programación a todos los niveles, desde principiantes a profesionales de la informática, desarrollo de programas, programación web y mucho más.

[JAVA] Guerra por turnos 2 jugadores

Responder al Tema

Índice del Foro > Programación de juegos o videojuegos > [JAVA] Guerra por turnos 2 jugadores

Autor Mensaje
xXn



Registrado: 14 May 2014
Mensajes: 4

Mensaje Publicado: Miércoles 14 May 2014 21:06

Título del mensaje: [JAVA] Guerra por turnos 2 jugadores

Responder citando

Es muy complicado conseguir sprite para poner asi que las animaciones y eso todavia nno me sale bien ya que no consigo cosas buenas para las cosas que hago. Ahora voy a practicar con el MouseListener a ver que onda

Stage.java 

Código:
  1. package juego;
  2.  
  3. import java.awt.image.ImageObserver;
  4.  
  5. public interface Stage extends ImageObserver {
  6. public static final int WIDTH = 800;
  7. public static final int HEIGHT = 544;
  8. public static final int PLAY_HEIGHT = 544;
  9.  
  10. public SpriteCache getSpriteCache();
  11. public SoundCache getSoundCache();
  12.  
  13. public void addBala(Actor a);
  14. public void terminarTurno();
  15. public void gameOver();
  16. }
  17.  



Main.java
Código:
  1. package juego;
  2.  
  3. import java.awt.Canvas;
  4. import java.awt.Color;
  5. import java.awt.Dimension;
  6. import java.awt.Font;
  7. import java.awt.Graphics2D;
  8. import java.awt.Rectangle;
  9. import java.awt.TexturePaint;
  10. import java.awt.Transparency;
  11. import java.awt.event.KeyEvent;
  12. import java.awt.event.KeyListener;
  13. import java.awt.event.WindowAdapter;
  14. import java.awt.event.WindowEvent;
  15. import java.awt.image.BufferStrategy;
  16. import java.awt.image.BufferedImage;
  17. import java.util.ArrayList;
  18.  
  19. import javax.swing.JFrame;
  20. import javax.swing.JPanel;
  21.  
  22. public class Main extends Canvas implements Stage, KeyListener{
  23. private BufferStrategy strategy;
  24. private SpriteCache spriteCache;
  25. private SoundCache soundCache;
  26.  
  27. private int segundos;
  28. private int turno = 0;
  29. private ArrayList jugadores;
  30. private ArrayList bala;
  31.  
  32. private long usedTime; //Fps
  33.  
  34. private boolean gameEnded = false;
  35. private BufferedImage background, backgroundTile;;
  36.  
  37. public Main(){
  38. spriteCache = new SpriteCache();
  39. soundCache = new SoundCache();
  40.  
  41. JFrame ventana = new JFrame("Guerra de tanques");
  42. JPanel panel = (JPanel) ventana.getContentPane();
  43. setBounds(0,0,Stage.WIDTH,Stage.HEIGHT);
  44. panel.setPreferredSize(new Dimension(Stage.WIDTH,Stage.HEIGHT));
  45. //panel.setBackground(Color.black);
  46. panel.setLayout(null);
  47. panel.add(this);
  48.  
  49. ventana.setBounds(0, 0, Stage.WIDTH, Stage.HEIGHT);
  50. ventana.setVisible(true);
  51.  
  52. ventana.addWindowListener(new WindowAdapter(){
  53. public void windowClosing(WindowEvent e){
  54. System.exit(0);
  55. }
  56. });
  57.  
  58. ventana.setResizable(false);
  59.  
  60. createBufferStrategy(2);
  61. strategy = getBufferStrategy();
  62.  
  63. requestFocus();
  64. addKeyListener(this);
  65. setIgnoreRepaint(true);
  66. }
  67.  
  68. public static void main(String[] args){
  69.  
  70. final Main main = new Main();
  71.  
  72. Thread thread1 = new Thread () {
  73. public void run () {
  74. main.PlayGame();
  75. }
  76. };
  77.  
  78. Thread thread2 = new Thread () {
  79. public void run () {
  80. main.empezarContador();
  81. }
  82. };
  83. thread1.start();
  84. thread2.start();
  85. }
  86.  
  87. public class Tarea extends Thread{
  88. public Tarea(String str){
  89. super(str);
  90. }
  91. }
  92.  
  93. public void PlayGame(){
  94. usedTime = 1000;
  95. initWorld();
  96. while(isVisible() && !gameEnded && !jugadores.isEmpty()){
  97. long startTime = System.currentTimeMillis();
  98. updateWorld();
  99. checkCollisions();
  100. paintWorld();
  101. usedTime = System.currentTimeMillis() - startTime;
  102. do{
  103. Thread.yield();
  104. }while(System.currentTimeMillis() - startTime < 17);
  105. }
  106.  
  107. paintGameOver();
  108. }
  109.  
  110. public void initWorld(){
  111. jugadores = new ArrayList();
  112. for(int i = 1; i <= 2; i++){
  113. Jugador j = new Jugador(this);
  114. j.setY(Stage.HEIGHT - 200);
  115. j.setX((int)(Math.random() * Stage.WIDTH) );
  116. jugadores.add(j);
  117. }
  118.  
  119. bala = new ArrayList();
  120.  
  121. backgroundTile = spriteCache.getSprite("fondo.jpg");
  122. background = spriteCache.createCompatible(Stage.WIDTH,Stage.HEIGHT+backgroundTile.getHeight(),Transparency.OPAQUE);
  123. Graphics2D g = (Graphics2D)background.getGraphics();
  124. g.setPaint( new TexturePaint( backgroundTile,new Rectangle(0,0,backgroundTile.getWidth(),backgroundTile.getHeight())));
  125. g.fillRect(0,0,background.getWidth(),background.getHeight());
  126. }
  127.  
  128. public void updateWorld(){
  129. for(int i = 0; i< jugadores.size(); i++){
  130. Jugador j = (Jugador)jugadores.get(i);
  131.  
  132. if(j.isMarkedForRemoval()){
  133. jugadores.remove(i);
  134. }else{
  135. j.act();
  136. }
  137. }
  138.  
  139. if(!bala.isEmpty()){
  140. Bala b = (Bala)bala.get(0);
  141. b.act();
  142. }
  143. }
  144.  
  145. public void paintWorld(){
  146. Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
  147.  
  148. g.drawImage(background, 0, 0, Stage.WIDTH, Stage.HEIGHT, 0, 0, Stage.WIDTH, Stage.HEIGHT, this);
  149.  
  150.  
  151. for(int i = 0; i< jugadores.size(); i++){
  152. Jugador j = (Jugador)jugadores.get(i);
  153. j.paint(g);
  154. }
  155.  
  156. if(!bala.isEmpty()){
  157. Bala b = (Bala)bala.get(0);
  158. b.paint(g);
  159. }
  160.  
  161. paintStatus(g);
  162.  
  163. strategy.show();
  164. }
  165.  
  166. public void paintStatus(Graphics2D g){
  167. paintOptions(g);
  168. paintShields(g);
  169. }
  170.  
  171. public void paintOptions(Graphics2D g){
  172. Jugador j = (Jugador) jugadores.get(turno);
  173. g.setFont(new Font("Arial",Font.BOLD,30));
  174. g.setPaint(Color.white);
  175. g.drawString("Angulo: " + j.getAngleBala() , 0 , 30);
  176.  
  177. g.setFont(new Font("Arial",Font.BOLD,30));
  178. g.setPaint(Color.white);
  179. g.drawString("Speed: " + j.getSpeedBala() , 0 , 60);
  180.  
  181. g.setFont(new Font("Arial",Font.BOLD,30));
  182. g.setPaint(Color.white);
  183. g.drawString("" + segundos , Stage.WIDTH / 2 , 30);
  184. }
  185.  
  186. public void paintShields(Graphics2D g){
  187. Jugador j1 = (Jugador) jugadores.get(0);
  188. g.setPaint(Color.red);
  189. g.fillRect(100, Stage.PLAY_HEIGHT, j1.MAX_SHIELDS, 100);
  190. g.setPaint(Color.blue);
  191. g.fillRect(10 + j1.MAX_SHIELDS-j1.getShields(), Stage.PLAY_HEIGHT-60, j1.getShields(), 20);
  192.  
  193. Jugador j2 = (Jugador) jugadores.get(1);
  194. g.setPaint(Color.red);
  195. g.fillRect(100, Stage.PLAY_HEIGHT, j2.MAX_SHIELDS, 100);
  196. g.setPaint(Color.blue);
  197. g.fillRect(Stage.WIDTH - 20 - j2.MAX_SHIELDS , Stage.PLAY_HEIGHT-60, j2.getShields(), 20);
  198. }
  199.  
  200. public void paintGameOver(){
  201. Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
  202. g.setColor(Color.black);
  203. g.fillRect(0,0,Stage.WIDTH,Stage.HEIGHT);
  204.  
  205. g.setFont( new Font("Arial",Font.BOLD,36));
  206. g.setColor(Color.white);
  207. g.drawString("Perdiste",10 ,Stage.HEIGHT -40);
  208. strategy.show();
  209. }
  210.  
  211. public void addBala(Actor a) {
  212. bala.add(a);
  213. }
  214.  
  215. public void checkCollisions(){
  216. if(!bala.isEmpty()){
  217. Bala b = (Bala)bala.get(0);
  218. Rectangle balaBounds = b.getBounds();
  219.  
  220. for(int i = 0; i < jugadores.size(); i++){
  221. Actor a1 = (Actor)jugadores.get(i);
  222. Rectangle r1 = a1.getBounds();
  223. if(r1.intersects(balaBounds)){
  224. b.collision(a1);
  225. a1.collision(b);
  226. }
  227. }
  228. }
  229. }
  230.  
  231. public void keyPressed(KeyEvent e) {
  232. Jugador j = (Jugador) jugadores.get(turno);
  233. j.keyPressed(e);
  234. }
  235.  
  236. public void keyReleased(KeyEvent e) {
  237. Jugador j = (Jugador) jugadores.get(turno);
  238. j.keyReleased(e);
  239. }
  240.  
  241. public void keyTyped(KeyEvent arg0) {}
  242.  
  243. public SpriteCache getSpriteCache() {
  244. return spriteCache;
  245. }
  246.  
  247. public SoundCache getSoundCache() {
  248. return soundCache;
  249. }
  250.  
  251. public void empezarContador(){
  252. for(segundos = 30; segundos > 0; segundos--){
  253. System.out.println(segundos);
  254. delaySegundo();
  255. }
  256.  
  257. changeTurno();
  258.  
  259. empezarContador();
  260.  
  261. }
  262.  
  263. private static void delaySegundo(){
  264. try{
  265. Thread.sleep(1000);
  266. }
  267.  
  268. public void terminarTurno(){
  269. bala.clear();
  270. changeTurno();
  271. }
  272.  
  273. public void changeTurno(){
  274. if(!jugadores.isEmpty()){
  275. Jugador j = (Jugador) jugadores.get(turno);
  276. j.setVx(0);
  277.  
  278. if(turno < jugadores.size())
  279. turno++;
  280. if(turno == jugadores.size())
  281. turno = 0;
  282.  
  283. segundos = 30;
  284. }
  285. }
  286.  
  287. public void gameOver() {
  288. gameEnded = true;
  289. }
  290. }
  291.  
  292.  


Actor.java
Código:
  1. package juego;
  2.  
  3. import java.awt.Graphics2D;
  4. import java.awt.Rectangle;
  5. import java.awt.image.BufferedImage;
  6.  
  7. public class Actor {
  8. protected int x , y;
  9. protected int width, height;
  10. protected String [] spriteNames;
  11. protected int currentFrame;
  12.  
  13. protected int frameSpeed;
  14. protected int t;
  15.  
  16. protected Stage stage;
  17. protected SpriteCache spriteCache;
  18. protected boolean markedForRemoval;
  19.  
  20. public Actor(Stage stage){
  21. this.stage = stage;
  22. spriteCache = stage.getSpriteCache();
  23. currentFrame = 0;
  24. frameSpeed = 1;
  25. t = 0;
  26. }
  27.  
  28. public void paint(Graphics2D g){
  29. g.drawImage(spriteCache.getSprite(spriteNames[currentFrame]),x,y,stage);
  30. }
  31.  
  32. public void remove(){
  33. markedForRemoval = true;
  34. }
  35.  
  36. public boolean isMarkedForRemoval(){
  37. return markedForRemoval;
  38. }
  39.  
  40. public int getX() { return x; }
  41. public void setX(int x) { this.x = x;}
  42.  
  43. public int getY() { return y; }
  44. public void setY(int y) { this.y = y; }
  45.  
  46. public int getWidth() { return width; }
  47. public void setWidth(int width) { this.width = width;}
  48.  
  49. public int getHeight() { return height; }
  50. public void setHeight(int height) { this.height = height; }
  51.  
  52. public int getFrameSpeed() {return frameSpeed; }
  53. public void setFrameSpeed(int i) { frameSpeed = i; }
  54.  
  55. public void setSpriteNames(String[] names){
  56. spriteNames = names;
  57. height = 0;
  58. width = 0;
  59. for(int i = 0; i < names.length; i++){
  60. BufferedImage image = spriteCache.getSprite(spriteNames[i:77580d6df9]);
  61. height = Math.max(height,image.getHeight());
  62. width = Math.max(width,image.getWidth());
  63. }
  64. }
  65.  
  66. public Rectangle getBounds(){
  67. return new Rectangle(x,y,width,height);
  68. }
  69.  
  70. public void collision(Actor a){
  71.  
  72.  
  73. }
  74.  
  75. public void act(){
  76. t++;
  77. if(t % frameSpeed == 0){
  78. t = 0;
  79. currentFrame = (currentFrame + 1) % spriteNames.length;
  80. }
  81. }
  82. }
  83.  
  84.  

[i]Jugador.java

Código:
  1. package juego;
  2.  
  3. import java.awt.event.KeyEvent;
  4.  
  5. public class Jugador extends Actor{
  6. public static final int MAX_SHIELDS = 200;
  7. protected int vx;
  8. private boolean left = false;
  9. private boolean right = false;
  10. private boolean izq = false;
  11. private boolean der = false;
  12. private int speed = 3;
  13.  
  14. private int shields;
  15.  
  16. private double angleBala = 5;
  17. private int speedBala = 10;
  18.  
  19. public Jugador(Stage stage){
  20. super(stage);
  21. setSpriteNames(new String[]{ "tanque.gif" });
  22. shields = MAX_SHIELDS;
  23. }
  24.  
  25. public void act(){
  26. super.act();
  27.  
  28. x += vx;
  29.  
  30. if(x < 0)
  31. x = 0;
  32. if(x > Stage.WIDTH - getWidth())
  33. x = Stage.WIDTH - getWidth();
  34. }
  35.  
  36. public void updateSpeed(){
  37. vx = 0;
  38. if(left) vx = -speed;
  39. if(right) vx = speed;
  40. }
  41.  
  42. public void keyPressed(KeyEvent e){
  43. switch(e.getKeyCode()){
  44. case KeyEvent.VK_LEFT:
  45. left = true;
  46. izq = true;
  47. der = false;
  48. break;
  49. case KeyEvent.VK_RIGHT:
  50. right = true;
  51. izq = false;
  52. der = true;
  53. break;
  54. case KeyEvent.VK_SPACE:
  55. fire();
  56. break;
  57. case KeyEvent.VK_UP:
  58. if(angleBala < 90)
  59. angleBala +=5;
  60. break;
  61. case KeyEvent.VK_DOWN:
  62. if(angleBala > 0)
  63. angleBala-=5;
  64. break;
  65. case KeyEvent.VK_X:
  66. if(speedBala < 20)
  67. speedBala ++;
  68. break;
  69. case KeyEvent.VK_Z:
  70. if(speedBala > 6)
  71. speedBala --;
  72. break;
  73.  
  74. }
  75. updateSpeed();
  76. }
  77.  
  78. public void keyReleased(KeyEvent e){
  79. switch(e.getKeyCode()){
  80. case KeyEvent.VK_LEFT:
  81. left = false;
  82. break;
  83. case KeyEvent.VK_RIGHT:
  84. right = false;
  85. break;
  86.  
  87. }
  88. updateSpeed();
  89. }
  90.  
  91. public void fire(){
  92. Bala b = new Bala(stage);
  93. b.setX(b.getWidth() + x);
  94. b.setY(y - b.getHeight());
  95. b.setSpeed(speedBala);
  96. b.setAngle(angleBala);
  97. b.applyFriction();
  98. b.setRight(der);
  99. b.setLeft(izq);
  100. stage.addBala(b);
  101. }
  102.  
  103. public void collision(Actor a){
  104. if(a instanceof Bala){
  105. addShields(-40);
  106. stage.terminarTurno();
  107. }
  108.  
  109. if(getShields() <= 0)
  110. stage.gameOver();
  111.  
  112. }
  113.  
  114. public int getVx() {
  115. return vx;
  116. }
  117.  
  118. public void setVx(int vx) {
  119. this.vx = vx;
  120. }
  121.  
  122. public int getSpeed() {
  123. return speed;
  124. }
  125.  
  126. public void setSpeed(int speed) {
  127. this.speed = speed;
  128. }
  129.  
  130. public double getAngleBala() {
  131. return angleBala;
  132. }
  133.  
  134. public void setAngleBala(float angleBala) {
  135. this.angleBala = angleBala;
  136. }
  137.  
  138. public int getSpeedBala() {
  139. return speedBala;
  140. }
  141.  
  142. public void setSpeedBala(int speedBala) {
  143. this.speedBala = speedBala;
  144. }
  145.  
  146. public int getShields() {
  147. return shields;
  148. }
  149.  
  150. public void setShields(int shields) {
  151. this.shields = shields;
  152. }
  153.  
  154. public void addShields(int i){
  155. shields += i;
  156. if(shields > MAX_SHIELDS) shields = MAX_SHIELDS;
  157. }
  158. }
  159.  
  160.  

Bala.java
Código:
  1. package juego;
  2.  
  3. public class Bala extends Actor{
  4. private double angle;
  5. private int speed;
  6.  
  7. private float vx;
  8. private float vy;
  9. private float gravity = 0.5f;
  10. private boolean left;
  11. private boolean right;
  12.  
  13. public void applyFriction(){
  14. float radians = (float)((angle / 180) * Math.PI )*-1;
  15. vx = (float) (speed * Math.cos(radians));
  16. vy = (float) (speed * Math.sin(radians));
  17. }
  18.  
  19. public Bala(Stage stage) {
  20. super(stage);
  21. setSpriteNames(new String[] {"bala.gif"});
  22. }
  23.  
  24. public void act(){
  25. super.act();
  26.  
  27. if(left)
  28. x -= vx;
  29.  
  30. if(right)
  31. x += vx;
  32.  
  33. vy += gravity;
  34. y += vy;
  35.  
  36. System.out.println("X: " + x + " Y: " + y);
  37. if(x < 0 || x > Stage.WIDTH || y > Stage.HEIGHT - 100){
  38. stage.terminarTurno();
  39. }
  40. }
  41.  
  42.  
  43. public double getAngle() {
  44. return angle;
  45. }
  46.  
  47. public void setAngle(double angle) {
  48. this.angle = angle;
  49. }
  50.  
  51. public int getSpeed() {
  52. return speed;
  53. }
  54.  
  55. public void setSpeed(int speed) {
  56. this.speed = speed;
  57. }
  58.  
  59. public boolean isLeft() {
  60. return left;
  61. }
  62.  
  63. public void setLeft(boolean left) {
  64. this.left = left;
  65. }
  66.  
  67. public boolean isRight() {
  68. return right;
  69. }
  70.  
  71. public void setRight(boolean right) {
  72. this.right = right;
  73. }
  74.  
  75. }
  76.  
  77.  

ResourceCache.java
Código:
  1. package juego;
  2.  
  3. import java.net.URL;
  4. import java.util.HashMap;
  5.  
  6. public abstract class ResourceCache {
  7. protected HashMap resources;
  8.  
  9. public ResourceCache(){
  10. resources = new HashMap();
  11. }
  12.  
  13. protected Object loadResource(String name){
  14. URL url = null;
  15. url = getClass().getClassLoader().getResource(name);
  16. return loadResource(url);
  17. }
  18.  
  19. protected Object getResource(String name){
  20. Object res = resources.get(name);
  21. if(res == null){
  22. res = loadResource("res/" + name);
  23. resources.put(name, res);
  24. }
  25. return res;
  26. }
  27.  
  28. protected abstract Object loadResource(URL url);
  29. }
  30.  
  31.  

SoundCache.java
Código:
  1. package juego;
  2.  
  3. import java.applet.Applet;
  4. import java.applet.AudioClip;
  5. import java.net.URL;
  6.  
  7. public class SoundCache extends ResourceCache{
  8.  
  9. protected Object loadResource(URL url) {
  10. return Applet.newAudioClip(url);
  11. }
  12.  
  13. public AudioClip getAudioClip(String name){
  14. return (AudioClip) getResource(name);
  15. }
  16.  
  17. public void playSound(final String name){
  18. new Thread(
  19. new Runnable() {
  20. public void run() {
  21. getAudioClip(name).play();
  22. }
  23. }
  24. ).start();
  25. }
  26.  
  27. public void loopSound(final String name){
  28. new Thread(
  29. new Runnable() {
  30. public void run() {
  31. getAudioClip(name).loop();
  32. }
  33. }
  34. ).start();
  35. }
  36.  
  37. public void stopSound(final String name){
  38. getAudioClip(name).stop();
  39. }
  40.  
  41. }
  42.  
  43.  

SpriteCache.java
Código:
  1. package juego;
  2.  
  3. import java.applet.Applet;
  4. import java.applet.AudioClip;
  5. import java.net.URL;
  6.  
  7. public class SoundCache extends ResourceCache{
  8.  
  9. protected Object loadResource(URL url) {
  10. return Applet.newAudioClip(url);
  11. }
  12.  
  13. public AudioClip getAudioClip(String name){
  14. return (AudioClip) getResource(name);
  15. }
  16.  
  17. public void playSound(final String name){
  18. new Thread(
  19. new Runnable() {
  20. public void run() {
  21. getAudioClip(name).play();
  22. }
  23. }
  24. ).start();
  25. }
  26.  
  27. public void loopSound(final String name){
  28. new Thread(
  29. new Runnable() {
  30. public void run() {
  31. getAudioClip(name).loop();
  32. }
  33. }
  34. ).start();
  35. }
  36.  
  37. public void stopSound(final String name){
  38. getAudioClip(name).stop();
  39. }
  40.  
  41. }
  42.  
  43.  

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Otilio



Registrado: 02 Oct 2017
Mensajes: 5

Mensaje Publicado: Martes 03 Oct 2017 16:50

Título del mensaje: [JAVA] Guerra por turnos 2 jugadores

Responder citando

Buen día, esto es algo parecido al Advance Wars? ¿tendrás un ejecutable para verlo?

Volver arriba
Ver perfil del usuario Enviar mensaje privado
Pedrolo
Usuario Inquieto


Registrado: 07 May 2017
Mensajes: 50
Ubicación: Posiblemente lejos de ti

Mensaje Publicado: Martes 03 Oct 2017 17:43

Título del mensaje: [JAVA] Guerra por turnos 2 jugadores

Responder citando

Cierto, lo suyo es que adjuntes el jar, porque ahí ya tienes los recursos, gráficos y sonido.

Volver arriba
Ver perfil del usuario Enviar mensaje privado Visitar sitio web del autor
Responder al Tema
Mostrar mensajes anteriores:   
Ir a:  
Todas las horas están en GMT + 2 Horas

Temas relacionados

Tema Autor Foros Respuestas Publicado
El foro no contiene ningún mensaje nuevo

Ayuda con TestNG Parametrico en java netbeans

baltigo Java 0 Sábado 30 Jun 2018 01:37 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Publicar Aplicación web JAVA en tomcat

Irvin Java Web 1 Viernes 13 Oct 2017 17:54 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Imagen referencial De creación de jtable en apl...

Jensel S.G Java 6 Miércoles 13 Sep 2017 20:06 Ver último mensaje
El tema está bloqueado: no pueden editarse ni agregar mensajes.

EMPLEO ANALISTA PROGRAMADOR/A BACK-END JAVA EE

GRUPOARESTORA Bolsa de trabajo 0 Viernes 23 Jun 2017 14:33 Ver último mensaje
El foro no contiene ningún mensaje nuevo

Juego de gato sencillo en Java

Alan Antonio Java 0 Domingo 13 Nov 2016 03:21 Ver último mensaje
Panel de Control
No puede crear mensajes, No puede responder temas, No puede editar sus mensajes, No puede borrar sus mensajes, No puede votar en encuestas,