将图像添加到框架,而不是中心,但应该是.. +游戏编程一般

问题描述:

我刚开始学习游戏编程,在大学里参加了一个学期的课程,所以我认为即时通讯准备就绪,我真的很想这样做,所以首先: 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); 
} 
+0

谢谢队友;)完美的工作,现在我可以继续前进。 – MustSeeMelons