Java:向不同方向发射弹丸而不影响已发送的弹丸

标签 java direction projectile

所以基本上,当我改变方向时,我发射的射弹会很好地跟随。问题是之前的所有射弹也会改变方向。

这是我的projectile.java:

package dev.codenmore.tilegame.gfx;

import java.awt.Graphics;

import dev.codenmore.tilegame.Handler;
import dev.codenmore.tilegame.entity.creatures.Player;

public class Projectile {

    private double x;
    private double y;

    public Projectile (double x, double y, Handler handler){
        this.x = x;
        this.y = y;
    }

    public void tick(){
        if ( Player.getPos() == 3)
            x += 10;
        if ( Player.getPos() == 2)
            x -= 10;
        if (Player.getPos() == 1)
            y -= 10;
        if (Player.getPos() == 0)
            y += 10;
    }

    public void render(Graphics g){
        g.drawImage(Assets.arrow, (int) x, (int) y, null);
    }

}

这是我的controller.java:

package dev.codenmore.tilegame;

import java.awt.Graphics;
import java.util.LinkedList;

import dev.codenmore.tilegame.gfx.Projectile;

public class Controller {

    private static LinkedList<Projectile> b = new LinkedList <Projectile>();

    Projectile TempProjectile;

    Handler handler;

    public Controller(Handler handler){
        this.handler = handler;


    }

    public void tick(){
        for(int i = 0; i < b.size(); i++){
            TempProjectile = b.get(i);

            TempProjectile.tick();

        }
    }

    public void render(Graphics g){
        for(int i = 0; i < b.size(); i++){
            TempProjectile = b.get(i);

            TempProjectile.render(g);

        }

    }

    public static void addProjectile(Projectile block){
        b.add(block);
    }
    public static void removeProjectile(Projectile block){
        b.remove(block);
    }    
}

我的player.java:

package dev.codenmore.tilegame.entity.creatures;

import java.awt.Color;
import java.awt.Graphics;

import dev.codenmore.tilegame.Controller;
import dev.codenmore.tilegame.Game;
import dev.codenmore.tilegame.Handler;
import dev.codenmore.tilegame.gfx.Assets;
import dev.codenmore.tilegame.gfx.Projectile;

public class Player extends Creature {

    public static int pos = 0;



    public Player(Handler handler, float x, float y) {
        super(handler, x, y, Creature.DEFAULT_CREATURE_WIDTH, Creature.DEFAULT_CREATURE_HEIGHT);

        bounds.x = 46;
        bounds.y = 64;
        bounds.width = 32;
        bounds.height = 44;

    }

    @Override
    public void tick() {
        getInput();
        move();
        handler.getGameCamera().centerOnEntity(this);
    }

    private void getInput(){
        xMove = 0;
        yMove = 0;

        if(handler.getKeyManager().up)
            yMove = -speed;
        if(handler.getKeyManager().down)
            yMove = speed;
        if(handler.getKeyManager().left)
            xMove = -speed;
        if(handler.getKeyManager().right)
            xMove = speed;
        if(handler.getKeyManager().shoot)
            Controller.addProjectile(new Projectile((double)(x - handler.getGameCamera().getxOffset()),  (double)(y - handler.getGameCamera().getyOffset()), handler));

    }

    public static int getPos(){
        return pos;
    }

    @Override
    public void render(Graphics g) {



        if ( pos == 0)
            g.drawImage(Assets.player, (int)(x - handler.getGameCamera().getxOffset()), (int)(y - handler.getGameCamera().getyOffset()), width, height, null);
        if (pos == 1)
            g.drawImage(Assets.playerUp, (int)(x - handler.getGameCamera().getxOffset()), (int)(y - handler.getGameCamera().getyOffset()), width, height, null);
        if (pos == 2)
            g.drawImage(Assets.playerLeft, (int)(x - handler.getGameCamera().getxOffset()), (int)(y - handler.getGameCamera().getyOffset()), width, height, null);
        if (pos == 3)
            g.drawImage(Assets.playerRight, (int)(x - handler.getGameCamera().getxOffset()), (int)(y - handler.getGameCamera().getyOffset()), width, height, null);
        if(handler.getKeyManager().up){
            g.drawImage(Assets.playerUp, (int)(x - handler.getGameCamera().getxOffset()), (int)(y - handler.getGameCamera().getyOffset()), width, height, null);
            pos = 1;
        }else if(handler.getKeyManager().left){
            g.drawImage(Assets.playerLeft, (int)(x - handler.getGameCamera().getxOffset()), (int)(y - handler.getGameCamera().getyOffset()), width, height, null);
            pos = 2;
        }else if(handler.getKeyManager().right){
            g.drawImage(Assets.playerRight, (int)(x - handler.getGameCamera().getxOffset()), (int)(y - handler.getGameCamera().getyOffset()), width, height, null);
            pos = 3;
        }else if(handler.getKeyManager().down){
            g.drawImage(Assets.player, (int)(x - handler.getGameCamera().getxOffset()), (int)(y - handler.getGameCamera().getyOffset()), width, height, null);
            pos = 0;
        }

    }

}

我对编程还很陌生,所以对这些错误感到抱歉。 发生的情况如下:http://gyazo.com/118b525d22e42a92fece77f70201cdad

最佳答案

问题所在:

public void tick(){
    if ( Player.getPos() == 3)
        x += 10;
    if ( Player.getPos() == 2)
        x -= 10;
    if (Player.getPos() == 1)
        y -= 10;
    if (Player.getPos() == 0)
        y += 10;
}

在每个刻度中,都会询问玩家的方向,该方向可以更改,因此射弹也会改变。为了避免这种情况,请在开始时保存每个射弹的位置,如下所示:

private int pos;
public Projectile (double x, double y, Handler handler){
    this.x = x;
    this.y = y;
    this.pos = Player.getPos();
}

然后勾选方法:

public void tick(){
    if ( pos == 3)
        x += 10;
    if ( pos == 2)
        x -= 10;
    if ( pos == 1)
        y -= 10;
    if ( pos == 0)
        y += 10;
}

切换会更好:

public void tick(){
    switch(pos){
        case 3: x+=10; break;
        case 2: x-=10; break;
        case 1: y-=10; break;
        case 0: y+=10; break;
    }
}

关于Java:向不同方向发射弹丸而不影响已发送的弹丸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31280722/

相关文章:

emacs - 如何让 Emacs 转换模式忽略出现在 virtualenv Cython 项目中的大多数文件?

java - 将 StucturedTextEditor 用于自定义 IEditorInput

java - 何时可以在 Wicket Ajax TabbedPanel 中使用 getString()?

java - Android Java - 解析 "76"时出现 NumberFormatException

emacs - 有没有办法使用projectile来指定cmake项目的编译目录?

android - 对射弹实现重力 - 增量时间问题

Java -> Apache Commons StringEscapeUtils -> escapeJavaScript

math - 使用两个经度/纬度点获取方向(罗盘)

iphone - 使用指南针指向实际坐标位置而不仅仅是北

android - ListView 改变顺序到相反的方向 ANDROID