| 209 | } |
| 210 | |
| 211 | void Player::update(float dt) |
| 212 | { |
| 213 | auto player = (MeshRenderer*)this; |
| 214 | switch (_playerState) |
| 215 | { |
| 216 | case PLAYER_STATE_IDLE: |
| 217 | break; |
| 218 | case PLAYER_STATE_FORWARD: |
| 219 | { |
| 220 | Vec3 curPos = player->getPosition3D(); |
| 221 | Vec3 newFaceDir = _targetPos - curPos; |
| 222 | newFaceDir.y = 0.0f; |
| 223 | newFaceDir.normalize(); |
| 224 | Vec3 offset = newFaceDir * 25.0f * dt; |
| 225 | curPos += offset; |
| 226 | player->setPosition3D(curPos); |
| 227 | } |
| 228 | break; |
| 229 | case PLAYER_STATE_BACKWARD: |
| 230 | { |
| 231 | Vec3 forward_vec; |
| 232 | player->getNodeToWorldTransform().getForwardVector(&forward_vec); |
| 233 | forward_vec.normalize(); |
| 234 | player->setPosition3D(player->getPosition3D() - forward_vec * 15 * dt); |
| 235 | } |
| 236 | break; |
| 237 | case PLAYER_STATE_LEFT: |
| 238 | { |
| 239 | player->setRotation3D(player->getRotation3D() + Vec3(0, 25 * dt, 0)); |
| 240 | } |
| 241 | break; |
| 242 | case PLAYER_STATE_RIGHT: |
| 243 | { |
| 244 | player->setRotation3D(player->getRotation3D() + Vec3(0, -25 * dt, 0)); |
| 245 | } |
| 246 | break; |
| 247 | default: |
| 248 | break; |
| 249 | } |
| 250 | // transform player position to world coord |
| 251 | auto playerPos = player->getPosition3D(); |
| 252 | auto playerModelMat = player->getParent()->getNodeToWorldTransform(); |
| 253 | playerModelMat.transformPoint(&playerPos); |
| 254 | Vec3 Normal; |
| 255 | float player_h = _terrain->getHeight(playerPos.x, playerPos.z, &Normal); |
| 256 | if (Normal.isZero()) // check the player whether is out of the terrain |
| 257 | { |
| 258 | player_h = playerPos.y; |
| 259 | } |
| 260 | else |
| 261 | { |
| 262 | player_h += PLAYER_HEIGHT; |
| 263 | } |
| 264 | player->setPositionY(player_h); |
| 265 | Quaternion q2; |
| 266 | q2.createFromAxisAngle(Vec3(0, 1, 0), (float)-M_PI, &q2); |
| 267 | |
| 268 | Quaternion headingQ; |
nothing calls this directly
no test coverage detected