- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好吧,我正在基于游戏 CS:GO 创建一个简单的瞄准游戏,并且我一直遇到有关主菜单的创建和 MouseListener 的使用的问题。这是包含游戏状态枚举的 Game 类:
/*
* This code is protected under the Gnu General Public License (Copyleft), 2005 by
* IBM and the Computer Science Teachers of America organization. It may be freely
* modified and redistributed under educational fair use.
*/
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.Timer;
/**
* An abstract Game class which can be built into Pong.<br>
* <br>
* The default controls are for "Player 1" to move left and right with the
* 'Z' and 'X' keys, and "Playr 2" to move left and right with the 'N' and
* 'M' keys.<br>
* <br>
* Before the Game begins, the <code>setup</code> method is executed. This will
* allow the programmer to add any objects to the game and set them up. When the
* game begins, the <code>act</code> method is executed every millisecond. This
* will allow the programmer to check for user input and respond to it.
*
* @see GameObject
*/
public abstract class Game extends JFrame {
private boolean _isSetup = false;
private boolean _initialized = false;
private ArrayList _ObjectList = new ArrayList();
private static Timer _t;
public static enum STATE{
MENU,
MENU1,
GAME
};
public static STATE State = STATE.MENU;
//
/**
* <code>true</code> if the 'Z' key is being held down
*/
private boolean p1Left = false;
/**
* <code>true</code> if the 'X' key is being held down.
*/
private boolean p1Right = false;
/**
* <code>true</code> if the 'N' key is being held down.
*/
private boolean p2Left = false;
/**
* <code>true</code> if the 'M' key is being held down.
*/
private boolean p2Right = false;
/**
* Returns <code>true</code> if the 'Z' key is being pressed down
*
* @return <code>true</code> if the 'Z' key is being pressed down
*/
public boolean RKeyPressed() {
return p1Left;
}
/**
* Returns <code>true</code> if the 'X' key is being pressed down
*
* @return <code>true</code> if the 'X' key is being pressed down
*/
public boolean XKeyPressed() {
return p1Right;
}
/**
* Returns <code>true</code> if the 'N' key is being pressed down
*
* @return <code>true</code> if the 'N' key is being pressed down
*/
public boolean NKeyPressed() {
return p2Left;
}
/**
* Returns <code>true</code> if the 'M' key is being pressed down
*
* @return <code>true</code> if the 'M' key is being pressed down
*/
public boolean MKeyPressed() {
return p2Right;
}
/**
* When implemented, this will allow the programmer to initialize the game
* before it begins running
*
* Adding objects to the game and setting their initial positions should be
* done here.
*
* @see GameObject
*/
public abstract void setup();
/**
* When the game begins, this method will automatically be executed every
* millisecond
*
* This may be used as a control method for checking user input and
* collision between any game objects
*/
public abstract void act();
/**
* Sets up the game and any objects.
*
* This method should never be called by anything other than a <code>main</code>
* method after the frame becomes visible.
*/
public void initComponents() {
getContentPane().setBackground(Color.black);
setup();
for (int i = 0; i < _ObjectList.size(); i++) {
GameObject o = (GameObject)_ObjectList.get(i);
o.repaint();
}
_t.start();
}
/**
* Adds a game object to the screen
*
* Any added objects will have their <code>act</code> method called every
* millisecond
*
* @param o the <code>GameObject</code> to add.
* @see GameObject#act()
*/
public void add(GameObject o) {
_ObjectList.add(o);
getContentPane().add(o);
}
/**
* Removes a game object from the screen
*
* @param o the <code>GameObject</code> to remove
* @see GameObject
*/
public void remove(GameObject o) {
_ObjectList.remove(o);
getContentPane().remove(o);
}
/**
* Sets the millisecond delay between calls to <code>act</code> methods.
*
* Increasing the delay will make the game run "slower." The default delay
* is 1 millisecond.
*
* @param delay the number of milliseconds between calls to <code>act</code>
* @see Game#act()
* @see GameObject#act()
*/
public void setDelay(int delay) {
_t.setDelay(delay);
}
/**
* Sets the background color of the playing field
*
* The default color is black
*
* @see java.awt.Color
*/
public void setBackground(Color c) {
getContentPane().setBackground(c);
}
/**
* The default constructor for the game.
*
* The default window size is 400x400
*/
public Game() {
setSize(1280, 720);
getContentPane().setBackground(Color.BLACK);
getContentPane().setLayout(null);
JMenuBar menuBar = new JMenuBar();
JMenu menuFile = new JMenu("File");
JMenuItem menuFileExit = new JMenuItem("Exit");
menuBar.add(menuFile);
menuFile.add(menuFileExit);
setJMenuBar(menuBar);
setTitle("Mid Peek");
addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent e)
{
if (e.getKeyCode() == KeyEvent.VK_ENTER)
{
System.out.println("ENTER key pressed");
State=STATE.GAME;
startGame();
}
}
});
// Add window listener.
addWindowListener (
new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
);
menuFileExit.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
System.exit(0);
}
}
);
_t = new Timer(1, new ActionListener() {
public void actionPerformed(ActionEvent e) {
act();
for (int i = 0; i < _ObjectList.size(); i++) {
GameObject o = (GameObject)_ObjectList.get(i);
o.act();
}
}
});
addKeyListener(new KeyListener() {
public void keyTyped(KeyEvent e) {
}
public void keyPressed(KeyEvent e) {
char pressed = Character.toUpperCase(e.getKeyChar());
switch (pressed) {
case 'Z' : p1Left = true; break;
case 'X' : p1Right = true; break;
case 'N' : p2Left = true; break;
case 'M' : p2Right = true; break;
}
}
public void keyReleased(KeyEvent e) {
char released = Character.toUpperCase(e.getKeyChar());
switch (released) {
case 'Z' : p1Left = false; break;
case 'X' : p1Right = false; break;
case 'N' : p2Left = false; break;
case 'M' : p2Right = false; break;
}
}
});
}
/**
* Starts updates to the game
*
* The game should automatically start.
*
* @see Game#stopGame()
*/
public static void startGame() {
_t.start();
}
/**
* Stops updates to the game
*
* This can act like a "pause" method
*
* @see Game#startGame()
*/
public void stopGame() {
_t.stop();
}
/**
* Displays a dialog that says "Player 1 Wins!"
*
*/
public void p1Wins() {
_WinDialog d = new _WinDialog(this, "Player 1 Wins!");
d.setVisible(true);
}
/**
* Displays a dialog that says "Player 2 Wins!"
*
*/
public void p2Wins() {
_WinDialog d = new _WinDialog(this, "Player 2 Wins!");
d.setVisible(true);
}
/**
* Gets the pixel width of the visible playing field
*
* @return a width in pixels
*/
public int getFieldWidth() {
return getContentPane().getBounds().width;
}
/**
* Gets the pixel height of the visible playing field
*
* @return a height in pixels
*/
public int getFieldHeight() {
return getContentPane().getBounds().height;
}
class _WinDialog extends JDialog {
JButton ok = new JButton("OK");
_WinDialog(JFrame owner, String title) {
super(owner, title);
Rectangle r = owner.getBounds();
setSize(200, 100);
setLocation(r.x + r.width / 2 - 100, r.y + r.height / 2 - 50);
getContentPane().add(ok);
ok.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
_WinDialog.this.setVisible(false);
}
});
}
}
}
下面是实际的编码,因为 Game 类取自 Pong 游戏示例:
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.PointerInfo;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
public class GlobalOffensive extends Game{
JLabel rifleOverlay;
JLabel rifleShooting1;
JLabel rifleShooting2;
JLabel pistolOverlay;
JLabel pistolShooting1;
JLabel pistolShooting2;
JLabel backImage;
JLabel Terrorist;
JLabel menu1;
static JLabel open = new JLabel();
private static Menu menu;
private static int timer = 0;
Player p;
Terrorists t;
Terrorists t1;
Terrorists t2;
Terrorists t3;
Terrorists t4;
private static int spawnLimit = 1;
private static int numBots = 0;
private static int spawnTime;
MouseEvent e;
public void setup(){
menu = new Menu();
ImageIcon menu = new ImageIcon("menu1.jpg");
menu1 = new JLabel(menu);
menu1.setSize(1280, 720);
if (State==STATE.MENU || State==STATE.MENU1){
add(menu1);
}
if (State==STATE.GAME){
p = new Player(4, 3);
t = new Terrorists();
//t1 = new Terrorists(100,50);
//t2 = new Terrorists(100,50);
//t3 = new Terrorists(100,50);
//t4 = new Terrorists(100,50);
ImageIcon background = new ImageIcon("DustMid.jpg");
ImageIcon overlay = new ImageIcon("m414mask.png");
ImageIcon bot = new ImageIcon("Terrorist");
Toolkit toolkit = Toolkit.getDefaultToolkit();
Image image = toolkit.getImage("Crosshair.png");
//Creating bot
Terrorist = new JLabel(bot);
Terrorist.setSize(50,100);
add(Terrorist);
//Creating the gun overlay and setting the background
rifleOverlay = new JLabel(overlay);
rifleOverlay.setSize(1280,720);
add(rifleOverlay);
backImage = new JLabel(background);
backImage.setSize(1280, 720);
add(backImage);
//setting the cursor to the cross hair when it is over the background image or the overlay
backImage.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
Cursor c = toolkit.createCustomCursor(image , new Point(backImage.getX(),
backImage.getY()), "Crosshair");
backImage.setCursor (c);
rifleOverlay.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
Cursor d = toolkit.createCustomCursor(image , new Point(rifleOverlay.getX(),
rifleOverlay.getY()), "Crosshair");
rifleOverlay.setCursor (d);
//ImageIcon rifleShooting = new ImageIcon("rifleShooting2.png");
//rifleShooting2 = new JLabel(rifleShooting);
//rifleShooting2.setSize(1280, 720);
//add(rifleShooting2);
}
}
public void act(){
if (State==STATE.GAME){
setDelay(10);
PointerInfo a = MouseInfo.getPointerInfo();
Point b = a.getLocation();
int x = (int) b.getX();
int y = (int) b.getY();
//Rifle follows mouse movement
if (x != 0){
rifleOverlay.setLocation(x-700, 0);
repaint();
}
//Spawn bot
if (numBots <= spawnLimit && timer%60 == 0){
t.spawn();
numBots += 1;
System.out.println("Bot spawned");
spawnTime = timer;
Terrorist.setLocation(549, 404);
repaint();
}
//Shoots the player after set amount of time
if ((timer - spawnTime)%200 == 0){
t.shoots(p);
System.out.println("Bot fired");
}
//Bot disappears after set amount of time
if ((timer - spawnTime)%210 == 0){
System.out.println("Bot ran away");
t.lifeTime(t);
}
//Ammo
if (p.getCurrentAmmo() == 0){
p.reload();
System.out.println("Out of Ammo");
}else if (p.getCurrentAmmo() > 0){
//To fire bullet
if (XKeyPressed() == true){
p.shotsFired(true);
System.out.println("Player fired");
//if(XKeyPressed() == false){
// p.shotsFired(false);
//}
//rifleShooting2.setLocation(x-700, 0);
//repaint();
}
}else if (RKeyPressed() == true){
p.reload();
}
Robot r = null;
try {
r = new Robot();
} catch (AWTException e1) {
// TODO Auto-generated catch block
System.out.println("An error of sorts");
e1.printStackTrace();
}
//If terrorist fires, player takes damage
//if (t.shoots(p) == true){
// p.health(true);
//}
//Game ends if player dies
if (p.dies() == true){
stopGame();
}
timer ++;
}
}
public static void main(String[] args) {
GlobalOffensive p = new GlobalOffensive();
p.initComponents();
p.pack();
p.setVisible(true);
p.setSize(1280, 720);
p.getContentPane().setBackground(Color.BLACK);
}
}
//Spawn location coordinates
//404y
//549x
//526y
//1133x
//301y
//297x
//413
//696
最佳答案
MouseInfo
不是监视鼠标 Activity 的最佳选择,它提供屏幕坐标中的位置,而不是本地/组件坐标,这真的会让您感到困惑。
相反,您应该使用注册到您有兴趣管理的组件的 MouseListener
(也可能是 MouseMotionListener
,具体取决于您的需要)。
参见How to Write a Mouse Listener了解更多详情。
MouseListener
会自动将鼠标坐标转换为本地(组件)上下文,以便顶部/左侧位置为 0x0
。当有事情发生时它也会告诉你,所以你不需要不断地轮询信息
相反,我会拥有一个 JFrame
,可能使用 CardLayout
一个“菜单”面板和一个“游戏”面板。这样,您可以分离两者的功能并将责任隔离到它们自己的类中。
我认为您还会发现键绑定(bind) API 比 KeyListener
工作更可靠。请参阅How to Use Key Bindings
关于java - 使用鼠标监听器创建主菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30881055/
前言: 有时候,一个数据库有多个帐号,包括数据库管理员,开发人员,运维支撑人员等,可能有很多帐号都有比较大的权限,例如DDL操作权限(创建,修改,删除存储过程,创建,修改,删除表等),账户多了,管理
所以我用 Create React App 创建并设置了一个大型 React 应用程序。最近我们开始使用 Storybook 来处理和创建组件。它很棒。但是,当我们尝试运行或构建应用程序时,我们不断遇
遵循我正在创建的控件的代码片段。这个控件用在不同的地方,变量也不同。 我正在尝试编写指令来清理代码,但在 {{}} 附近插入值时出现解析错误。 刚接触 Angular ,无法确定我错过了什么。请帮忙。
我正在尝试创建一个 image/jpeg jax-rs 提供程序类,它为我的基于 post rest 的 Web 服务创建一个图像。我无法制定请求来测试以下内容,最简单的测试方法是什么? @POST
我一直在 Windows 10 的模拟器中练习 c。后来我改用dev C++ IDE。当我在 C 中使用 FILE 时。创建的文件的名称为 test.txt ,而我给出了其他名称。请帮助解决它。 下面
当我们创建自定义 View 时,我们将 View 文件的所有者设置为自定义类,并使用 initWithFrame 或 initWithCode 对其进行实例化。 当我们创建 customUITable
我正在尝试为函数 * Producer 创建一个线程,但用于创建线程的行显示错误。我为这句话加了星标,但我无法弄清楚它出了什么问题...... #include #include #include
今天在做项目时,遇到了需要创建JavaScript对象的情况。所以Bing了一篇老外写的关于3种创建JavaScript对象的文章,看后跟着打了一遍代码。感觉方法挺好的,在这里与大家分享一下。 &
我正在阅读将查询字符串传递给 Amazon 的 S3 以进行身份验证的文档,但似乎无法理解 StringToSign 的创建和使用方式。我正在寻找一个具体示例来说明 (1) 如何构造 String
前言:我对 C# 中任务的底层实现不太了解,只了解它们的用法。为我在下面屠宰的任何东西道歉: 对于“我怎样才能开始一项任务但不等待它?”这个问题,我找不到一个好的答案。在 C# 中。更具体地说,即使任
我有一个由一些复杂的表达式生成的 ILookup。假设这是按姓氏查找人。 (在我们简单的世界模型中,姓氏在家庭中是唯一的) ILookup families; 现在我有两个对如何构建感兴趣的查询。 首
我试图创建一个 MSI,其中包含 和 exe。在 WIX 中使用了捆绑选项。这样做时出错。有人可以帮我解决这个问题。下面是代码: 错误 error LGH
在 Yii 中,Create 和 Update 通常使用相同的形式。因此,如果我在创建期间有电子邮件、密码、...other_fields...等字段,但我不想在更新期间专门显示电子邮件和密码字段,但
上周我一直在努力创建一个给定一行和一列的 QModelIndex。 或者,我会满足于在已经存在的 QModelIndex 中更改 row() 的值。 任何帮助,将不胜感激。 编辑: QModelInd
出于某种原因,这不起作用: const char * str_reset_command = "\r\nReset"; const char * str_config_command = "\r\nC
现在,我有以下由 original.df %.% group_by(Category) %.% tally() %.% arrange(desc(n)) 创建的 data.frame。 DF 5),
在今天之前,我使用/etc/vim/vimrc来配置我的vim设置。今天,我想到了创建.vimrc文件。所以,我用 touch .vimrc cat /etc/vim/vimrc > .vimrc 所
我可以创建一个 MKAnnotation,还是只读的?我有坐标,但我发现使用 setCooperative 手动创建 MKAnnotation 并不容易。 想法? 最佳答案 MKAnnotation
在以下代码中,第一个日志语句按预期显示小数,但第二个日志语句记录 NULL。我做错了什么? NSDictionary *entry = [[NSDictionary alloc] initWithOb
我正在使用与此类似的代码动态添加到数组; $arrayF[$f+1][$y][$x+1] = $value+1; 但是我在错误报告中收到了这个: undefined offset :1 问题:尝试创
我是一名优秀的程序员,十分优秀!