La création de Serpent à l'aide de Java
J'ai décidé de re-créer de Serpent à l'aide de Java, mais je suis un peu coincé. Pour le moment, j'ai un carré que l'utilisateur peut se déplacer autour de l'écran en utilisant les touches fléchées. Lorsque vous appuyez sur la touche encore une fois à GAUCHE, la place commence à se déplacer vers la gauche à l'aide d'une minuterie.. Vous n'avez pas besoin d'appuyer sur la touche ou maintenir la pression; il change de direction lorsque vous appuyez sur l'une des autres clés de set(à Droite, en Haut, en Bas). Mon but est d'utiliser une ArrayList pour tenir les carrés qui composent le serpent. Pour le moment, j'ai créé une liste de tableaux avec juste un Serpent objet à l'intérieur, si j'ajoute un deuxième Serpent objet de la liste et d'ajouter à l'image(avec le premier), un seul Serpent objet est visible, et les touches pour se déplacer, il ne fonctionne pas. Je suis à la recherche de quelques idées de la façon dont je peut progresser avec ce projet - s'il vous plaît, ne me donne pas la réponse, parce que j'aimerais comprendre la plupart de ma part; j'ai seulement besoin d'une direction. Merci à l'avance - le code est ci-dessous.
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Snake extends JPanel implements KeyListener, ActionListener
{
int x = 0, y = 0, velx = 0, vely = 0;
Timer t = new Timer(250, this);
public Snake(int num1, int num2)
{
t.start();
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(true);
x = num1;
y = num2;
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setColor(Color.blue);
g.fillRect(x, y, 20, 20);
}
public void actionPerformed(ActionEvent e)
{
repaint();
x += velx;
y += vely;
}
public void up()
{
vely = -20;
velx = 0;
}
public void down()
{
vely = 20;
velx = 0;
}
public void left()
{
vely = 0;
velx = -20;
}
public void right()
{
vely = 0;
velx = 20;
}
public void keyPressed(KeyEvent e)
{
int code = e.getKeyCode();
if(code == KeyEvent.VK_UP)
up();
else if(code == KeyEvent.VK_DOWN)
down();
else if(code == KeyEvent.VK_RIGHT)
right();
else if(code == KeyEvent.VK_LEFT)
left();
}
public void keyReleased(KeyEvent e)
{
}
public void keyTyped(KeyEvent e)
{
}
}
//Driver Class
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.util.*;
public class UserClass
{
private static JFrame frame = new JFrame("Snake");
private static ArrayList<Snake> mySnake = new ArrayList<Snake>();
public static void main(String[] args)
{
frame.setSize(500,500);
frame.setBackground(Color.black);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mySnake.add(new Snake(20,20));
frame.add(mySnake.get(0));
}
}
P. S Quand je mets ce même code dans Eclipse sur mon Mac, le fond de mon image est noire, mais sur Windows, il est gris clair... quelqu'un sait pourquoi? Merci.
OriginalL'auteur corecase | 2012-06-09
Vous devez vous connecter pour publier un commentaire.
Pour répondre à vos postscript, définir une couleur d'arrière-plan ou faire un Composite derrière tout le reste avec une couleur peinte.
De faire avancer le projet, envisager de faire un exercice dans le framework MVC. Ce qui se passe maintenant, c'est que votre Modèle et la Vue sont liés dans la même classe - de ce fait, il est difficile de suivre la logique derrière tout cela.
Ce que vous pouvez faire est d'abord séparé de votre Serpent partir de quelque chose à faire avec le point de vue - faire un serpent avec un
ArrayList<Integer[]> segmentLocations
ou quelque chose, pour représenter l' (x,y) de chaque segment de lieux sur une carte que vous définissez - vous pouvez utiliser des coordonnées absolues ou vous pouvez faire un arbitraire de la grille et le changement de coordonnées de votre point de Vue (ce qui est typique de l'architecture MVC relation de meilleure qualité). Serpent devrait également avoir un champ pour la direction le serpent est face je voudrais utiliser unenum Direction {N, S, E, W}
, mais vous avez des options, que vous pouvez également avoir un entier représentant de la direction, ou une variété d'autres façons.Votre Serpent aurait aussi des façons de mettre à jour lui-même - move(), en déplaçant l'emplacement de tous les segments en fonction de la direction actuelle pour le segment initial et la cause de tous les autres segments de suivre le mouvement de l'avant (ce qui est assez facile si vous considérez que c'est pour un couple de minutes).
Votre point de vue pourrait être une JFrame avec un GridLayout composé de JPanels qui sondage votre Serpent exemple et voir si il y a un segment à l'endroit et dans l'affirmative, de le dessiner, ou une multitude d'autres options.
Votre contrôleur serait le KeyAdapter qui envoie les mises à jour dans la direction de votre Serpent lorsque les touches sont enfoncées.
Petite astuce, pour rendre votre vie plus facile: lorsque vous ajoutez un nouveau segment, juste à l'emplacement du dernier segment du Serpent. La prochaine fois qu'il se déplace, le nouveau segment sera dans le même emplacement, et le reste du Serpent doit avoir déplacer en conséquence.
Je vous remercie beaucoup.
OriginalL'auteur purtip31
Votre
paintComponent(...)
seulement dessine un rectangle. Au lieu de cela, si vous voulez dessiner plusieurs rectangulaires ou ovales, ou que ce soit, donner à votre classe unList<Point>
ouList<Rectangle2D>
, et dans votre Swing de la Minuterie, retirer la queue de la liste et ajouter une nouvelle tête. alorspaintComponent()
utiliser une boucle for pour parcourir une liste, de dessin tous les rectangles détenus par la liste.Aussi, vous voudrez probablement utiliser les raccourcis clavier plutôt qu'un KeyListener pour obtenir la clé de l'utilisateur presses cela fonctionne mieux lorsque d'autres composants de voler le focus.
OriginalL'auteur Hovercraft Full Of Eels
Donné une classe définissant un segment de la géométrie,
Envisager une file d'attente de segments,
Puis à chaque itération est tout simplement
Et
paintComponent()
comprend cette boucleNe pas les variables d'instance x, y, d dans le Segment de la classe à être public pour que cela fonctionne? Depuis paintComponent est l'accès à ces varibles?
Il suffit de faire une méthode get pour chaque variable si vous n'aimez pas avoir de données publiques des membres. (getX (), etc.)
Oui, l'original a été
private static Segment
. Voir aussi Bloch, Efficace Java, 2nd ed, "Article 13: Minimiser l'accessibilité des classes et des membres."OriginalL'auteur trashgod