将图像添加到框架,而不是中心,但应该是.. +游戏编程一般
问题描述:
我刚开始学习游戏编程,在大学里参加了一个学期的课程,所以我认为即时通讯准备就绪,我真的很想这样做,所以首先: 1)什么可能是良好的学习资源? Ive googlef很多,并有两本书:Java的杀手游戏编程和开始Java SE6游戏编程。一个是过于具体而不是同时具体的,另一个解释得很少,所以它很难理解什么是什么。 Esspecialy渲染,缓冲区,如何渲染小程序,框架和面板。任何帮助将大大appriciated;)谢谢!将图像添加到框架,而不是中心,但应该是.. +游戏编程一般
伊夫writen一个非常基本的代码,来移动一个盒子,一切都很好,但在中间的盒子不是一样应该是:
对象:
package milk;
public class Thing
{
double x,y;
Shape shape;
int[] thingx={-5,5,5,-5};
int[] thingy={5,5,-5,-5};
Thing(double x, double y)
{
setX(x);
setY(y);
setShape();
}
public void setX(double x)
{
this.x=x;
}
public void setY(double y)
{
this.y=y;
}
public void setShape()
{
this.shape=new Polygon(thingx,thingy,thingx.length);
}
public double getX()
{
return x;
}
public double getY()
{
return y;
}
public Shape getShape()
{
return shape;
}
public void incX(int i)
{
this.x+=i;
}
public void incY(int i)
{
this.y+=i;
}
}
面板:
package milk;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.AffineTransform;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class MilkPanel extends JPanel implements Runnable, KeyListener{
Thread animator;
Graphics2D g2d;
Thing thing=new Thing(320,240);
AffineTransform identity = new AffineTransform();
MilkPanel()
{
setSize(640,480);
setBackground(Color.black);
setFocusable(true);
requestFocus();
addKeyListener(this);
}
public void addNotify()
{
super.addNotify();
animator = new Thread(this);
animator.start();
}
public void paint(Graphics g)
{
g2d=(Graphics2D)g;
g2d.setColor(Color.black);
g2d.fillRect(0, 0, getSize().width,getSize().height);
drawThing();
g.dispose();
}
public void drawThing()
{
g2d.setTransform(identity);
g2d.translate(thing.getX(), thing.getY());
g2d.setColor(Color.orange);
g2d.draw(thing.getShape());
}
public void run()
{
while(true)
{
try
{
Thread.sleep(20);
}
catch(Exception e)
{
}
repaint();
}
}
public void keyPressed(KeyEvent e)
{
int key=e.getKeyCode();
switch(key)
{
case KeyEvent.VK_UP:
thing.incY(-5);
break;
case KeyEvent.VK_DOWN:
thing.incY(5);
break;
case KeyEvent.VK_RIGHT:
thing.incX(5);
break;
case KeyEvent.VK_LEFT:
thing.incX(-5);
break;
}
}
public void keyReleased(KeyEvent e) { }
public void keyTyped(KeyEvent e) { }
}
主要:
package milk;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JFrame;
@SuppressWarnings("serial")
public class MilkIt extends JFrame {
public MilkIt() {
add(new MilkPanel());
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(640,480);
setLocationRelativeTo(null);
setVisible(true);
}
public static void main(String[] args) {
new MilkIt();
}
}
答
看起来您已将框的位置设置为点(320,240),这确实是(640,480)的一半。然而,物体的X,Y位置实际上是它的最后一个角落。此外,您可能希望制定一种通用的设置方法,而不是对其进行硬编码。
如果你想在一个给定的轴上找到一个物体的中心位置(这适用于X,Y或Z,无论你是2D还是3D(或者更多!?)),你想花一半它的大小在该轴上,并且如果从它的位置(实际上是一个角落)减去;结果将是中心。
你要找的算法基本上是这样的:
xPos = (screenXSize/2) - (xSize/2);
yPos = (screenYSize/2) - (ySize/2);
要规范它更进一步,多少维度你使用考虑把你的变量数组基础上 - 那么我说一下使用无论您在做什么,2D或3D都会自动应用(您甚至可以在同一游戏中混合搭配2D和3D元素,因为某些原因常见)。
for (int i = 0; i < DIMENSIONS; i++) {
pos[i] = (screenSize[i]/2) - (size[i]/2);
}
谢谢队友;)完美的工作,现在我可以继续前进。 – MustSeeMelons