cocos2d-x的2D游戏中,如何让屏幕镜头始终跟随着人物

我试着用camera的lookat(),但是没有效果。

没用过,不过camera不是要3维点的吗?

你可以在update里面设置camera的position。我昨天试过,加上Vec2的lerp做个平滑

也可以使用Follow

自己写点代码控制下就好了, 人物始终在屏幕中心, 底图在不停的移动。

可是我希望的是camera在移动,图移动的话我的其他的一些功能会受到影响。

我尝试了,我把camera的setposition()一直设置为player的position,还是没有动。

但我觉得这个问题肯定在cocos支持3D之前就有了啊,不会都是通过移动图层来解决的吧。

camera没用过,但是楼下提的Follow是可以实现你这个效果的,详情你可以看一下test中的例子

不可能哦,我待会把我的例子发给你看一下。

好的,谢谢。

好的:smile_cat:

这是init的代码

	//绑定事件
	w = s = a = d = 0;
	auto listener = EventListenerKeyboard::create();
	listener->onKeyPressed = [&](cocos2d::EventKeyboard::KeyCode keycode, Event* event)->void
	{
		switch (keycode)
		{
		case EventKeyboard::KeyCode::KEY_W:
			w = 1;
			break;
		case EventKeyboard::KeyCode::KEY_S:
			s = 1;
			break;
		case EventKeyboard::KeyCode::KEY_A:
			a = 1;
			break;
		case EventKeyboard::KeyCode::KEY_D:
			d = 1;
			break;
		default:
			break;
		}
	};

	listener->onKeyReleased = [&](cocos2d::EventKeyboard::KeyCode keycode, Event* event)->void
	{
		switch (keycode)
		{
		case EventKeyboard::KeyCode::KEY_W:
			w = 0;
			break;
		case EventKeyboard::KeyCode::KEY_S:
			s = 0;
			break;
		case EventKeyboard::KeyCode::KEY_A:
			a = 0;
			break;
		case EventKeyboard::KeyCode::KEY_D:
			d = 0;
			break;
		default:
			break;
		}
	};
	getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);
	
	scheduleUpdate();//开启帧循环

这是update代码

	//移动sprite
	int speed = 500;
	if (w || s)
	{
		int dir = -1;
		if (w)
			dir = 1;
		sprite->setPositionY(sprite->getPositionY() + (dir * speed * delta));
	}
	if (a || d)
	{
		int dir = -1;
		if(d)
			dir = 1;
		sprite->setPositionX(sprite->getPositionX() + (dir * speed * delta));
	}

	//平滑移动camera
	auto camera = getDefaultCamera();
	auto cameraPos = camera->getPosition();
	auto spritePos = sprite->getPosition();
	float scale = 1 + (abs(cameraPos.distance(spritePos)) / 50);
	camera->setPosition(camera->getPosition().lerp(sprite->getPosition(), delta*scale));

要在头文件定义w、s、a、d、sprite五个变量


效果

不知道为啥,用了四个波浪线键还是只有部分代码排版是好的:sweat:

其实核心代码就一行

	camera->setPosition(sprite->getPosition());

你先这么做两句代码,this->setCameraMask(2),(this指整个layer)这个“2”和你之前设置的camera flag有关,camera->setCameraFlag(CameraFlag::USER1),以此类推,总共8个镜头。然后再移动camera就行了。想要camera中心点“照着”sprite“,你得先创建一个空节点A,然后camera是A的子节点,设置camera的偏移坐标(-s.width/2,-s.heght/2)。接着这个A节点跟着sprite的坐标就成了。

之所以camera->setPosition不动,是因为所有的元素是渲染在scene的default camera下的。你要用setCameraMask把你要渲染的精灵都放到你新建的camera里。此时场景里是有两个camera的,你移动的是你的新camera,而default camera是scene的子节点。

好的,我等会看看,现在在写别的,谢谢。

使用lerp平滑移动,会有不规律的抖动…是时不时的出现,没有什么规律,有的时候又跑一段时间都没出现,请问有碰到类似的问题么?是怎么解决的?