Untitled
unknown
java
3 years ago
7.1 kB
12
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...