L'article précédent est ci-dessous
https://qiita.com/strict39275/items/41da2ad3bb8fd60228e0 Même si j'y réfléchis bien, le code n'a pas atteint mon idéal, mais j'aimerais l'améliorer à partir de maintenant. Dans cet article, je voudrais expliquer chaque classe. Si vous expliquez tout d'un coup, cela prendra énormément de temps, donc la prochaine fois, il semble préférable d'expliquer soigneusement chaque classe une par une. Je vais le faire.
Il s'agit d'un diagramme de structure de classe réalisé par shiracamus. On a l'impression que la classe breakout est la principale et que les variables d'instance de la classe y sont créées.
Je voudrais expliquer un par un, y compris la réflexion.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.Timer;
import java.util.TimerTask;
Il semble préférable de déclarer la déclaration d'importation au début du code. De cette façon, il est plus facile de voir quelle bibliothèque ce code utilise. En entrant une déclaration telle que import javax.swing. Vous pourrez utiliser les classes créées par java. En d'autres termes, vous pourrez afficher l'écran et saisir les événements de la souris sans avoir à écrire votre propre code. La plupart des instructions d'importation utilisent des importations à la demande. Si vous importez le type à la demande, par exemple, vous pourrez utiliser toutes les fonctions de javax.util. En d'autres termes, si vous ajoutez ✳︎ à la fin de l'instruction d'importation, vous n'aurez pas à vous soucier des erreurs. Cependant, vous devez être prudent car vous ne saurez pas quelle fonction utiliser.
Cette fois, je vais seulement expliquer la classe de petits groupes
public class breakout extends JPanel implements MouseMotionListener{
static int countball =15;
Racket racket;
Ball[] ball;
Block[] block;
Unbreakblock[] block1;
Twobreakblock[] block2;
Threebreakblock[] block3;
double time;
int remain=37;
boolean gameover=false;
-La classe breakout hérite de la fonction JPanel et a la fonction d'afficher réellement l'écran. Dans ce panneau, j'ai tapé des outils pour activer la fonctionnalité de la souris -Déclarez-le comme une variable de classe statique et définissez le nombre de billes sur 15. -Déclarer les variables d'instance racket, ballblock1 block2, block3 qui ne sont pas déclarées statiques, et prendre les variables qui ont les fonctions de chaque classe. -Le temps entre l'exécution et la valeur de gameover devient True est de 37 secondes. -Comme l'état initial n'est pas l'état du gameover, la valeur booléenne initiale est définie sur false.
C'est là que nous poserons les bases de la création de jeux. Même si vous créez un jeu, cela ne signifie pas qu'il n'est pas affiché à l'écran, et si vous n'avez pas de fonction souris, vous ne pouvez même pas utiliser une raquette qui fait rebondir la balle, donc ce code a une fois créé un environnement qui peut être utilisé comme ça. Je veux faire une balle, mais je ne peux pas jouer à un jeu sans savoir combien, j'ai donc défini la valeur initiale pour le moment.
static int x=855;
static int y=800;
static int size =15; //Je n'en ai pas besoin car le nombre de balles est déclaré en countball
//Nombre de blocs bleu clair
static final int NUM_BLOCK_ROW = 4;
//Nombre de colonnes dans le bloc
static final int NUM_BLOCK_COL = 9;
//Nombre de blocs
static final int NUM_BLOCK = NUM_BLOCK_ROW * NUM_BLOCK_COL;
//Nombre de blocs gris
static final int NUM_BLOCK_ROW1 = 8;
static final int NUM_BLOCK_COL1 = 1;
static final int NUM_BLOCK1 = NUM_BLOCK_ROW1 * NUM_BLOCK_COL1;
//Nombre de blocs verts
static final int NUM_BLOCK_ROW2 = 8;
static final int NUM_BLOCK_COL2 = 3;
static final int NUM_BLOCK2 = NUM_BLOCK_ROW2 * NUM_BLOCK_COL2;
//Nombre de blocs jaunes
static final int NUM_BLOCK_ROW3 = 8;
static final int NUM_BLOCK_COL3 = 4;
static final int NUM_BLOCK3 = NUM_BLOCK_ROW3 * NUM_BLOCK_COL3;
//Trouvez le nombre de tous les blocs
static final int SumBlock= NUM_BLOCK+NUM_BLOCK2+NUM_BLOCK3;
Oubliez la taille int statique = 15
・ La taille horizontale du panneau est 855 et la longueur verticale est 800. -Déclarez ici le nombre de blocs. ROW est le nombre de colonnes dans le bloc COL est le nombre de lignes dans le bloc ・ Multipliez pour trouver le nombre de blocs. Par exemple, si la colonne 8 lignes 4 est utilisée, un bloc de 8 × 4 = 32 peut être créé. ・ Trouvez le nombre de blocs bleu clair, gris, vert et jaune ・ Sumblock est le total de chaque
Définition de la taille de l'écran de jeu et déclaration du nombre de blocs. Ici, vous pouvez modifier librement le nombre de blocs. Puisque je veux hériter de la valeur lorsque le nombre de ce bloc diminue, je l'ai déclaré comme statique et l'ai également utilisé comme variable de classe. Vous n'avez pas besoin de déclarer définitif.
//Créer une carte bidimensionnelle
private char[][] map;
private int MX = 20, MY = 18;
private String[] map_str = {
" B",
" B",
" B",
" B",
" B",
" B",
" B",
" B",
" B",
" B",
" B",
" B",
" B",
" B",
" B",
" B",
" B",
" B",
" B",
};
-Créer une variable qui dessine réellement un bloc avec une variable de type char -La plage du bloc à dessiner est de 20 horizontales et 18 verticales. ・ L'emplacement du bloc est uniquement à droite
Ici, la raison pour laquelle les blocs sont également placés sur la paroi gauche et la paroi supérieure est parce qu'elle est définie comme la valeur initiale dans le futur code.
public breakout(){
time = System.currentTimeMillis() * 0.001 + remain;
addMouseMotionListener(this);
racket =new Racket();
ball = new Ball[countball];
Random rand = new Random();
int n=countball;
int num[] = new int [n];
for(int i=0;i<n;i++){
num[i]= 40+rand.nextInt(700);
ball[0]=new Ball(num[0],250,5,-6,7);
ball[1]=new Ball(num[1],260,-5,-3,10);
ball[2]=new Ball(num[2],420,4,6,8);
ball[3]=new Ball(num[3],480,-5,2,10);
ball[4]=new Ball(num[4],590,5,-6,11);
ball[5]=new Ball(num[5],550,-5,-3,12);
ball[6]=new Ball(num[6],570,4,6,13);
ball[7]=new Ball(num[7],480,-5,2,14);
ball[8]=new Ball(num[8],490,5,-6,8);
ball[9]=new Ball(num[9],400,-5,-3,8);
ball[10]=new Ball(num[10], 350,4,6,9);
ball[11]=new Ball(num[11],400,-5,2,10);
ball[12]=new Ball(num[12],390,-5,-3,10);
ball[13]=new Ball(num[13],500,4,6,10);
ball[14]=new Ball(num[14],530,-5,2,7);
}
block = new Block[NUM_BLOCK];
block1 = new Unbreakblock[NUM_BLOCK1];
block2 = new Twobreakblock[NUM_BLOCK2];
block3 =new Threebreakblock[NUM_BLOCK3];
for (int i = 0; i < NUM_BLOCK_ROW; i++) {
for (int j = 0; j < NUM_BLOCK_COL; j++) {
int x =2* j * Block.WIDTH + Block.WIDTH+50;
int y =2* i * Block.HEIGHT + Block.HEIGHT+600;
block[i * NUM_BLOCK_COL + j] = new Block(x, y);
}
}
for ( int c = 0; c < NUM_BLOCK_ROW1; c++) {
for (int d = 0; d < NUM_BLOCK_COL1; d++) {
int a = 2*c * Unbreakblock.WIDTH1 + Unbreakblock.WIDTH1+50;
int b = d * Unbreakblock.HEIGHT1 + Unbreakblock.HEIGHT1+450;
block1[d * NUM_BLOCK_COL1 + c] = new Unbreakblock(a, b);
}
}
for ( int c = 0; c < NUM_BLOCK_ROW2; c++) {
for (int d = 0; d < NUM_BLOCK_COL2; d++) {
int a = 2*c * Twobreakblock.WIDTH2 + Twobreakblock.WIDTH2+50;
int b = 2*d * Twobreakblock.HEIGHT2 + Twobreakblock.HEIGHT2+300;
block2[c* NUM_BLOCK_COL2 + d] = new Twobreakblock(a, b);
}
}
for ( int c = 0; c < NUM_BLOCK_ROW3; c++) {
for (int d = 0; d < NUM_BLOCK_COL3; d++) {
int a =2* c * Threebreakblock.WIDTH3 + Threebreakblock.WIDTH3+50;
int b = 5*d * Threebreakblock.HEIGHT3 + Threebreakblock.HEIGHT3+60;
block3[c * NUM_BLOCK_COL3 + d] = new Threebreakblock(a, b);
}
}
TimeBomb timeBomb = new TimeBomb();
Timer timer = new Timer();
timer.schedule(timeBomb, 5000);
map = new char[MY+2][MX+2];
for (int x = 0; x <= MX+1; x++) {
map[0][x] = 'B';
// map[MY+1][x] = 'B';Je n'ai pas besoin
}
for (int y = 0; y <= MY+1; y++) {
map[y][0] = 'B';
//map[y][MX+1] = 'B'; //Je n'ai pas besoin
}
for (int y = 1; y <= MY; y++) {
for (int x = 1; x <= MX; x++) {
map[y][x] = map_str[y-1].charAt(x-1);
}
}
}
-Ajouter à l'heure de type double qui a une limite de temps, plus la limite de temps actuelle x 0,001. -Ici, utilisez les variables d'instance des classes Racket et Ball. -Déclarer rand pour rendre les coordonnées horizontales de la balle aléatoires -Les coordonnées horizontales de la balle sont attribuées au tableau num au hasard de 0 à 700 suivant 40. Autrement dit, les coordonnées horizontales de 15 boules sont générées de manière aléatoire et les valeurs sont attribuées à num. -Depuis la gauche, les arguments déclarés dans la classe Ball sont les coordonnées horizontales de la balle, les coordonnées verticales de la balle, la vitesse à laquelle la balle se déplace horizontalement et la vitesse à laquelle la balle se déplace verticalement. Les coordonnées verticales ont été entrées manuellement afin qu'elles ne se chevauchent pas avec les coordonnées du bloc. -Le nombre de blocs a été utilisé tel quel et les variables d'instance ont été générées dans le bloc, le bloc1, le bloc2 et le bloc3. -Afin d'entrer les coordonnées verticales et horizontales, plusieurs boucles ont été faites avec l'instruction for, et les coordonnées du bloc ont été définies à x, y, a, b, etc., respectivement. -Même si le programme est exécuté par timer.schedule (timeBomb, 5000);, les fonctions boule et bloc sont arrêtées pendant les 5 premières secondes. -Définir la position initiale du placement du bloc. L'endroit où vous avez indiqué que vous n'avez pas besoin d'un bloc est une fonction qui vous permet de placer des blocs autres que le mur, vous n'en avez donc pas besoin.
Pour la première fois, j'ai défini la fonction de la balle, la position du bloc et la position du mur végétal. J'ai défini les coordonnées verticales de la balle sur manuel afin que les coordonnées du bloc et de la balle ne se chevauchent pas. Sinon, la balle sera dans le bloc, la bulle se cassera et le contenu sortira, de sorte que les coordonnées verticales ne sont pas aléatoires. Certains codes ont été étiquetés BBB la dernière fois, mais vous pouvez également placer des blocs ici.
for(int i=0;i<n;i++){
num[i]= 40+rand.nextInt(700);
}
ball[0]=new Ball(num[0],250,5,-6,7);
ball[1]=new Ball(num[1],260,-5,-3,10);
ball[2]=new Ball(num[2],420,4,6,8);
ball[3]=new Ball(num[3],480,-5,2,10);
ball[4]=new Ball(num[4],590,5,-6,11);
ball[5]=new Ball(num[5],550,-5,-3,12);
ball[6]=new Ball(num[6],570,4,6,13);
ball[7]=new Ball(num[7],480,-5,2,14);
ball[8]=new Ball(num[8],490,5,-6,8);
ball[9]=new Ball(num[9],400,-5,-3,8);
ball[10]=new Ball(num[10], 350,4,6,9);
ball[11]=new Ball(num[11],400,-5,2,10);
ball[12]=new Ball(num[12],390,-5,-3,10);
ball[13]=new Ball(num[13],500,4,6,10);
ball[14]=new Ball(num[14],530,-5,2,7);
Mais j'ai l'impression qu'il n'y a pas de problème. Vous n'avez pas eu à faire le compilateur et à déclarer l'instance plusieurs fois, et num [i] = 40 + rand.nextInt (700); était suffisant pour entrer dans l'instruction for.
La méthode de la classe breakout, la classe après cela et TimerTask seront exécutés la prochaine fois. Pour être honnête, j'ai en quelque sorte compris ce que je voulais faire, mais il y avait trop de code inutile à écrire. Il y a trop de questions. C'est dommage que ce soit trop à mi-chemin. Si vous le rendez trop parfait, le temps disparaîtra, alors je voudrais le couper dans une certaine mesure et l'ajouter.
Recommended Posts