我想做一个游戏,有一个图像加载每个级别。我想在photoshop中画出整个关卡,然后把它设为背景,让玩家在上面走过去。我希望另一个看不见的图像去上面,这将是黑色的所有地方,我想碰撞。我不想使用平铺的原因是因为会有复杂的角点,不是所有的东西都是矩形的,因为矩形的碰撞会容易得多。这是个好主意吗?有没有可能很容易做到?这将是一个大的cpuPig或有更好的方法来做到这一点?
slmsl1lt1#
…会有复杂的角,不是所有的东西都是矩形的。这可以通过绘制和处理 Shape 以及 Area 示例。例如黄色是一个小小的动画“播放器”。图像的边界表示包含玩家路径的墙(它从墙上反弹)。不发生碰撞时,障碍物漆成绿色,否则漆成红色。
Shape
Area
import java.awt.*; import java.awt.event.*; import java.awt.geom.*; import java.awt.image.BufferedImage; import javax.swing.*; class ShapeCollision { private BufferedImage img; private Area[] obstacles = new Area[4]; private Area walls; int x; int y; int xDelta = 3; int yDelta = 2; /**A method to determine if two instances of Area intersect */ public boolean doAreasCollide(Area area1, Area area2) { boolean collide = false; Area collide1 = new Area(area1); collide1.subtract(area2); if (!collide1.equals(area1)) { collide = true; } Area collide2 = new Area(area2); collide2.subtract(area1); if (!collide2.equals(area2)) { collide = true; } return collide; } ShapeCollision() { int w = 400; int h = 200; img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); final JLabel imageLabel = new JLabel(new ImageIcon(img)); x = w/2; y = h/2; //circle obstacles[0] = new Area(new Ellipse2D.Double(40, 40, 30, 30)); int[] xTriangle = {330,360,345}; int[] yTriangle = {60,60,40}; //triangle obstacles[1] = new Area(new Polygon(xTriangle, yTriangle, 3)); int[] xDiamond = {60,80,60,40}; int[] yDiamond = {120,140,160,140}; //diamond obstacles[2] = new Area(new Polygon(xDiamond, yDiamond, 4)); int[] xOther = {360,340,360,340}; int[] yOther = {130,110,170,150}; // other obstacles[3] = new Area(new Polygon(xOther, yOther, 4)); walls = new Area(new Rectangle(0,0,w,h)); ActionListener animate = new ActionListener() { @Override public void actionPerformed(ActionEvent e) { animate(); imageLabel.repaint(); } }; Timer timer = new Timer(50, animate); timer.start(); JOptionPane.showMessageDialog(null, imageLabel); timer.stop(); } public void animate() { Graphics2D g = img.createGraphics(); g.setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g.setColor(Color.BLUE); g.fillRect(0, 0, img.getWidth(), img.getHeight()); x+=xDelta; y+=yDelta; int s = 15; Area player = new Area(new Ellipse2D.Double(x, y, s, s)); // Acid test of edge collision; if (doAreasCollide(player,walls)) { if ( x+s>img.getWidth() || x<0 ) { xDelta *= -1; } if(y+s>img.getHeight() || y<0 ) { yDelta *= -1; } } g.setColor(Color.ORANGE); for (Area obstacle : obstacles) { if (doAreasCollide(obstacle, player)) { g.setColor(Color.RED); } else { g.setColor(Color.GREEN); } g.fill(obstacle); } g.setColor(Color.YELLOW); g.fill(player); g.dispose(); } public static void main(String[] args) { Runnable r = new Runnable() { @Override public void run() { new ShapeCollision(); } }; // Swing GUIs should be created and updated on the EDT // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html SwingUtilities.invokeLater(r); } }
让它检测所有的红色,并设置为碰撞边界在启动时,使用平滑锯齿路径问题中看到的源来获得红色像素的轮廓(参见 getOutline(Color target, BufferedImage bi) 方法)。把它储存起来 Area 作为启动的唯一障碍。
getOutline(Color target, BufferedImage bi)
1条答案
按热度按时间slmsl1lt1#
…会有复杂的角,不是所有的东西都是矩形的。
这可以通过绘制和处理
Shape
以及Area
示例。例如黄色是一个小小的动画“播放器”。
图像的边界表示包含玩家路径的墙(它从墙上反弹)。
不发生碰撞时,障碍物漆成绿色,否则漆成红色。
编辑
让它检测所有的红色,并设置为碰撞边界
在启动时,使用平滑锯齿路径问题中看到的源来获得红色像素的轮廓(参见
getOutline(Color target, BufferedImage bi)
方法)。把它储存起来Area
作为启动的唯一障碍。