gpt4 book ai didi

java - Sprite 无法正常移动 Java

转载 作者:行者123 更新时间:2023-12-02 03:52:52 26 4
gpt4 key购买 nike

我正在尝试使用 java 制作一个太空射击游戏,但它不起作用。我目前正在努力生成敌人。为了保存所有敌人的位置,我使用了一个名为 allEnemiesArrayListArrayList 填充有 Point 对象。我通过在游戏循环中调用 updateEnemies() 来更新游戏。

原本,我让敌人的 y 位置增量为 1,但这太快了,所以我将其更改为 0.2,试图减慢速度。一旦我将其设为 0.2, Sprite 就会在顶部生成,但不会向下移动。我适用于任何高于 1 的值,包括小数,但不适用于低于 1 的任何值。这是我的代码:

敌人.java

package main;

import java.awt.Point;
import java.util.ArrayList;

public class Enemy {

static ArrayList<Point> allEnemies = new ArrayList<Point>();

public static ArrayList<Point> createEnemies(int round) {
for (int i = 0; i < round; i++) {
Point newEnemyLocation = new Point((int) (Math.random()*Game.WIDTH - 64), 0);
allEnemies.add(newEnemyLocation);
}
return allEnemies;
}

public static ArrayList<Point> updateEnemies() {
if (allEnemies.size() != 0) {
for (int i = 0; i < allEnemies.size(); i++) {
Point enemyLocation = allEnemies.get(i);
if (enemyLocation.y <= Game.HEIGHT) {
allEnemies.get(i).y += 0.2;
} else {
allEnemies.remove(i);
}
}
}
return allEnemies;
}

}

游戏.java

package main;

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JFrame;

public class Game extends Canvas implements Runnable, KeyListener {

//declare values
private static final long serialVersionUID = 1L;
public static final int WIDTH = 800;
public static final int HEIGHT = 600;
public static final String TITLE = "Space Shooter";

private boolean running = false;
private Thread thread;

private Player player;

private BufferedImage playerImage;
private BufferedImage bulletImage;
private BufferedImage enemyImage;

int playerx;
int playery;

int round = 1;

public Game() {
//
player = new Player((WIDTH/2)-32, HEIGHT-200);

//allocates all file resources
try {
playerImage = ImageIO.read(this.getClass().getResourceAsStream("/resources/player.png"));
bulletImage = ImageIO.read(this.getClass().getResourceAsStream("/resources/bullet.png"));
enemyImage = ImageIO.read(this.getClass().getResourceAsStream("/resources/enemy.png"));
} catch (IOException e) {
e.printStackTrace();
}

addKeyListener(this);
setFocusable(true);
requestFocusInWindow();
}

//starts thread
private synchronized void start() {
if (running)
return;

running = true;
thread = new Thread(this);
thread.start();
}

//stops thread
private synchronized void stop() {
if (!running)
return;

running = false;
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.exit(1);
}

@Override
//game loop
public void run() {
long lastTime = System.nanoTime();
final double amountOfTicks = 60.0;
double ns = 1000000000 / amountOfTicks;
double delta = 0;
int updates = 0;
int frames = 0;
long timer = System.currentTimeMillis();
while (running) {
long now = System.nanoTime();
delta += (now - lastTime) / ns;
lastTime = now;
if (delta > 1) {
tick();
updates++;
delta--;
}
Shoot.updateBullets();
Enemy.updateEnemies();
render();
frames++;

if (System.currentTimeMillis() - timer > 1000) {
timer += 1000;
System.out.println(updates + " TICKS, " + frames + " FPS");
updates = 0;
frames = 0;
}
}
stop();
}

//updates sprite locations
public void tick() {
playerx = player.getX();
playery = player.getY();
}

//renders sprites
public void render() {
//setting up triple-buffering
BufferStrategy bs = this.getBufferStrategy();
if (bs == null) {
createBufferStrategy(3);
return;
}
Graphics g = bs.getDrawGraphics();

//////////////////////////////////

g.setColor(Color.BLACK); g.fillRect(0,0,getWidth(), getHeight());
g.drawImage(playerImage, playerx, playery, this);

if (Shoot.allBullets.size() != 0) {
for (int i = 0; i < Shoot.allBullets.size(); i++) {
int bulletx = (int) Shoot.allBullets.get(i).getX();
int bullety = (int) Shoot.allBullets.get(i).getY();
g.drawImage(bulletImage, bulletx + 21, bullety, this);
}
}

if (Enemy.allEnemies.size() != 0) {
for (int i = 0; i < Enemy.allEnemies.size(); i++) {
int enemyx = (int) Enemy.allEnemies.get(i).getX();
int enemyy = (int) Enemy.allEnemies.get(i).getY();
g.drawImage(enemyImage, enemyx, enemyy, this);
}
} else {
Enemy.createEnemies(round);
round++;
}

//////////////////////////////////

g.dispose();
bs.show();
}

@Override
public void keyReleased(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_SPACE) {
Shoot.addBullet(player.getX(), player.getY());
}
}

public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
if (key == KeyEvent.VK_UP) {
player.setY(playery -= 20);
} else if (key == KeyEvent.VK_DOWN) {
player.setY(playery += 20);
} else if (key == KeyEvent.VK_RIGHT) {
player.setX(playerx += 20);
} else if (key == KeyEvent.VK_LEFT) {
player.setX(playerx -= 20);
}
}

public void keyTyped(KeyEvent e) {}

public static void main(String[] args) {

Game game = new Game();
JFrame frame = new JFrame(TITLE);

frame.setSize(WIDTH, HEIGHT);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(false);
frame.add(game);
frame.getContentPane().setBackground(Color.BLACK);
frame.setVisible(true);

game.start();

}

}

最佳答案

您好,这是因为点类保存了 2 个整数 x 和 y,并且您尝试将 0.2 添加到一个只能存储不带小数的值的整数,因此您有 2 个选项 1 是将点更改为 Point2D(保存 double ) double 可以保存带小数的数字)或者您可以创建一个带有 x 和 y float / double 的敌人类,但在这种情况下我会选择选项 1,因为这是一个小游戏,祝你好运!

编辑:我对 point2d 的看法是错误的,只是看到它是一个抽象类,所以这样做

公共(public)类敌人{

公共(public)双 x,y;

公众敌人(双x,双y){

      this.x = x;
this.y = y;

}

}

并将其用作数组列表中的对象

关于java - Sprite 无法正常移动 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35736353/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com