void cCamera::Update(bool keys[],int mouseX,int mouseY, object *plane) { float angle; float alfa; Map = plane; if(mouseX!=middleX) { angle = (middleX - mouseX) / 50.0f; RotateY(angle); } if(mouseY!=middleY) { angle = (middleY - mouseY) / 50.0f; RotateX(angle); } if (keys['w']) MoveForwards(-speed); if (keys['s']) MoveForwards(speed); if (keys['a']) StrafeRight(-speed); if (keys['d']) StrafeRight(speed); if (keys[' ']) Jump(); // JUMP & GRAVITY if (jumping) { jump_alfa += JUMP_STEP; if (jump_alfa == 180) { jumping = false; Position.y = jump_y; } else { alfa = ((float)jump_alfa) * 0.017453f; Position.y = jump_y + (int)(((float)JUMP_HEIGHT) * sin(alfa)); if (jump_alfa > 90) { //Over floor? jumping = !CollidesMap(GetCollider(), Map); } } } else { //Over floor? if (!CollidesMap(GetCollider(), Map)) Position.y -= (2 * speed); } }
void cCamera::Jump() { if (!jumping) { if (CollidesMap(GetCollider(), Map)) { jumping = true; jump_alfa = 0; jump_y = Position.y; } } }
void cCamera::StrafeRight ( GLfloat distance ) { if (ViewDirChanged) GetViewDir(); cVector3D MoveVector; MoveVector.z = -ViewDir.x * -distance; MoveVector.y = 0.0; MoveVector.x = ViewDir.z * -distance; if (CollidesMap(GetCollider(), Map)) MoveVector.y = 0; else MoveVector.y = -1; Position.Add(MoveVector); }
void cCamera::MoveForwards( GLfloat distance ) { bool col; if (ViewDirChanged) GetViewDir(); cVector3D MoveVector; MoveVector.x = ViewDir.x * -distance; MoveVector.y = ViewDir.y * -distance; MoveVector.z = ViewDir.z * -distance; if (CollidesMap(GetCollider(), Map)) MoveVector.y = 0; else MoveVector.y = -1; Position.Add(MoveVector); }
void cCamera::Folk(GLfloat distance) { cVector3D MoveVector; MoveVector.x = 0.0; MoveVector.y = 1.0 * distance; MoveVector.z = 0.0; if (CollidesMap(GetCollider(), Map)) { onFloor = true; } else { Position.Add(MoveVector); } }
bool cBicho::Move(const cMap& map, Direction dir, int sceneX, int sceneY) { if (IsDying() || IsDead()) { return false; } float &axis = (dir == Direction::Left || dir == Direction::Right) ? x : y; int mult = 1; bool canMove = true; if (dir == Direction::Left || dir == Direction::Down) { mult = -1; } // What's next tile if (int(axis) % TILE_SIZE == 0) { float aux = axis; axis += stepLength * mult; if (ReachesMapLimit(map, sceneX, sceneY)) { canMove = ReachLimit(dir); axis = aux; } else if (CollidesMap(map)) { axis = aux; state = State::Look; canMove = false; } } else { // Advance axis += stepLength * mult; } // Always set direction direction = dir; if (canMove && state != State::Walk) { state = State::Walk; } // Calculate if entering DungeonDoor from below. int cellx = x/TILE_SIZE; int celly = y/TILE_SIZE; if (!ReachesMapLimit(map, sceneX, sceneY) && map.DungeonDoor(cellx, celly)) { InDungeonDoor(); } return canMove; }