2012-06-03 40 views
2

我正在试图制作一个android应用程序的相机,通过在触摸屏上拖动来拖动相机。我为我的开发使用了Cocos2D引擎。使用触摸输入移动摄像头Cocos2D android

问题是,无论何时将手指移动到屏幕上,屏幕上的所有内容都会消失而不是移动。

我的代码如下,我希望有人可以帮助我这:)谢谢你的时间。

@Override 
public boolean ccTouchesMoved(MotionEvent event) 
     { 
      CGPoint location = CCDirector.sharedDirector().convertToGL(CGPoint.ccp(event.getX(), event.getY())); 
      CGPoint movement = CGPoint.ccpSub(location, previousLocation); 
      previousLocation = location; 
      //Update the camera 
      float[] x = new float[1]; 
      float[] y = new float[1]; 
      float[] z = new float[1]; 
      this.getCamera().getCenter(x, y, z); 
      CameraPos.x = x[0]; 
      CameraPos.y = y[0]; 
      this.getCamera().getEye(x, y, z); 
      movement.x = 2 * movement.x * (1 + (z[0]/832)); 
      movement.y = 2 * movement.y * (1 + (z[0]/832)); 
      CameraPos.x = CameraPos.x - Math.round(movement.x); 
      CameraPos.y = CameraPos.y - Math.round(movement.y); 
      this.getCamera().setCenter(CameraPos.x, CameraPos.y, 0); 
      this.getCamera().setEye(CameraPos.x, CameraPos.y, z[0]); 
      return true; 
     } 
+0

哦,我想我要补充一点,previousLocation是一个CGPoint,我存储这样我就可以制定出在改变触摸位置。 – WingDev

+0

Cocos2d-android不再支持。您必须使用cocos2d-x,跨平台,使用JNI来使用C++代码。更多信息[这里](http://stackoverflow.com/q/10711047/1077364)。你问的问题是在cocos2d-x里面的一个测试中解决的,看看。 – vgonisanz

回答

0

它很好,但我得到它的工作。

对于任何想知道这一点的人,我创建了一个名为CameraControls的类来控制相机的基本功能。它还没有完成(我可能会更新代码,因为我对缩放功能进行了更改),但是这个允许我完美地跟踪触摸输入。

import org.cocos2d.nodes.CCDirector; 
import org.cocos2d.types.CGPoint; 
import org.cocos2d.types.CGSize; 

public class CameraControls { 

CGSize winSize = CCDirector.sharedDirector().displaySize(); 
CGPoint CameraPos = CGPoint.ccp(winSize.width, winSize.height); 
CGPoint previousLocation; 
double minX; 
double maxX; 
double minY; 
double maxY; 

public CameraControls(World world) 
{ 
    this.loadCamera(world); 
} 

public void setCameraLimit(float minX, float maxX, float minY, float maxY) 
{ 
    this.minX = minX; 
    this.maxX = maxX; 
    this.minY = minY; 
    this.maxY = maxY; 
} 

public void loadCamera(World world) 
{ 
    float[] x = new float[1]; 
    float[] y = new float[1]; 
    float[] z = new float[1]; 
    world.getCamera().getCenter(x, y, z); 
    CameraPos.x = x[0]; 
    CameraPos.y = y[0]; 
} 

public void trackTouchMovement(CGPoint location, World world) 
{ 
    if(previousLocation == null) 
    { 
     previousLocation = location; 
    } 
    CGPoint movement = CGPoint.ccpSub(previousLocation, location); 
    previousLocation = location; 
    float[] x1 = new float[1]; 
    float[] y1 = new float[1]; 
    float[] z1 = new float[1]; 
    world.getCamera().getEye(x1, y1, z1); 
    CameraPos.x = CameraPos.x + movement.x; 
    CameraPos.y = CameraPos.y + movement.y; 

    try 
    { 
     if(CameraPos.x >= maxX || CameraPos.x <= minX || CameraPos.y >= maxY || CameraPos.y <= minY) 
     { 
      CameraPos = CGPoint.ccpSub(CameraPos, movement); 
     } 
    } 
    catch (NullPointerException e) 
    { 
     System.out.println("Invalid values for camera Limits. No Limits applied."); 
    } 

    world.getCamera().setCenter(CameraPos.x, CameraPos.y, 0); 
    world.getCamera().setEye(CameraPos.x, CameraPos.y, z1[0]); 
} 

public void storePositionAsPrevious(CGPoint pos) 
{ 
    previousLocation = pos; 
} 

public void resetPrevious() 
{ 
    previousLocation = null; 
} 
} 

既然我有一个类,我只需在我的类中创建一个CameraControls实例,然后执行必要的配置。

CameraControls camera = new CameraControls(this); 

在这种情况下,我想的总面积我的相机可以查看为3摄像机的X上的宽度,和摄像机的3倍的高度,所以设定相机的极限作为负当相机在(0,0)处开始时,相机的宽度,相机的宽度,相机的负高度和相机的高度。

camera.setCameraLimit(-winSize.width, winSize.width, -winSize.height, winSize.height); 

最后,我只是添加了必要的方法调用中ccTouchesBegan,ccTouchesMoved和ccTouchesEnded

@Override 
public boolean ccTouchesMoved(MotionEvent event) 
     { 
      CGPoint location = CCDirector.sharedDirector().convertToGL(CGPoint.ccp(event.getX(), event.getY())); 
      camera.trackTouchMovement(location, this); 
      return true; 
     } 
@Override 
public boolean ccTouchesEnded(MotionEvent event) 
{ 
      camera.resetPrevious(); 
      return true; 
} 
@Override 
public boolean ccTouchesBegan(MotionEvent event) 
{ 
      CGPoint location = CCDirector.sharedDirector().convertToGL(CGPoint.ccp(event.getX(), event.getY())); 
      camera.storePositionAsPrevious(location); 
      return true; 
}