/*
* Catroid: An on-device visual programming system for Android devices
* Copyright (C) 2010-2016 The Catrobat Team
* (<http://developer.catrobat.org/credits>)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* An additional term exception under section 7 of the GNU Affero
* General Public License, version 3, is available at
* http://developer.catrobat.org/license_additional_term
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.catrobat.catroid.physics.content;
import com.badlogic.gdx.scenes.scene2d.Action;
import com.badlogic.gdx.scenes.scene2d.actions.Actions;
import org.catrobat.catroid.ProjectManager;
import org.catrobat.catroid.content.ActionFactory;
import org.catrobat.catroid.content.Sprite;
import org.catrobat.catroid.formulaeditor.Formula;
import org.catrobat.catroid.physics.PhysicsLook;
import org.catrobat.catroid.physics.PhysicsObject;
import org.catrobat.catroid.physics.PhysicsObject.Type;
import org.catrobat.catroid.physics.PhysicsWorld;
import org.catrobat.catroid.physics.content.actions.GlideToPhysicsAction;
import org.catrobat.catroid.physics.content.actions.IfOnEdgeBouncePhysicsAction;
import org.catrobat.catroid.physics.content.actions.SetBounceFactorAction;
import org.catrobat.catroid.physics.content.actions.SetFrictionAction;
import org.catrobat.catroid.physics.content.actions.SetGravityAction;
import org.catrobat.catroid.physics.content.actions.SetMassAction;
import org.catrobat.catroid.physics.content.actions.SetPhysicsObjectTypeAction;
import org.catrobat.catroid.physics.content.actions.SetVelocityAction;
import org.catrobat.catroid.physics.content.actions.TurnLeftSpeedAction;
import org.catrobat.catroid.physics.content.actions.TurnRightSpeedAction;
public class ActionPhysicsFactory extends ActionFactory {
private PhysicsObject getPhysicsObject(Sprite sprite) {
return getPhysicsWorld().getPhysicsObject(sprite);
}
private PhysicsWorld getPhysicsWorld() {
return ProjectManager.getInstance().getSceneToPlay().getPhysicsWorld();
}
// OVERRIDE
@Override
public Action createIfOnEdgeBounceAction(Sprite sprite) {
IfOnEdgeBouncePhysicsAction action = Actions.action(IfOnEdgeBouncePhysicsAction.class);
action.setSprite(sprite);
action.setPhysicsWorld(getPhysicsWorld());
return action;
}
@Override
public Action createGlideToAction(Sprite sprite, Formula x, Formula y, Formula duration) {
GlideToPhysicsAction action = Actions.action(GlideToPhysicsAction.class);
action.setPosition(x, y);
action.setDuration(duration);
action.setSprite(sprite);
action.setPhysicsLook((PhysicsLook) sprite.look);
return action;
}
// PHYSICS
@Override
public Action createSetBounceFactorAction(Sprite sprite, Formula bounceFactor) {
SetBounceFactorAction action = Actions.action(SetBounceFactorAction.class);
action.setSprite(sprite);
action.setPhysicsObject(getPhysicsObject(sprite));
action.setBounceFactor(bounceFactor);
return action;
}
@Override
public Action createSetFrictionAction(Sprite sprite, Formula friction) {
SetFrictionAction action = Actions.action(SetFrictionAction.class);
action.setSprite(sprite);
action.setPhysicsObject(getPhysicsObject(sprite));
action.setFriction(friction);
return action;
}
@Override
public Action createSetGravityAction(Sprite sprite, Formula gravityX, Formula gravityY) {
SetGravityAction action = Actions.action(SetGravityAction.class);
action.setSprite(sprite);
action.setPhysicsWorld(getPhysicsWorld());
action.setGravity(gravityX, gravityY);
return action;
}
@Override
public Action createSetMassAction(Sprite sprite, Formula mass) {
SetMassAction action = Actions.action(SetMassAction.class);
action.setSprite(sprite);
action.setPhysicsObject(getPhysicsObject(sprite));
action.setMass(mass);
return action;
}
@Override
public Action createSetPhysicsObjectTypeAction(Sprite sprite, Type type) {
SetPhysicsObjectTypeAction action = Actions.action(SetPhysicsObjectTypeAction.class);
action.setPhysicsObject(getPhysicsObject(sprite));
action.setType(type);
return action;
}
@Override
public Action createSetVelocityAction(Sprite sprite, Formula velocityX, Formula velocityY) {
SetVelocityAction action = Actions.action(SetVelocityAction.class);
action.setSprite(sprite);
action.setPhysicsObject(getPhysicsObject(sprite));
action.setVelocity(velocityX, velocityY);
return action;
}
@Override
public Action createTurnLeftSpeedAction(Sprite sprite, Formula speed) {
TurnLeftSpeedAction action = Actions.action(TurnLeftSpeedAction.class);
action.setSprite(sprite);
action.setPhysicsObject(getPhysicsObject(sprite));
action.setSpeed(speed);
return action;
}
@Override
public Action createTurnRightSpeedAction(Sprite sprite, Formula speed) {
TurnRightSpeedAction action = Actions.action(TurnRightSpeedAction.class);
action.setSprite(sprite);
action.setPhysicsObject(getPhysicsObject(sprite));
action.setSpeed(speed);
return action;
}
}