Untitled
unknown
java
3 years ago
7.1 kB
8
Indexable
package com.company; import javax.swing.*; import java.awt.*; 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; class Star { private int x; private int y; private Color color; public Star(int x, int y, Color color) { this.x = x; this.y = y; this.color = color; } public int getX() { return x; } public int getY() { return y; } public Color getColor() { return color; } public void draw(Graphics g, int viewportWidth, int viewportHeight) { g.setColor(color); g.fillRect(x, y, 1, 1); } } class Player { private int scores = 0; private int x; private int y; private int size = 50; private Color color = Color.YELLOW; private int speed = 5; public Player() { } public void draw(Graphics g, int viewportWidth, int viewportHeight) { g.setColor(color); g.fillRect(x, y, size, size); g.setColor(Color.WHITE); Graphics2D g2 = (Graphics2D)g; g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setFont(new Font("Arial", Font.BOLD, 24)); g2.drawString("Score: " + scores,10, 30); } public void setPosition(int x, int y) { this.x = x; this.y = y; } public int getSize() { return size; } public void move(int x, int y) { this.x += x; this.y += y; } public int getSpeed() { return speed; } public int getCenterX() { return x + size / 2; } public int getCenterY() { return y + size / 2; } public void addScore(int score) { this.scores += score; } } class Asteroid { private int x; private int y; private int size; private Color color = Color.YELLOW; private int speed; private boolean isAlive = true; public Asteroid(int x, int y, int size, int speed, Color color) { this.x = x; this.y = y; this.size = size; this.speed = speed; this.color = color; } public void draw(Graphics g, int viewportWidth, int viewportHeight) { g.setColor(color); g.fillOval(x, y, size, size); } public void setPosition(int x, int y) { this.x = x; this.y = y; } public int getSize() { return size; } public void move(int x, int y) { this.x += x; this.y += y; } public int getSpeed() { return speed; } public int getCenterX() { return x + size / 2; } public int getCenterY() { return y + size / 2; } public boolean isAlive() { return isAlive; } public void remove() { isAlive = false; } } class Viewport extends JPanel { private Random random = new Random(); private ArrayList<Star> stars = new ArrayList<Star>(); private Player player = new Player(); private ArrayList<Asteroid> asteroids = new ArrayList<Asteroid>(); public Viewport() { } public void initializeGame() { for (int starIndex = 0; starIndex < 200; starIndex++) { int x = random.nextInt(0, getWidth()); int y = random.nextInt(0, getHeight()); Color color = new Color(random.nextFloat(), random.nextFloat(), random.nextFloat()); stars.add(new Star(x, y, color)); } for (int starIndex = 0; starIndex < 10; starIndex++) { asteroids.add(generateRandomAsteroid()); } player.setPosition(getWidth() / 2 - player.getSize() / 2, getHeight() - player.getSize() - 15); } public Asteroid generateRandomAsteroid() { int x = random.nextInt(0, getWidth()); int y = random.nextInt(0, getHeight()) - getHeight() - 50; Color color = new Color(random.nextFloat(), random.nextFloat(), random.nextFloat()); int size = random.nextInt(10, 50); int speed = random.nextInt(5, 10); return new Asteroid(x, y, size, speed, color); } public void handleKey(char keyChar) { // w a s d if (keyChar == 'd') { player.move(player.getSpeed(), 0); } else if (keyChar == 'a') { player.move(-player.getSpeed(), 0); } repaint(); } private boolean isPlayerAndAsteroidIntersecting(Player player, Asteroid asteroid) { return Math.pow(player.getCenterX() - asteroid.getCenterX(), 2) + Math.pow(player.getCenterY() - asteroid.getCenterY(), 2) <= Math.pow(asteroid.getSize(), 2); } public void updateGame(float delta) { int removedAsteroidsCount = 0; for (Asteroid asteroid : asteroids) { asteroid.move(0, asteroid.getSpeed()); if (isPlayerAndAsteroidIntersecting(player, asteroid)) { throw new RuntimeException("Вы проиграли!"); } if (asteroid.isAlive() && asteroid.getCenterY() > getHeight()) { player.addScore(1); asteroid.remove(); removedAsteroidsCount++; } } for (int asteroidIndex = 0; asteroidIndex < removedAsteroidsCount; asteroidIndex++) { asteroids.add(generateRandomAsteroid()); } // TODO: remove all asteroids those are not alive } public void paintComponent(Graphics g) { super.paintComponent(g); g.setColor(Color.BLACK); g.fillRect(0, 0, getWidth(), getHeight()); for (Star star : stars) { star.draw(g, getWidth(), getHeight()); } for (Asteroid asteroid : asteroids) { asteroid.draw(g, getWidth(), getHeight()); } player.draw(g, getWidth(), getHeight()); } } class GraphicsWindow extends JFrame { private final Viewport viewport = new Viewport(); public GraphicsWindow(String title, int width, int height) { super(title); add(viewport); pack(); setSize(width, height); setResizable(false); setFocusable(true); setDefaultCloseOperation(EXIT_ON_CLOSE); setVisible(true); viewport.initializeGame(); addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent event) { event.consume(); viewport.handleKey(event.getKeyChar()); } }); Timer timer = new Timer(33, new ActionListener() { public void actionPerformed(ActionEvent evt) { long time = System.currentTimeMillis(); viewport.updateGame(33.0f / 1000.0f); viewport.repaint(); } }); timer.start(); } public Viewport getViewport() { return viewport; } } public class Main { public static void main(String[] args) { new GraphicsWindow("Asteroids game", 640, 480); } }
Editor is loading...