java相机开发_java – 2D游戏相机逻辑

我正在尝试为我正在制作的2D游戏实现一个摄像头……目标是让摄像头将玩家保持在中心位置,将精灵保持在相对于摄像头的位置.

为了获得normalocity’s post的悬念,我尝试通过制作一个Camera Test项目开始简单,在那里我通过将一个精灵绘制到一个JPanel来模拟一个相机,并移动一个“相机”对象(这是JPanel)并设置精灵的x,y相对于那个.

正如我所说,相机是JPanel ……我添加了一个“世界”,这是一个x,y为0,0,w = 1000,h = 1000的类.我已经包含了精灵相对于世界的位置以及相机.当我向上移动相机时,精灵向下移动,玩家按预期保持在中间位置.

但是,如果我继续按下,精灵似乎继续掠过自己.

我的问题是:

>根据以下代码,我是否正在实施相机?

>为什么精灵开始在那里画画呢?它应该从viewPort / JPanel中消失

谢谢!

现在添加了PaintComponent(g),我的JPanel bg灰色颜色现在滑落了.这应该发生吗?

编辑:我的节目的SSCCE:

主类:

import java.awt.Dimension;

import java.awt.Toolkit;

import javax.swing.JFrame;

@SuppressWarnings("serial")

public class MainSSCCE extends JFrame {

static MainSSCCE runMe;

public MainSSCCE() {

JFrame f = new JFrame("Camera Test");

CameraSSCCE cam = new CameraSSCCE(0, 0, 500, 500);

f.add(cam);

f.setSize(cam.getWidth(), cam.getHeight());

f.setVisible(true);

f.setResizable(false);

f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

Dimension screensize = Toolkit.getDefaultToolkit().getScreenSize();

f.setLocation( (screensize.width - f.getWidth())/2,

(screensize.height - f.getHeight())/2-100 );

}

public static void main(String[] args) {

runMe = new MainSSCCE();

}

}

相机类:

import java.awt.Color;

import java.awt.Graphics;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import javax.swing.JPanel;

//Camera is the JPanel that will draw all objects... each object location will be in relation to the World

public class CameraSSCCE extends JPanel implements KeyListener {

//add world to camera...

private static final long serialVersionUID = 1L;

private int camX, camY, camH, camW;

private SpriteSSCCE sprite;

private PlayerSSCCE player;

private WorldSSCCE world;

public CameraSSCCE(int x, int y, int w, int h) {

camX = x;

camY = y;

camW = w;

camH = h;

sprite = new SpriteSSCCE(this, 300, 300, 20, 20);

player = new PlayerSSCCE(this, camW/2, camH/2, 25, 40);

world = new WorldSSCCE(this, 0, 0, 1000, 1000);

addKeyListener(this);

setFocusable(true);

}

public int getWidth() {

return camW;

}

public int getHeight() {

return camH;

}

@Override

protected void paintComponent(Graphics g) {

super.paintComponent(g);

//cam is 500 x 500

g.setColor(Color.gray);

g.fillRect(camX, camY, camW, camH);

//draw sprite at JPanel location if in camera sight

if (((sprite.getX()-camX) >= camX) && ((sprite.getX()-camX) <= (camX+camW)) && ((sprite.getY()-camY) >= camY) && ((sprite.getY()-camY) <= (camY+camH))) {

g.setColor(Color.green);

g.fillRect(sprite.getX()-camX, sprite.getY()-camY, 20, 20);

//Cam Sprite Location

g.setColor(Color.white);

g.drawString("Camera Sprite Location: (" + (sprite.getX()-camX) + ", " + (sprite.getY()-camY) + ")", sprite.getX()-camX, sprite.getY()-camY);

}

//Player location (center of Camera... Camera follows player)

g.setColor(Color.cyan);

g.fillRect(player.getX()-player.getWidth(), player.getY()-player.getWidth(), player.getWidth(), player.getHeight());

g.setColor(Color.white);

//World Sprite Location

g.drawString("World Sprite Location: (" + sprite.getX() + ", " + sprite.getY() + ")", sprite.getX(), sprite.getY());

//Cam Player Location

g.drawString("Cam Player Location: (" + (camW/2-player.getWidth()) + ", " + (camH/2-player.getHeight()) + ")", camW/2-player.getWidth(), camH/2-player.getHeight());

}

public void keyPressed(KeyEvent e) {

//move camera right in relation to World

if (e.getKeyCode() == KeyEvent.VK_RIGHT) {

camX+=5;

}

//move camera left in relation to World

if (e.getKeyCode() == KeyEvent.VK_LEFT) {

camX-=5;

}

//move camera up in relation to World

if (e.getKeyCode() == KeyEvent.VK_UP) {

camY-=5;

}

//move camera down in relation to World

if (e.getKeyCode() == KeyEvent.VK_DOWN) {

camY+=5;

}

repaint();

}

public void keyReleased(KeyEvent e) {}

public void keyTyped(KeyEvent e) {}

}

世界级:

public class WorldSSCCE {

private int x, y, w, h;

private CameraSSCCE camera;

public WorldSSCCE(CameraSSCCE cam, int x, int y, int w, int h) {

camera = cam;

this.x = x;

this.y = y;

this.w = w;

this.h = h;

}

public int getX() {

return this.x;

}

public int getY() {

return this.y;

}

public int getWidth() {

return this.w;

}

public int getHeight() {

return this.h;

}

}

玩家类:

import java.awt.Dimension;

public class PlayerSSCCE {

private int x, y, w, h;

private CameraSSCCE cam;

public PlayerSSCCE(CameraSSCCE cm, int x, int y, int w, int h) {

cam = cm;

this.x = x;

this.y = y;

this.w = w;

this.h = h;

}

public int getX() {

return this.x;

}

public int getY() {

return this.y;

}

public int getWidth() {

return this.w;

}

public int getHeight() {

return this.h;

}

public void setX(int val) {

this.x += val;

}

public void setY(int val) {

this.y += val;

}

}

精灵类:

import java.awt.Color;

import java.awt.Graphics;

public class SpriteSSCCE {

private int xLoc, yLoc, width, height;

private CameraSSCCE world;

public SpriteSSCCE(CameraSSCCE wld, int x, int y, int w, int h) {

xLoc = x;

yLoc = y;

width = w;

height = h;

world = wld;

}

public int getX() {

return xLoc;

}

public int getY() {

return yLoc;

}

public int getWidth() {

return width;

}

public int getHeight() {

return height;

}

public void paintComponent(Graphics g) {

g.setColor(Color.green);

g.fillRect(xLoc, yLoc, width, height);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值