- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对使用 Java 制作游戏(有点)陌生。我之前创建了一些简单的游戏,例如包收集游戏,但现在我想制作一个自上而下的僵尸射击游戏。我已经有了一个可以移动的球员,但现在我想实现射击。 问题是我不确定如何制作一个新的子弹,根据玩家面对屏幕的哪一部分,从玩家向右/向上/向下/向左射击到屏幕末端。 我已经粘贴了下面的所有代码(4 个类):
package me.mateo226.main;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
import me.mateo226.entities.Player;
import me.mateo226.guns.Bullet;
public class GamePanel extends JPanel implements Runnable {
private static final long serialVersionUID = 1L;
private static final int PWIDTH = 720;
private static final int PHEIGHT = 480;
private static Thread game;
private static volatile boolean running = false;
public static volatile boolean gameOver = false;
public static volatile boolean paused = false;
public static Graphics g;
public static Image gImage;
public static long lastLoopTime = System.currentTimeMillis();
public static long delta;
public static volatile boolean upPressed = false;
public static volatile boolean downPressed = false;
public static volatile boolean leftPressed = false;
public static volatile boolean rightPressed = false;
public BufferedImage backgroundImage;
public Player player;
Bullet bullet;
public GamePanel() {
setPreferredSize(new Dimension(PWIDTH, PHEIGHT));
setBackground(Color.white);
setFocusable(true);
requestFocus();
waitForTermination();
}
public void addNotify() {
super.addNotify();
startGame();
}
public void waitForTermination() {
addKeyListener(new KeyListener() {
@Override
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_ESCAPE) {
GamePanel.stopGame();
}
if (keyCode == KeyEvent.VK_W || keyCode == KeyEvent.VK_UP) {
upPressed = true;
}
if (keyCode == KeyEvent.VK_S || keyCode == KeyEvent.VK_DOWN) {
downPressed = true;
}
if (keyCode == KeyEvent.VK_A || keyCode == KeyEvent.VK_LEFT) {
leftPressed = true;
}
if (keyCode == KeyEvent.VK_D || keyCode == KeyEvent.VK_RIGHT) {
rightPressed = true;
}
if (keyCode == KeyEvent.VK_ESCAPE) {
System.exit(0);
}
}
@Override
public void keyReleased(KeyEvent e) {
int keyCode = e.getKeyCode();
if (keyCode == KeyEvent.VK_W || keyCode == KeyEvent.VK_UP) {
upPressed = false;
}
if (keyCode == KeyEvent.VK_S || keyCode == KeyEvent.VK_DOWN) {
downPressed = false;
}
if (keyCode == KeyEvent.VK_A || keyCode == KeyEvent.VK_LEFT) {
leftPressed = false;
}
if (keyCode == KeyEvent.VK_D || keyCode == KeyEvent.VK_RIGHT) {
rightPressed = false;
}
}
@Override
public void keyTyped(KeyEvent e) {
}
});
}
@Override
public void run() {
running = true;
while (running) {
delta = System.currentTimeMillis() - lastLoopTime;
lastLoopTime = System.currentTimeMillis();
gameUpdate();
gameRender();
checkMovement();
paintpauseScreen();
try {
Thread.sleep(5);
} catch (Exception e) {
System.out.println("The thread couldn't sleep! Error info: "
+ e);
}
}
System.exit(0);
}
private void checkMovement() {
if (!paused && !gameOver) {
}
}
private void paintpauseScreen() {
Graphics g;
try {
g = this.getGraphics();
if ((g != null) && (gImage != null))
g.drawImage(gImage, 0, 0, null);
g.dispose();
} catch (Exception e) {
System.out.println("Graphics context error: " + e);
}
}
private void gameRender() {
if (gImage == null) {
gImage = createImage(PWIDTH, PHEIGHT);
if (gImage == null) {
System.out
.println("image null after creating it??? Please check the code for any errors!");
} else {
g = gImage.getGraphics();
}
}
if (!paused) {
g.setColor(Color.white);
g.fillRect(0, 0, PWIDTH, PHEIGHT);
g.setColor(Color.blue);
}
try {
backgroundImage = ImageIO.read(new File("res\\background.png"));
} catch (IOException e) {
e.printStackTrace();
}
g.drawImage(backgroundImage, 0, 0, Color.white, null);
if (player != null) {
player.drawPlayer(g);
}
if (bullet != null) {
bullet.drawBullet(g);
}
}
private void gameUpdate() {
if (!paused && !gameOver) {
movePlayer();
if (bullet != null){
bullet.shootBullet(g, "right");
}
}
}
public void startGame() {
if (game == null) {
game = new Thread(this);
if (game == null) {
System.out.println("Couldn't create the thread!");
} else {
System.out.println("Thread created!");
game.start();
}
}
if (g == null) {
g = this.getGraphics();
if (g == null) {
System.out.println("The graphics were not created!");
} else {
System.out.println("The graphics are successfully created!");
}
}
player = new Player(32, 32, "res\\player.png");
bullet = new Bullet("res\\grassTile.png", "right", player.x + 32,
player.y);
running = true;
}
public void movePlayer() {
if (upPressed) {
player.y -= player.moveSpeed * delta;
}
if (downPressed) {
player.y += player.moveSpeed * delta;
}
if (leftPressed) {
player.x -= player.moveSpeed * delta;
}
if (rightPressed) {
player.x += player.moveSpeed * delta;
}
}
public static void stopGame() {
running = false;
}
}
这是我的 GamePanel 类。这是我的主要类(class):
package me.mateo226.main;
import java.awt.Container;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
public class Main extends JFrame implements WindowListener {
private static final long serialVersionUID = 1L;
private static GamePanel panel;
public static boolean DEBUGGING = false;
public Main(){
super("The Gun Reactor");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
addWindowListener(this);
Container c = getContentPane();
panel = new GamePanel();
c.add(panel, "Center");
setResizable(false);
pack();
setLocationRelativeTo(null);
if(JOptionPane.showConfirmDialog(null, "Enable debugging?") == 1){
DEBUGGING = true;
} else {
DEBUGGING = false;
}
setVisible(true);
}
@Override
public void windowActivated(WindowEvent arg0) {
}
@Override
public void windowClosed(WindowEvent arg0) {
}
@Override
public void windowClosing(WindowEvent arg0) {
}
@Override
public void windowDeactivated(WindowEvent arg0) {
}
@Override
public void windowDeiconified(WindowEvent arg0) {
}
@Override
public void windowIconified(WindowEvent arg0) {
}
@Override
public void windowOpened(WindowEvent arg0) {
}
public static void main(String args[]){
new Main();
}
}
这是我的 Player 类:
package me.mateo226.entities;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Player {
public int x, y;
public float moveSpeed = 0.1f;
private BufferedImage playerTexture;;
public Player(int x, int y, String texturePath){
this.x = x;
this.y = y;
try {
playerTexture = ImageIO.read(new File(texturePath));
} catch (IOException e){
e.printStackTrace();
}
}
public void drawPlayer(Graphics g){
g.setColor(Color.white);
g.drawImage(playerTexture, x, y, null);
}
}
最后,这是我的子弹类,我真的不知道如何使用,甚至不知道如何正确制作它:
package me.mateo226.guns;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import me.mateo226.main.GamePanel;
public class Bullet {
private int x, y;
private BufferedImage bulletTexture;
private float bulletSpeed = 0.1f;
public Bullet(String bulletTexturePath, String dir, int x, int y) {
this.x = x;
this.y = y;
try {
bulletTexture = ImageIO.read(new File(bulletTexturePath));
} catch (IOException e) {
e.printStackTrace();
}
}
public void drawBullet(Graphics g) {
g.setColor(Color.white);
g.drawImage(bulletTexture, x, y, null);
}
public void shootBullet(Graphics g, String dir) {
switch (dir) {
case "left":
while (x > -32) {
x -= bulletSpeed * GamePanel.delta;
drawBullet(g);
}
break;
case "right":
while (x < 700) {
x += bulletSpeed * GamePanel.delta;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
break;
case "up":
while (y > -32) {
y -= bulletSpeed * GamePanel.delta;
drawBullet(g);
}
break;
case "down":
while (y < 480) {
y += bulletSpeed * GamePanel.delta;
drawBullet(g);
}
break;
}
}
}
任何帮助都会很棒!非常感谢!
最佳答案
编辑我刚刚读到你只有四个方向。在这种情况下,您不需要方向 vector 。只需设定一次方向即可。好的,代码示例。
首先是游戏循环。在游戏循环中添加要更新的已发射子弹。每发发射的子弹都会在其方向 vector 上移动。
private void gameUpdate() {
if (!paused && !gameOver) {
movePlayer();
foreach(Bullet bullet : player.getFiredBullets(){
bullet.moveInDirection();
}
}
}
还有你的 Bullet 类:
public class Bullet {
private Direction direction;
private float speed = 1.2f;
private int x;
private int y;
public Bullet(int x, int y){
this.x =x;
this.y=y;
}
public void launchBullet(Direction direction){
this.direction=direction;
}
public void moveInDirection() {
//move the bullet with speed in the set direction. Same as you already have but without the while loop.
}
}
所以玩家应该有一个方法 fire。这将创建带有玩家位置的子弹。子弹的方向与玩家面对的方向相同。并且项目符号被添加到列表中,因此它将在每个游戏循环中更新。
public class Player {
private List<Bullet> firedBullets = new ArrayList<Bullet>();
public void fire(){
Bullet bullet = new Bullet(playerX, playerY);
firedbullets.add(bullet);
bullet.launch(direction); //this should be calculated by which direction the player is facing.
}
}
因此,当子弹发射时,方向就会设定一次。每次游戏更新时,子弹都会按照子弹的速度朝这个方向移动。此逻辑可用于游戏中必须移动的所有内容。例如,如果您想要一颗子弹在半空中改变方向,您只需在半空中改变其方向即可。
关于Java游戏: Shooting Bullets,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28656799/
我对使用 Java 制作游戏(有点)陌生。我之前创建了一些简单的游戏,例如包收集游戏,但现在我想制作一个自上而下的僵尸射击游戏。我已经有了一个可以移动的球员,但现在我想实现射击。 问题是我不确定如何制
有人知道如何创建一个嵌套表格 View ,当在 iOS 中点击时,嵌套表格会“射出并减速”吗? ( objective-c ) 我正在考虑类似这样的动画:http://dl.dropbox.com/u
尝试将此框设置为全屏动画,但因为我在动画开始前将位置设置为固定,所以框会向上移动到左上角。 有没有办法让它从起始位置展开? setTimeout(function() { $('.test').c
系列文章目录 前言 🍇一、游戏:射击敌人(Game: Shoot the enemy) 让我们用目前所学的一切来创建一个简单的游戏。你可以随心所欲地阅读关于编程和制作游戏的书籍,但要真正学会,你必须
我正在用 C# 编写一个简单的 raytracer/raycaster。我过去曾使用过 Vectors,所以我编写了一个名为 Vector3D 的类,如您在下面的代码中所见。我还写了一个类来处理光线。
您好,我对编程相当陌生,这是我第一次在这里发帖,因此我们将不胜感激,因此:我的问题是,我正在尝试用java创建某种2D射击游戏,但我不知道我的简单游戏循环是否良好,因为当我发射导弹时,它每20毫秒发射
我正在使用 Libgdx:我有一个 Sprite ,它应该在触摸屏幕时射出一个球。 touchPoint 应该定义球的方向。我不知道如何以正确的方向旋转和射击。 public void update(
有没有办法在两者之间添加延迟;this.bullets.push(this.ship.shoot()); if (this.mscore >= 1000) { if (input.isPresse
我一直在尝试在我的游戏中实现触摸控制。我有一个方向键和一个重新加载按钮,我正在尝试更改不透明度并确定方向键上的方向(我想我已经放下了),但是您还必须点击才能射击。我正在努力弄清楚如何在点击屏幕上其他地
这是我的代码: func bombTowerTurnShoot() { var prevDistance:CGFloat = 1000000 var closesetZombie =
在我的 2d 游戏中,我想创建一个可以向玩家“射击”的智能机器人。假设我可以传递给我的机器人: actual xEnemy, yEnemy also enemy speed and angle dir
我正在开发一款俯视射击 HTML5 游戏。我目前正在尝试让子弹从我的 Angular 色面向 Angular 发射。 我的 Angular 色总是面向鼠标位置(旋转)。因此,当我发射子弹时,我需要考虑
我想模糊快速移动节点的运动。我应该看起来它在运动后消失了。有没有一些简单的解决方案来归档这个? 它应该看起来像这个 Action : 提前致谢! 更新 我试着每 0.0X 秒调用一次: for ch
我正在尝试使用 Python 构建一个自动化程序,使用 Opencv 来检测给定的颜色并使用 pyautogui 来实现自动化。我尝试使用 pyautogui 在游戏中移动光标但没有用。使用另一个库
编辑:问题已解决。我忘了把 Math.toRadians() 放在我做 Math.cos 或 Math.sin 的任何地方。 :) 我正在开发一款简单的 Java 2D 游戏,其中包含两辆发射导弹并在
我正在尝试使用适用于 iOS 的 Olympus Camera Kit(版本 1.1.0)制作捕捉程序。我想在拍摄后尽快获得原始尺寸的拍摄图像。 我知道可以在播放模式下传输原始图像,但是将运行模式从记
我可以循环程序,但每次输入一个值时,它都会返回 2 个值,用户获胜和用户失败。我尝试过使用多种方法并创建一个新类作为测试器,但在弄清楚逻辑时遇到了一些问题。至于循环,我尝试过使用 for 循环、whi
我需要帮助想出一些方法来让新生成的敌方舰艇都发射子弹。问题是我实际上不知道该怎么做。我尝试使用可变计时器,但是它只能射出一条直线,而且我无法真正控制它产生的位置。 Game Picture: Ther
我正在努力提高电子邮件的响应能力,但似乎遇到了一些问题,无法将 iPhone 4、5、6、6+ 的样式与 Android 2.3 或 iPhone 3 等样式区分开来。具体来说,我想要某些宽度要求取决
如解释here我需要稍微修改标题中列出的按钮的 Action /行为。我想避免像一些帖子建议的那样构建一个新的图像选择器覆盖。我只需要将对我的一种方法的调用添加到默认操作中。有没有一种简单的方法可以做
我是一名优秀的程序员,十分优秀!