我这样做的目的是使播放器面向鼠标方向,但因此存在问题

问题描述 投票:0回答:1

所以基本上我想创建一个僵尸以便以后与它们互动,但是当我绘制它们时,我注意到它们都朝着与玩家相同的方向(鼠标移动)发生在我绘制的所有东西上。我该如何解决? (给每个僵尸一个独立于鼠标方向的位置)

Screen.java

import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JPanel;

public class Screen extends JPanel implements KeyListener, MouseListener, MouseMotionListener {

    private Enemy[] enemy;
    private Bullet bullet;
    private Player player;

    boolean collisionBetweenBnZ = false;

    private int mX, mY, key;
    private List<Bullet> firedBullets = new ArrayList<Bullet>();

    public Screen() {

        player = new Player(400, 500);
        enemy = new Enemy[10];

        for (int i = 0; i < enemy.length; i++) {
            enemy[i] = new Enemy();
        }

        setFocusable(true);
        addKeyListener(this);
        addMouseMotionListener(this);
        addMouseListener(this);

        this.requestFocusInWindow();


    }

    public Dimension getPreferredSize() {

        return new Dimension(800, 600);

    }

    public void paintComponent(Graphics g) {

        super.paintComponents(g);

        //an obstacle for zombies

        g.fillRect(0, 400, 800, 4);

        //drawing each bullet as soon as they are added to the list (when pressing mouse button)

        for (int i = 0; i < firedBullets.size(); i++) {
            firedBullets.get(i).drawBullet(g);
        }

        //drawing sprites

        player.drawPlayer(g);

        for (int i = 0; i < enemy.length; i++) {
            enemy[i].drawEnemy(g);
        }
    }

    public static int clamp(int num, int min, int max) { //method that prevents you from going beyond the window
        if (num >= max) return num = max;
        else if (num <= min) return num = min;
        else return num;
    }

    public void fire() {

        bullet = new Bullet(player.playerX(), player.playerY());
        bullet.updateAngle(mX, mY, player.playerX(), player.playerY());
        firedBullets.add(bullet);
    }

    public void animate() {

        while (true) {

            try {
                Thread.sleep(10); //in milliseconds
                }
            catch(InterruptedException ex) {
                Thread.currentThread().interrupt();
                }

            player.tick();
            /*for (int i = 0; i < )
            enemy.tick();*/
            //System.out.println("X: " + mX + "\n" + "Y: " + mY);
            for (int i = 0; i < firedBullets.size(); i++) {
                firedBullets.get(i).launch();
            }
            //if () getbounds

            repaint();
        }
    }

    public void keyTyped(KeyEvent e) {

    }

    public void keyPressed(KeyEvent e) {

        key = e.getKeyCode();

        if (key == KeyEvent.VK_A) {
            player.setVelX(-2);
        }
        else if (key == KeyEvent.VK_D) {
            player.setVelX(2);
        }
        else if (key == KeyEvent.VK_S) {
            player.setVelY(2);
        }
        else if (key == KeyEvent.VK_W) {
            player.setVelY(-2);
        }
        else if (key == KeyEvent.VK_SPACE) {
            //bullet.shootBullet = true;
        }
        else if (key == KeyEvent.VK_A && key == KeyEvent.VK_D) {
            player.setVelX(0);
        }
        else if (key == KeyEvent.VK_W && key == KeyEvent.VK_S) {
            player.setVelY(0);
        }
    }

    public void keyReleased(KeyEvent e) {

        key = e.getKeyCode();

        if (key == KeyEvent.VK_A) {
            player.setVelX(0); 
        }
        else if (key == KeyEvent.VK_D) {
            player.setVelX(0); 
        }
        else if (key == KeyEvent.VK_S) {
            player.setVelY(0); 
        }
        else if (key == KeyEvent.VK_W) {
            player.setVelY(0); 
        }
        else if (key == KeyEvent.VK_SPACE) {
            //bullet.shootBullet = false;
        }
    }

    @Override
    public void mouseDragged(MouseEvent e) {

    }

    @Override
    public void mouseMoved(MouseEvent e) {
        mX = e.getX();
        mY = e.getY();
        player.updateAngle(mX, mY);
        repaint();
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        fire();

    }

    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub

    }
}

Enemy.java

import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.util.concurrent.ThreadLocalRandom;

public class Enemy {

    private int health, width, height;

    private int enemyX, enemyY, velY;

    private BufferedImage img;

    public Enemy() {

        try {
            img = ImageIO.read(new File("/Users/david/Desktop/Enemy_Sprite.png"));  
        } catch (IOException e) {
            e.printStackTrace();                        
        }

        health = 100;
        width = img.getWidth();
        height = img.getHeight();

        enemyX = ThreadLocalRandom.current().nextInt(50, 750);
        enemyY = ThreadLocalRandom.current().nextInt(0, 200);

    }
    public Rectangle getBounds() {
        return new Rectangle(enemyX, enemyY, width, height);
    }
    public void setVelY(int y) {
        velY = y;
    }
    public void tick() {
        enemyY += velY;
    }
    public boolean obstacleInteraction() {
        //if (getBounds() == )
        return true;
    }

    public void drawEnemy(Graphics g) {

        g.drawImage(img, enemyX, enemyY, null);

    }
}

java rotation angle
1个回答
0
投票

由于this person,我知道了。因此,基本上在代码结尾处,我绘制了播放器并将其旋转到鼠标位置,然后将保存的原始平面位置g.setTransform(oldAT);

© www.soinside.com 2019 - 2024. All rights reserved.