Создаю игру, в коорой вражеские объкты появляются на панели рандомно. Для того, чтобы это реализовать, хочу создать двумерный массив, который хранит координаты врагов. Что-то такое:
int[][] pos = {
{2380, 29}, {2500, 59}, {1380, 89},
{780, 109}, {580, 139}, {680, 239},
{790, 259}, {760, 50}, {790, 150},
{980, 209}, {560, 45}, {510, 70},
{930, 159}, {590, 80}, {530, 60},
{940, 59}, {990, 30}, {920, 200},
{900, 259}, {660, 50}, {540, 90},
{810, 220}, {860, 20}, {740, 180},
{820, 128}, {490, 170}, {700, 30}
};
Проблема заключается в том, что я бы хотела заполинть массив pos случайными числами автоматически, чтобы потом использовать в следующем:
public void Enemies() {
enemies = new ArrayList<>();
for (int[] p : pos) {
enemies.add(new Enemy(p[0], p[1]));
}
}
Все это находится в одном классе:
package test2;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.Timer;
import javax.swing.JPanel;
public class MyPanel extends JPanel implements ActionListener{
int playerX = 40;
int playerY = 60;
int DELAY = 15;
int panelWidth = 800;
int panelHeight = 600;
Timer timer;
Player player;
boolean alive;
ArrayList<Enemy> enemies;
int [] [] positions = null;
public MyPanel(){
this.addKeyListener(new TAdapter());
this.setFocusable(true);
this.setBackground(Color.BLACK);
alive = true;
this.setPreferredSize(new Dimension(panelWidth, panelHeight));
Enemies();
player = new Player(playerX, playerY);
timer = new Timer(DELAY, this);
timer.start();
}
public void Enemies(){
enemies = new ArrayList<>();
for (int [] p: positions){
enemies.add(new Enemy(p[0], p[1]));}}
public void paintComponent(Graphics g){
super.paintComponent(g);
if(alive){
draw(g);
}
else{
gameOver(g);}
Toolkit.getDefaultToolkit().sync();
}
private void gameOver(Graphics g) {
// TODO Auto-generated method stub
String message = "Game over";
Font font = new Font("Helvetica", Font.BOLD, 17);
FontMetrics fm = getFontMetrics(font);
g.setColor(Color.WHITE);
g.setFont(font);
g.drawString(message, (panelWidth - fm.stringWidth(message))/2, panelHeight/2);
}
private void draw(Graphics g) {
// TODO Auto-generated method stub
Graphics2D g2d = (Graphics2D) g;
g2d.drawImage(player.getImage(), player.getX(), player.getY(), this);
ArrayList<Weapon> ws = player.getWeapons();
for (Weapon w1: ws){
Weapon w = (Weapon) w1;
g2d.drawImage(w.getImage(), w.getX(), w.getY(), this);
}
for (Enemy e1: enemies){
Enemy e =(Enemy) e1;
g2d.drawImage(e.getImage(), e.getX(), e.getY(), this);
}
}
public void actionPerformed(ActionEvent e){
alive();
updateWeapons();
updateEnemies();
updatePlayer();
checkCollisions();
repaint();
}
void alive(){
if (!alive){
timer.stop();
}
}
void updateWeapons(){
ArrayList<Weapon> ws = player.getWeapons();
for (int i = 0; i < ws.size(); i++){
Weapon w = (Weapon) ws.get(i);
if (w.visible()){
w.move();
}
else{
ws.remove(i);
}
}
}
void updatePlayer(){
player.move();
}
void updateEnemies(){
if (enemies.isEmpty()){
alive = false;
return;
}
for (int i = 0; i < enemies.size(); i++){
Enemy e = enemies.get(i);
if(e.visible()){
e.move();
}else {
enemies.remove(i);
}
}
}
public void checkCollisions(){
Rectangle r3 = player.getBounds();
for (Enemy enemy: enemies){
Rectangle r2 = enemy.getBounds();
if (r3.intersects(r2)){
player.setVisible(false);
enemy.setVisible(false);
alive = false;
}
}
ArrayList<Weapon> ws = player.getWeapons();
for (Weapon w : ws) {
Rectangle r1 = w.getBounds();
for (Enemy enemy : enemies) {
Rectangle r2 = enemy.getBounds();
if (r1.intersects(r2)) {
w.setVisible(false);
enemy.setVisible(false);
}
}
}
}
class TAdapter extends KeyAdapter{
public void keyReleased(KeyEvent e) {
player.keyReleased(e);
}
public void keyPressed(KeyEvent e) {
player.keyPressed(e);
}
}
}
Класс java.util.Random представляет собой генератор псевдослучайных чисел.
Метод int nextInt(int n) возвращает следующее случайное значение типа int в диапазоне от 0 до n
Замените maxValueOfX
, maxValueOfY
и enemiesNumber
на свои значения.
int enemiesNumber = 10;
final int maxValueOfX = 1366;
final int maxValueOfY = 768;
Random random = new Random();
int[][] positions = new int[enemiesNumber][2];
for (int i = 0; i < positions.length; i++) {
positions[i][0] = random.nextInt(maxValueOfX);
positions[i][1] = random.nextInt(maxValueOfY);
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Помогите понять как правильно настроить структура общения через объектыСервер:
Конвертирую класс из java в kotlin, при условии, что класс рабочий
ЗдравствуйтеХочу реализовать заливку на Java под Android