Articles of 摆动

Java 2D游戏Hitbox检测和圆角

我正在与Java,swing和没有框架的简单的2D游戏。 我有一个矩形玩家,用户可以四处移动。 在地图上,玩家不应该经历的障碍很less。 我为玩家制作了一个新的Rectangle对象,并为每个障碍物设置了边界。 但我不确定这是否是正确的做法。 它的作品,但玩家的动作并不真正的用户友好。 如果玩家想要通过两个障碍物,他们必须在完美的坐标上通过。 用一个Rectangle对象来检查玩家和障碍物之间的交叉点是否是一个好主意,还是应该以另一种方式来做呢? 现在我的第二个问题: 我想用同样的hitboxreplace矩形的hitbox,但是圆角,所以玩家可以更容易的通过。 这是游戏看起来像启用了hitboxes。 检查玩家和障碍物是否相交的代码: for (Player p : this.getPlayerArray()) { Rectangle recPlayer = p.playerBounds(); for (Obstacle kiste : obstacleArray) { Rectangle recKiste = kiste.obstBounds(); if (recPlayer.intersects(recKiste)) { p.setX(100); //Not actual code here } } } 返回玩家/障碍物的hitbox的函数: public Rectangle obstBounds() { return new Rectangle(this.getX(), this.getY(), image.getImage().getWidth(null), image.getImage().getHeight(null)); }

以全屏模式在主游戏屏幕上呈现另一个屏幕

我的游戏以全屏模式运行并使用主动渲染。 graphics在每个游戏循环的全屏窗口中绘制: public void render() { Window w = screen.getFullScreenWindow(); Graphics2D g = screen.getGraphics(); renderer.render(g, level, w.getWidth(), w.getHeight()); g.dispose(); screen.update(); } 这是screen.update()方法: public void update(){ Window w = device.getFullScreenWindow(); if(w != null){ BufferStrategy s = w.getBufferStrategy(); if(!s.contentsLost()){ s.show(); } } } 我想在主游戏屏幕(菜单,库存等)上显示另一个屏幕。 可以说,我有一个JPanel库存,其中有一个库存单元格(手动绘制)和一些像JPopupMenu Swing组件。 所以我试着把它添加到我的窗口中,并在游戏循环中重新绘制,大多数时候工作正常…但是有时面板不会显示。 在库存中盲目移动的东西工作,但它没有显示。 当我alt标签,并返回,它显示正常。 我也尝试在全屏窗口上绘制剩余的库存,并使用JPanel来只显示button和popupmenus。 清单显示正确,但Swing组件保持闪烁。 我猜这是因为我不知道如何结合主动和被动渲染。 public void render() { Graphics2D […]

如何将缓冲区渲染为JPanel?

我正在尝试与Java和Swing做一个小小的游戏。 目前唯一的问题是在JPanel上绘图会导致很多闪烁! 相关代码: JFrame frame = new JFrame("Breakout"); JPanel gameField = (JPanel) frame.getContentPane(); private void gameLoop() { while(running) { update(); render((Graphics2D) gameField.getGraphics()); } } private void render(Graphics2D g) { g.clearRect(0, 0, gameField.getWidth(), gameField.getHeight()); for (GameObject o : objects) { o.draw(g); } } 我已经研究了手动双缓冲(例如,通过制作一个屏幕外的Image ,绘制它,然后做g.drawImage(offscreen) 。还有更好的方法吗?

是否有着色器或至less在Swing中着色?

在那儿? 因为我想知道它是否支持GLSL,HLSL或它自己的着色语言? 我不太了解Swinggraphics。 有人知道吗?

我应该使用哪种Swing控件来渲染graphics?

我正在使用Java中的Swing UI工具包,我想使用Graphics类在控件中绘制图像和网格。 哪一个是最合适的控制?

如何实现像素级碰撞检测?

我正在为练习目的开发一个简单的游戏引擎,我用这样的代码来做碰撞检测(伪代码): bool PhysicalObject.isCollideWith(rect: PhysicalObject) => x + width >= rect.x && rect.y <= y + height && x <= rect.x + rect.width && y <= rect.y + rect.height 但是,这将所有对象视为矩形。 我想要的是当两个对象在像素级别重叠时(我使用java.awt.Graphics绘制我的游戏对象)来检测碰撞。 这样做的最好方法是什么? 我可以创建一个代表每个像素的二维数组,并存储指向相应像素所属的游戏对象的指针吗?

定时器结束后,如何在重复结构中设置标签位置?

我有这段代码。 它在棋盘上移动一个棋子。 while(i<end) { try { Thread.sleep(1000); } catch (Exception e) { System.out.println(e); } Label.setBounds(x+i, y, xsize, ysize); i++; } 我的问题:在所有的时间( end秒)过后,标签只被设置一次。 还试过: 1: while(i<end) { for(int v;v<9999999;v++); Label.setBounds(x+i, y, xsize, ysize); i++; } 2: while(i<end) { for(int v;v<9999999;v++) { Label.setBounds(x+i, y, xsize, ysize); } i++; } 同样的结果。

我不知道为什么我的形状不动

所以我想教我自己如何通过克隆老游戏来用java开发游戏。 目前我正在克隆Pong,我不知道为什么我的桨没有移动。 移动方法应该是每帧更新玩家桨的位置,但不是。 如果有人可以帮助我,这将是伟大的。 还有任何我使用的代码提示,我不应该会被赞赏! (我对这个网站也有点新鲜感,所以请不要批评我是否使用了错误的格式或者不是这样的格式,我只是从社区那里寻求帮助,理解他们比我做得更多) 乒乓球课程: import java.awt.BorderLayout; import javax.swing.JFrame; public class Pong extends JFrame{ public Pong(String title){ super(title); setResizable(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setFocusable(true); requestFocus(); setLayout(new BorderLayout()); add(new GamePanel(this, 35), BorderLayout.CENTER); pack(); setLocationRelativeTo(null); setVisible(true); } public static void main(String[] args){ new Pong("Pong!"); } } GamePanel类: import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.KeyEvent; import […]

Swing游戏开发 – 关于线程

对于那些使用Swing开发他们的实时Java游戏的人。 (平均一个不断更新游戏状态并使用常量循环重画屏幕的游戏)。 正如我所看到的,在Swing中devise游戏有三种主要可能的方法,与线程相关: 1-让整个游戏(特别是长时间运行的任务除外) 在EDT上运行。 2-整个游戏运行在非EDT线程上。 3-在一个线程之间有明确的分离来持续运行游戏逻辑 (一个非EDT线程)和一个不断更新屏幕 (EDT) 的线程 。 根据你的经验和知识,哪种方法是最常见的,和/或最有效的,和/或最合理的编程方式(又不是非常复杂的devise)? 我应该使用哪种方法? 帮助将不胜感激:)(我真的想拿起良好的习惯)。 编辑:澄清 – 即使你不建议Swing游戏开发,请回答我的问题,因为它是。 谢谢

运动空间为什么增加?

这是对我以前的问题的后续问题 。 我得到了我的钥匙持有移动,使用booleanvariables和另一种方法与javax.swing.Timer延迟(谢谢KingDolphin ),但奇怪的是,当我移动我的图标,似乎增加多less像素,它每次移动1.它移动一个像素的第一个keyPressed ,然后两个下一个,然后三个,等等,这可能看起来不多,但是当你移动30+像素,它失去了控制。 我真的不知道如何解决这个问题。 我尝试过改变一些东西,并且“完成了我的作业”(Googlesearch了包括这个和StackOverflow的StackExchange站点),但是没有发现任何与之相关的东西。 这是我的layoutGame和move方法(问题在那里),并感谢您帮助我: private void layoutGame() { JLabel title = new JLabel("Dodge The Enemies!"); Font titleFont = new Font(Font.SERIF, Font.BOLD, 32); title.setFont(titleFont); title.setHorizontalAlignment(JLabel.CENTER); title.setBackground(Color.BLACK); title.setForeground(Color.WHITE); title.setOpaque(true); add(title, BorderLayout.NORTH); JLabel background = new JLabel(); background.setIcon(backDrop); add(background, BorderLayout.CENTER); JLabel you = new JLabel(); you.setBounds(x, y, 50, 50); you.setIcon(new ImageIcon(this.getClass().getClassLoader().getResource("happy.png"))); background.add(you, JLabel.CENTER); JTextPane […]