相关疑难解决方法(0)

我应该用什么来显示游戏图形?

我有一个游戏系统但我不知道应该用它来显示它.我正在制作一个垂直射击游戏,我已经为所有控制敌人和玩家的课程编写了方法,但我不知道如何有效地展示游戏.我在想Canvas,它会重绘每一帧,但这真的是最有效的方法吗?

重要细节:

  1. 理想帧率:25fps
  2. 这是一场2D游戏
  3. 屏幕上任何时候都有25到100个对象,所有这些对象都在移动
  4. 显示的所有对象都是图像,均为PNG格式
  5. 窗口是640px×480px
  6. 现在所有的图像都被加载为BufferedImage,虽然我可以很容易地改变它

我需要一个坐标平面.如果不完全重构我的代码,这是唯一无法改变的基本部分.

最重要的是我拥有的一切设置方式,每帧的所有对象的移动,并在一个坐标平面上我设计的互动(带冲突检测和运动,没有图形组件的交易),那么一切都应该得到画到屏幕上,只需要去通过ArrayLists跟踪所有移动的对象并逐个绘制它们.

java graphics

8
推荐指数
1
解决办法
1万
查看次数

如何检测JFrame窗口最小化和最大化事件?

有没有办法让JFrame对象的事件监听器检测用户何时单击窗口最大化或最小化按钮?

我使用JFrame对象如下:

JFrame frame = new JFrame("Frame");

java swing awt jframe windowlistener

8
推荐指数
3
解决办法
2万
查看次数

窗口的内容在最小化时消失

我有一个简单的类,当鼠标拖动时绘制一条线或鼠标按下(释放)时画一个点.

当我最小化应用程序然后恢复它时,窗口的内容消失,除了最后一个点(像素).我知道super.paint(g)每次窗口改变时该方法都会重新绘制背景,但无论我是否使用它,结果似乎都是一样的.它们之间的区别在于,当我不使用它时,窗口上绘制的不仅仅是一个像素,而不是我的所有绘画.我怎样才能解决这个问题?

这是班级.

package painting;

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.JPanel;

class CustomCanvas extends Canvas{   
    Point oldLocation= new Point(10, 10);
    Point location= new Point(10, 10);
    Dimension dimension = new Dimension(2, 2);     
    CustomCanvas(Dimension dimension){  
        this.dimension = dimension;   
        this.init();
        addListeners();
    }    
    private void init(){                     
        oldLocation= new Point(0, 0);
        location= new Point(0, 0);
    }
    public void paintLine(){
        if ((location.x!=oldLocation.x) || (location.y!=oldLocation.y)) {         
            repaint(location.x,location.y,1,1);                                   
        } 
    }
    private void addListeners(){
        addMouseListener(new MouseAdapter(){
            @Override
            public void mousePressed(MouseEvent me){ …
Run Code Online (Sandbox Code Playgroud)

java graphics swing awt paint

6
推荐指数
2
解决办法
1934
查看次数

爪哇塔防导弹计算

我正在尝试开发一个小的java 2d塔防游戏,我遇到了试图计算如何做导弹的问题.经过几个小时的搜索和测试,我更加困惑.

到目前为止我所拥有的是:

  1. 4个案例取决于塔所在位置(NW,NE,SW,SE)
  2. 我需要计算当前目标和导弹来自塔的距离Math.sqrt(x2, x1, y2, y1).
  3. 缩放导弹的x和y.

现在我遇到的问题是如何将导弹的增量x和y缩放到目标,这看起来很逼真.数学不是我的强项,而是在这里展示.下面我展示了我对塔楼SE象限的看法.

public int distanceX, distanceY;
public double sep, scale;

if(xBullet < Screen.mobs[shotMob].x && yBullet < Screen.mobs[shotMob].y){
        distanceX = Screen.mobs[shotMob].x- xBullet;
        distanceY = Screen.mobs[shotMob].y - yBullet;
        sep = Math.sqrt( (distanceX * distanceX) + (distanceY * distanceY));
        scale = // This is the part I am confused about.
        xBullet += distanceX * scale;
        yBullet += distanceY * scale;
Run Code Online (Sandbox Code Playgroud)

java math 2d game-physics

6
推荐指数
1
解决办法
1583
查看次数

带键键的线程

我是Java图形和线程的新手,我正在尝试制作游戏(特别是Pong).这个想法是两个人可以在同一个键盘上玩(即有两个通过不同键控制的拨片).目前,两名球员不能同时移动他们的球拍.

这个问题有方法解决吗?单独的线程是答案吗?

如果可能的话,我希望桨能够同时移动(至少看似).

更新:似乎使用Set<Integer>存储按键是最好的选择.我已经完成了(并且它可以工作),但我想知道是否有任何此代码不在事件调度线程(EDT)上,如果我需要使用SwingUtilities.invokeLater();.这是必要的代码:

private Set<Integer> keysDown = Collections.synchronizedSet(new HashSet<Integer>());

public void keyPressed(KeyEvent e) 
{
    keysDown.add(e.getKeyCode());
}

public void keyReleased(KeyEvent e) 
{    
    keysDown.remove(e.getKeyCode());
}

public void updatePaddlePositions()
{
    if (keysDown.contains(KeyEvent.VK_W)) 
        paddleOne.move(-PADDLE_MOVE_INCREMENT);

    if (keysDown.contains(KeyEvent.VK_S))
        paddleOne.move(PADDLE_MOVE_INCREMENT);

    if (keysDown.contains(KeyEvent.VK_UP))
        paddleTwo.move(-PADDLE_MOVE_INCREMENT);

    if (keysDown.contains(KeyEvent.VK_DOWN))
        paddleTwo.move(PADDLE_MOVE_INCREMENT);

    try {
        Thread.sleep(DELAY);
    } catch (InterruptedException e) {
        System.out.println("You Interrupted the game!");
    }

    canvas.repaint();
}
Run Code Online (Sandbox Code Playgroud)

这是对象的paintComponent方法canvas:

public void paintComponent(Graphics g) 
{
    super.paintComponent(g);
    paddleOne.paint(g);
    paddleTwo.paint(g);
    updatePaddlePositions(); // Does this need to be …
Run Code Online (Sandbox Code Playgroud)

java swing multithreading key-bindings paintcomponent

5
推荐指数
2
解决办法
2570
查看次数

Java/Swing如何处理不同的屏幕DPI和密度设置?

大家好,我最近遇到的问题是,现在有些显示器有不同的DPI设置,有些显示器更密集,例如Apple的Retina显示器.

如何用Java补偿各种监视器上的不同DPI设置和密度?是否可以在任何监视器上将控件缩放为相同的大小.我知道在为Android编程时,所有测量都在"DP"中,您可以为三种不同的显示密度指定不同的图像.

有没有办法可以使用Java/Swing为不同的显示密度选择不同的图像,这样我的应用程序在高密度显示器上看起来并不模糊?或者这不是那么重要或可能吗?我知道Chrome目前没有考虑DPI,但是Internet Explorer和其他应用程序也是如此.

谢谢你的帮助,我是Java开发人员,我以前从未考虑过DPI,并且想知道如何去做它:)

java swing dpi

5
推荐指数
1
解决办法
2872
查看次数

为什么getSize()在这里不能为我工作?为什么在调整大小时闪烁?

这是我第一次尝试使用BufferStrategy,我真的很感激一些提示.

1)为什么在下面的代码中,getSize()在调整窗口大小之前返回0的尺寸?如何立即检测窗口的大小?

2)为什么什么时候getSize()返回的东西不是窗户的全尺寸?IE为什么底部和右边都有一条黑色条带?

3)调整窗口大小时有没有办法摆脱闪烁?

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.image.BufferStrategy;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class BSTest extends JFrame {
    BufferStrategy bs;
    DrawPanel panel = new DrawPanel();

    public BSTest() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(800,420);
        setLocationRelativeTo(null);
        setIgnoreRepaint(true);
        setVisible(true);
        createBufferStrategy(2);
        bs = getBufferStrategy();
        panel.setIgnoreRepaint(true);
        add(panel);
        panel.drawStuff();
    }

    public class DrawPanel extends JPanel {
        public void drawStuff() {
            while(true) {
                try {
                    Graphics2D g = (Graphics2D)bs.getDrawGraphics();
                    g.setColor(Color.BLACK);
                    System.out.println("W:"+getSize().width+", H:"+getSize().height);
                    g.fillRect(0,0,getSize().width,getSize().height);
                    bs.show();
                    g.dispose();
                    Thread.sleep(20);
                } catch (Exception e) { System.exit(0); …
Run Code Online (Sandbox Code Playgroud)

java swing doublebuffered

4
推荐指数
1
解决办法
1844
查看次数

Java Swing:在JPanel的组件下绘画?

我有一个JPanel,里面有一个按钮.按钮的位置无关紧要.该paint(Graphics g)代码是:

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        /* drawing code */
    }

如果我想用黑色矩形填充面板的整个空间,同时在面板中也有按钮,填充的矩形将简单地覆盖所有内容.因此,按钮周围没有按钮然后是黑色,整个面板都是黑色的.

有没有办法修改面板或绘画程序,以便在自定义绘画的顶部绘制组件?

我试图把super.paint(g)绘画结束,如:

    @Override
    public void paint(Graphics g) {
        /* drawing code */
        super.paint(g);
    }

......以为它会首先进行自定义绘画,然后简单地将组件放在它上面.但是,如果这样做,自定义绘画将完全消失,只显示按钮.也就是说,只有一个按钮和一个白色(默认)背景而不是黑色矩形.

有任何想法吗?

谢谢!

编辑:我想澄清黑色矩形是一个例子.我知道我可以简单地设置背景颜色,但我想最终能够做任何我想要的自定义绘画.

java swing components paint jpanel

4
推荐指数
2
解决办法
3446
查看次数

仅在窗口调整大小完成后重新绘制JPanel

我有一个JPanel,我在上面画了四个矩形.随机选择这些矩形中的每一个的颜色.仅当用户单击特定矩形时,颜色才会更改.

问题是,当用户调整窗口大小时,JPanel上的所有内容都会重复"重新绘制".这导致矩形快速改变颜色.

理想情况下,在调整大小时,我需要矩形的颜色保持不变.否则,我还可以使用一个解决方案,在完成调整大小后,JPanel只重画一次.

您对我如何实现这一点有什么一般性的想法吗?如果ComponentListener中有onStartResize和onFinishResize回调方法,我觉得这样会容易得多.

谢谢!

java swing resize jpanel repaint

3
推荐指数
2
解决办法
6549
查看次数

删除frame.add(Component)时,组件必须是有效的对等方

我这里有这个代码用于创建像素数组并将其绘制到图像中:

import javax.swing.JFrame;
import java.awt.Canvas;
import java.awt.Graphics;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;
import java.awt.image.DataBufferInt;

public class test extends Canvas implements Runnable {

    private static final long serialVersionUID = 1L;
    public static int WIDTH = 800;
    public static int HEIGHT = 600;
    public boolean running = true;
    public int[] pixels;
    public BufferedImage img;
    public static JFrame frame;
    private Thread thread;

    public static void main(String[] arg) {
        test wind = new test();
        frame = new JFrame("WINDOW");
        frame.add(wind);
        frame.setVisible(true);
        frame.setSize(WIDTH, HEIGHT);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        wind.init();
    } …
Run Code Online (Sandbox Code Playgroud)

java swing bufferedimage awt

3
推荐指数
1
解决办法
4630
查看次数