Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何让敌人朝玩家的方向射击_Java - Fatal编程技术网

Java 如何让敌人朝玩家的方向射击

Java 如何让敌人朝玩家的方向射击,java,Java,我在做一个坦克游戏。我已经知道如何让我的敌人朝玩家的方向移动,但我不太确定如何让它朝玩家的方向射击。坦克射手也必须朝着敌人射击的方向旋转。(子弹必须从射手身上“出来”) 这必须旋转,我已经写了代码让玩家的射手跟随鼠标的位置 我把枪手放在坦克身上 作为项目符号,我们使用黑圈:(ObjWHisObjectWidhtHeight) 我想把敌人的子弹储存在ArrayList中,每个敌人都需要自己的ArrayList `package tanks; import java.awt.Graphics2D;

我在做一个坦克游戏。我已经知道如何让我的敌人朝玩家的方向移动,但我不太确定如何让它朝玩家的方向射击。坦克射手也必须朝着敌人射击的方向旋转。(子弹必须从射手身上“出来”)

这必须旋转,我已经写了代码让玩家的射手跟随鼠标的位置

我把枪手放在坦克身上

作为项目符号,我们使用黑圈:(
ObjWH
is
ObjectWidhtHeight

我想把敌人的子弹储存在ArrayList中,每个敌人都需要自己的ArrayList

`package tanks;

import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.util.ArrayList;

import javax.swing.ImageIcon;
import javax.swing.Timer;

import menu.PlayPanel;
import menu.Tanks;

    public class Enemy extends Game_Object {

        private static final Timer shootTimer = null;
        private PlayPanel panel;

        int launchPosition;

        double distance;
        double deltaX, deltaY;

        private ArrayList<EnemyBullet> enemyBullets;

        public Enemy(PlayPanel panel)
        {
            this.panel = panel;
            speed = 3 + rand.nextInt(5); 
            maxHP = 80 + rand.nextInt(40); 
            HP = maxHP;
            angle = 0; 
            angleCannon = 0;
            objWH = 65;

        }

    public void launch() 
    {
        launchPosition = rand.nextInt(3);

            switch(launchPosition){
            case 0: //up
                x_pos = rand.nextInt(Tanks.getSchermBreedte());
                y_pos =  0;
                break;

            case 1: //left
                x_pos = 0;
                y_pos = rand.nextInt(Tanks.getSchermHoogte());
                break;

            case 2: //downside
                x_pos = rand.nextInt(Tanks.getSchermBreedte());
                y_pos = Tanks.getSchermHoogte();
                break;


            case 3: //right
                x_pos = Tanks.getSchermBreedte();
                y_pos = rand.nextInt(Tanks.getSchermHoogte());
                break;  
            }
        }

        public void move()  
        {
            if (Player.get_x_pos() >= Enemy.get_x_pos())
            {
                deltaX =  Player.get_x_pos() - Enemy.get_x_pos();
            }
            else //if(Player.get_x_pos() <= Enemy.get_x_pos())
            {
                deltaX = Enemy.get_x_pos() - Player.get_x_pos();
            }

            if(Player.get_y_pos() >= Enemy.get_y_pos())
            {
                deltaY = Player.get_y_pos() - Enemy.get_y_pos();
            }
            else //if(Player.get_y_pos() <= Enemy.get_y_pos())
            {
                deltaY =  Enemy.get_y_pos() - Player.get_y_pos();
            }

            distance =  Math.pow(Math.pow(deltaX, deltaX) + Math.pow(deltaY,            
                deltaY), 1/2);

            x_move = speed*(deltaX/distance);
            y_move = speed*(deltaY/distance);

            x_pos += x_move;
            y_pos += y_move;
        }


        private static double get_x_pos()  
        {
            return Enemy.x_pos;
        }           

        private static double get_y_pos()
        {
            return Enemy.y_pos;
        }


        public void shoot()
        {

            enemyBullets = new ArrayList<EnemyBullet>();
        }

        public void touched()
        {
            if(HP>0)
                HP -= (5 + rand.nextInt(10));   

            if(HP <= 0)
                dood = true;
        }

        public void draw(Graphics2D g2d)
        {
            body = new ImageIcon(getClass().getResource("/objects/enemy 
                tank.png")).getImage();
            shooter = new ImageIcon(getClass().getResource("/objects/enemy 
                shooter.png")).getImage();
        }
    }`
`包装罐;
导入java.awt.Graphics2D;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.geom.AffineTransform;
导入java.util.ArrayList;
导入javax.swing.ImageIcon;
导入javax.swing.Timer;
导入菜单.播放面板;
进口菜单。坦克;
公共类敌人扩展游戏对象{
专用静态最终计时器shootTimer=null;
私人播放面板;
int发射位置;
双倍距离;
双三角洲,三角洲;
私人ArrayList Enemy子弹头;
公敌(游戏面板)
{
this.panel=面板;
速度=3+下一次随机数(5);
maxHP=80+兰特·耐克斯汀(40);
HP=maxHP;
角度=0;
角度=0;
objWH=65;
}
公开发售()
{
launchPosition=rand.nextInt(3);
开关(启动位置){
案例0://向上
x_pos=rand.nextInt(Tanks.getSchermBreedte());
y_pos=0;
打破
案例1://左
x_pos=0;
y_pos=rand.nextInt(Tanks.getSchermHoogte());
打破
案例2://不利因素
x_pos=rand.nextInt(Tanks.getSchermBreedte());
y_pos=坦克。getSchermHoogte();
打破
案例3://对
x_pos=Tanks.getSchermBreedte();
y_pos=rand.nextInt(Tanks.getSchermHoogte());
打破
}
}
公开作废动议()
{
if(Player.get\u x\u pos()>=敌人.get\u x\u pos())
{
deltaX=玩家。获取位置()-敌人。获取位置();
}
else//if(Player.get\u x\u pos()=敌人.get\u y\u pos())
{
deltaY=玩家。获取你的位置()-敌人。获取你的位置();
}
else//if(Player.get\u y\u pos()0)
HP-=(5+兰特·耐克斯汀(10));

如果(HP好的话,其本质将是“基本几何”,特别是函数
ATAN2
(谷歌it…)

假设有一个直角三角形,你的坦克在一个顶点,敌人在斜边的另一端。
ATAN2
可以告诉你该向量的角度(以及它所在的“象限”)。通常,计算单位是弧度,而不是度

为了实现逼真的运动,你的坦克逻辑必须定期计算这个角度,然后以一定的增量转向它。如果角度现在足够小,子弹会击中目标,坦克就会开火


我不打算为您提供“代码编写服务”,但这是它的基本数学。

好吧,这将是“基本几何”,特别是函数
ATAN2
(谷歌it…)

假设有一个直角三角形,你的坦克在一个顶点,敌人在斜边的另一端。
ATAN2
可以告诉你该向量的角度(以及它所在的“象限”)。通常,计算单位是弧度,而不是度

为了实现逼真的运动,你的坦克逻辑必须定期计算这个角度,然后以一定的增量转向它。如果角度现在足够小,子弹会击中目标,坦克就会开火


我不打算为您提供“代码编写服务”,但这是它的基本数学。

好吧,这将是“基本几何”,特别是函数
ATAN2
(谷歌it…)

假设有一个直角三角形,你的坦克在一个顶点,敌人在斜边的另一端。
ATAN2
可以告诉你该向量的角度(以及它所在的“象限”)。通常,计算单位是弧度,而不是度

为了实现逼真的运动,你的坦克逻辑必须定期计算这个角度,然后以一定的增量转向它。如果角度现在足够小,子弹会击中目标,坦克就会开火


我不打算为您提供“代码编写服务”,但这是它的基本数学。

好吧,这将是“基本几何”,特别是函数
ATAN2
(谷歌it…)

假设有一个直角三角形,你的坦克在一个顶点,敌人在斜边的另一端。
ATAN2
可以告诉你该向量的角度(以及它所在的“象限”)。通常,计算单位是弧度,而不是度

为了实现逼真的运动,你的坦克逻辑必须定期计算这个角度,然后以一定的增量转向它。如果角度现在足够小,子弹会击中目标,坦克就会开火


我不会为您提供“代码编写服务”,但这是它的基本数学知识。

我建议您查找一些如何使用2D向量计算的示例。我不太确定您使用的是哪个框架。通常游戏引擎或框架都有向量类

向量看起来像(x,y),所以你有两个你需要的坐标,如果你减去
`package tanks;

import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.util.ArrayList;

import javax.swing.ImageIcon;
import javax.swing.Timer;

import menu.PlayPanel;
import menu.Tanks;

    public class Enemy extends Game_Object {

        private static final Timer shootTimer = null;
        private PlayPanel panel;

        int launchPosition;

        double distance;
        double deltaX, deltaY;

        private ArrayList<EnemyBullet> enemyBullets;

        public Enemy(PlayPanel panel)
        {
            this.panel = panel;
            speed = 3 + rand.nextInt(5); 
            maxHP = 80 + rand.nextInt(40); 
            HP = maxHP;
            angle = 0; 
            angleCannon = 0;
            objWH = 65;

        }

    public void launch() 
    {
        launchPosition = rand.nextInt(3);

            switch(launchPosition){
            case 0: //up
                x_pos = rand.nextInt(Tanks.getSchermBreedte());
                y_pos =  0;
                break;

            case 1: //left
                x_pos = 0;
                y_pos = rand.nextInt(Tanks.getSchermHoogte());
                break;

            case 2: //downside
                x_pos = rand.nextInt(Tanks.getSchermBreedte());
                y_pos = Tanks.getSchermHoogte();
                break;


            case 3: //right
                x_pos = Tanks.getSchermBreedte();
                y_pos = rand.nextInt(Tanks.getSchermHoogte());
                break;  
            }
        }

        public void move()  
        {
            if (Player.get_x_pos() >= Enemy.get_x_pos())
            {
                deltaX =  Player.get_x_pos() - Enemy.get_x_pos();
            }
            else //if(Player.get_x_pos() <= Enemy.get_x_pos())
            {
                deltaX = Enemy.get_x_pos() - Player.get_x_pos();
            }

            if(Player.get_y_pos() >= Enemy.get_y_pos())
            {
                deltaY = Player.get_y_pos() - Enemy.get_y_pos();
            }
            else //if(Player.get_y_pos() <= Enemy.get_y_pos())
            {
                deltaY =  Enemy.get_y_pos() - Player.get_y_pos();
            }

            distance =  Math.pow(Math.pow(deltaX, deltaX) + Math.pow(deltaY,            
                deltaY), 1/2);

            x_move = speed*(deltaX/distance);
            y_move = speed*(deltaY/distance);

            x_pos += x_move;
            y_pos += y_move;
        }


        private static double get_x_pos()  
        {
            return Enemy.x_pos;
        }           

        private static double get_y_pos()
        {
            return Enemy.y_pos;
        }


        public void shoot()
        {

            enemyBullets = new ArrayList<EnemyBullet>();
        }

        public void touched()
        {
            if(HP>0)
                HP -= (5 + rand.nextInt(10));   

            if(HP <= 0)
                dood = true;
        }

        public void draw(Graphics2D g2d)
        {
            body = new ImageIcon(getClass().getResource("/objects/enemy 
                tank.png")).getImage();
            shooter = new ImageIcon(getClass().getResource("/objects/enemy 
                shooter.png")).getImage();
        }
    }`
private double calculateAngle(double vecX, double vecY) {
    double angle = Math.toDegrees(Math.atan(vecY / vecX));
    return vecX > 0 ? angle : 180 + angle;
}