Der vorherige Artikel ist unten
https://qiita.com/strict39275/items/41da2ad3bb8fd60228e0 Selbst wenn ich sorgfältig darüber nachdenke, hat der Code mein Ideal nicht erreicht, aber ich möchte ihn von nun an verbessern. In diesem Artikel möchte ich jede Klasse erklären. Wenn Sie alles plötzlich erklären, wird es eine enorme Zeitspanne sein, daher scheint es beim nächsten Mal besser, jede Klasse sorgfältig einzeln zu erklären. Ich werde es tun.
Es ist ein Klassenstrukturdiagramm von Shiracamus. Es fühlt sich so an, als ob die Breakout-Klasse die Hauptklasse ist und die Instanzvariablen der Klasse darin erstellt werden.
Ich möchte eins nach dem anderen erklären, einschließlich Reflexion.
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.Timer;
import java.util.TimerTask;
Es scheint besser, die import-Anweisung am Anfang des Codes zu deklarieren. Auf diese Weise ist es einfacher zu erkennen, welche Bibliothek dieser Code verwendet. Durch Eingabe einer Deklaration wie import javax.swing. Sie können die von Java erstellten Klassen verwenden. Mit anderen Worten, Sie können den Bildschirm anzeigen und Mausereignisse eingeben, ohne Ihren eigenen Code schreiben zu müssen. Die meisten Importanweisungen verwenden den On-Demand-Import. Wenn Sie beispielsweise den On-Demand-Typ importieren, können Sie alle Funktionen in javax.util verwenden. Mit anderen Worten, wenn Sie am Ende der Importanweisung ✳︎ hinzufügen, müssen Sie sich keine Gedanken über Fehler machen. Sie sollten jedoch vorsichtig sein, da Sie nicht wissen, welche Funktion Sie verwenden sollen.
Dieses Mal werde ich nur die Breakout-Klasse erklären
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;
-Die Breakout-Klasse erbt die JPanel-Funktion und hat die Funktion, den Bildschirm tatsächlich anzuzeigen. In diesem Bereich habe ich Geräte eingegeben, um die Mausfunktionalität zu aktivieren
Hier legen wir den Grundstein für die Herstellung von Spielen. Selbst wenn Sie ein Spiel erstellen, bedeutet dies nicht, dass es nicht auf dem Bildschirm angezeigt wird. Wenn Sie keine Mausfunktion haben, können Sie nicht einmal einen Schläger verwenden, der den Ball abprallt. Daher hat dieser Code einmal eine Umgebung erstellt, die so verwendet werden kann. Ich möchte einen Ball machen, aber ich kann kein Spiel spielen, ohne zu wissen, wie viele es sind. Deshalb habe ich vorerst den Anfangswert definiert.
static int x=855;
static int y=800;
static int size =15; //Ich brauche es nicht, weil die Anzahl der Bälle im Countball angegeben ist
//Anzahl der hellblauen Blöcke
static final int NUM_BLOCK_ROW = 4;
//Anzahl der Spalten im Block
static final int NUM_BLOCK_COL = 9;
//Anzahl der Blöcke
static final int NUM_BLOCK = NUM_BLOCK_ROW * NUM_BLOCK_COL;
//Anzahl der grauen Blöcke
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;
//Anzahl der grünen Blöcke
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;
//Anzahl der gelben Blöcke
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;
//Finden Sie die Anzahl aller Blöcke
static final int SumBlock= NUM_BLOCK+NUM_BLOCK2+NUM_BLOCK3;
Vergessen Sie die statische int size = 15
・ Die horizontale Größe des Panels beträgt 855 und die vertikale Länge 800.
Da ich den Wert erben möchte, wenn die Anzahl dieses Blocks abnimmt, habe ich ihn als statisch deklariert und auch als Klassenvariable verwendet. Sie mussten nicht endgültig erklären.
//Erstellen einer zweidimensionalen Karte
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",
};
Der Grund, warum die Blöcke auch an der linken Wand und an der oberen Wand platziert werden, liegt darin, dass sie im zukünftigen Code als Anfangswert definiert sind.
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';Ich brauche nicht
}
for (int y = 0; y <= MY+1; y++) {
map[y][0] = 'B';
//map[y][MX+1] = 'B'; //Ich brauche nicht
}
for (int y = 1; y <= MY; y++) {
for (int x = 1; x <= MX; x++) {
map[y][x] = map_str[y-1].charAt(x-1);
}
}
}
Zum ersten Mal definierte ich die Funktion des Balls, die Position des Blocks und die Position der grünen Wand. Ich setze die vertikalen Koordinaten des Balls auf manuell, damit sich die Koordinaten des Blocks und des Balls nicht überlappen. Andernfalls befindet sich der Ball im Block und der Ballon bricht und der Inhalt kommt heraus, sodass die vertikalen Koordinaten nicht zufällig sind. Einige Codes wurden beim letzten Mal als BBB gekennzeichnet, aber Sie können hier auch Blöcke einfügen.
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);
Aber ich habe das Gefühl, dass es kein Problem gibt. Sie mussten den Compiler nicht viele Male ausführen und die Instanz deklarieren, und num [i] = 40 + rand.nextInt (700); reichte aus, um in die for-Anweisung zu gelangen.
Die Methode der Breakout-Klasse, die Klasse danach und TimerTask werden beim nächsten Mal ausgeführt. Um ehrlich zu sein, habe ich irgendwie verstanden, was ich tun wollte, aber es gab zu viel nutzlosen Code zum Schreiben. Es gibt zu viele Fragen. Schade, dass es zu halb ist. Wenn Sie es zu perfekt machen, verschwindet die Zeit, daher möchte ich es bis zu einem gewissen Grad abschneiden und hinzufügen.