最近,看了一下JMonkeyEngine3的教程。使了一下物理引擎。
這是測驗代碼
package Test.Test1;
import com.jme3.app.SimpleApplication;
import com.jme3.bullet.BulletAppState;
import com.jme3.bullet.collision.shapes.BoxCollisionShape;
import com.jme3.bullet.collision.shapes.SphereCollisionShape;
import com.jme3.bullet.control.RigidBodyControl;
import com.jme3.input.KeyInput;
import com.jme3.input.MouseInput;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.KeyTrigger;
import com.jme3.input.controls.MouseButtonTrigger;
import com.jme3.light.AmbientLight;
import com.jme3.light.DirectionalLight;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector2f;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;
import com.jme3.scene.shape.Sphere;
import com.jme3.scene.shape.Sphere.TextureMode;
import com.jme3.texture.Texture;
import com.jme3.texture.Texture.WrapMode;
public class Test extends SimpleApplication implements ActionListener {
/**
* 開火,發射小球。滑鼠左鍵觸發。
*/
public final static String FIRE = "fire";
/**
* 顯示或隱藏BulletAppState的debug形狀。按空格鍵觸發。
*/
public final static String DEBUG = "debug";
/** 磚塊的尺寸 */
private static final float brickLength = 0.48f;
private static final float brickWidth = 0.24f;
private static final float brickHeight = 0.12f;
private BulletAppState bulletAppState;
@Override
public void simpleInitApp() {
cam.setLocation(new Vector3f(0, 4f, 6f));
cam.lookAt(new Vector3f(2, 2, 0), Vector3f.UNIT_Y);
bulletAppState = new BulletAppState();
stateManager.attach(bulletAppState);
// 初始化按鍵
initKeys();
// 初始化光照
initLight();
// 初始化場景
initScene();
}
@Override
public void onAction(String name, boolean isPressed, float tpf) {
if (isPressed) {
if (FIRE.equals(name)) {
shootBall();
} else if (DEBUG.equals(name)) {
boolean debugEnabled = bulletAppState.isDebugEnabled();
bulletAppState.setDebugEnabled(!debugEnabled);
}
}
}
/**
* 初始化按鍵輸入
*/
private void initKeys() {
inputManager.addMapping(FIRE, new MouseButtonTrigger(MouseInput.BUTTON_LEFT));
inputManager.addMapping(DEBUG, new KeyTrigger(KeyInput.KEY_SPACE));
inputManager.addListener(this, FIRE, DEBUG);
}
/**
* 初始化光照
*/
private void initLight() {
// 環境光
AmbientLight ambient = new AmbientLight();
ambient.setColor(new ColorRGBA(0.3f, 0.3f, 0.3f, 1f));
// 陽光
DirectionalLight sun = new DirectionalLight();
sun.setDirection(new Vector3f(-1, -2, -3).normalizeLocal());
rootNode.addLight(ambient);
rootNode.addLight(sun);
}
/**
* 初始化場景
*/
private void initScene() {
makeFloor();
makeWall();
}
/**
* 制作地板
*/
private void makeFloor() {
// 網格
Box floor = new Box(10f, 0.1f, 5f);
floor.scaleTextureCoordinates(new Vector2f(3, 6));
// 材質
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
Texture tex = assetManager.loadTexture("Textures/Terrain/Pond/Pond.jpg");
tex.setWrap(WrapMode.Repeat);
mat.setTexture("ColorMap", tex);
// 幾何體
Geometry geom = new Geometry("floor", floor);
geom.setMaterial(mat);
geom.setLocalTranslation(0, -0.1f, 0);// 將地板下移一定距離,讓表面和xoz平面重合。
// 剛體
RigidBodyControl rigidBody = new RigidBodyControl(0);
geom.addControl(rigidBody);
rigidBody.setCollisionShape(new BoxCollisionShape(new Vector3f(10f, 0.1f, 5f)));
rootNode.attachChild(geom);
bulletAppState.getPhysicsSpace().add(rigidBody);
}
/**
* 建造一堵墻
*/
private void makeWall() {
// 利用for回圈生成一堵由眾多磚塊組成的墻體。
float startpt = brickLength / 4;
float height = 0;
for (int j = 0; j < 15; j++) {
for (int i = 0; i < 6; i++) {
Vector3f vt = new Vector3f(i * brickLength * 2 + startpt, brickHeight + height, 0);
makeBrick(vt);
}
startpt = -startpt;
height += 2 * brickHeight;
}
}
/**
* 在指定位置放置一個物理磚塊
*
* @param loc 磚塊的位置
*/
private void makeBrick(Vector3f loc) {
// 網格
Box box = new Box(brickLength, brickHeight, brickWidth);
box.scaleTextureCoordinates(new Vector2f(1f, .5f));
// 材質
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
Texture tex = assetManager.loadTexture("Textures/Terrain/BrickWall/BrickWall.jpg");
mat.setTexture("ColorMap", tex);
// 幾何體
Geometry geom = new Geometry("brick", box);
geom.setMaterial(mat);
geom.setLocalTranslation(loc);// 把磚塊放在指定位置
// 剛體
RigidBodyControl rigidBody = new RigidBodyControl(2f);
geom.addControl(rigidBody);
rigidBody.setCollisionShape(new BoxCollisionShape(new Vector3f(brickLength, brickHeight, brickWidth)));
rootNode.attachChild(geom);
bulletAppState.getPhysicsSpace().add(rigidBody);
}
/**
* 從攝像機所在位置發射一個小球,初速度方向與攝像機方向一致。
*/
private void shootBall() {
// 網格
Sphere sphere = new Sphere(32, 32, 0.4f, true, false);
sphere.setTextureMode(TextureMode.Projected);
// 材質
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
Texture tex = assetManager.loadTexture("Textures/Terrain/Rock/Rock.PNG");
mat.setTexture("ColorMap", tex);
// 幾何體
Geometry geom = new Geometry("cannon ball", sphere);
geom.setMaterial(mat);
// 剛體
RigidBodyControl rigidBody = new RigidBodyControl(1f);
geom.addControl(rigidBody);
rigidBody.setCollisionShape(new SphereCollisionShape(0.4f));
rigidBody.setPhysicsLocation(cam.getLocation());// 位置
rigidBody.setLinearVelocity(cam.getDirection().mult(25));// 初速度
rootNode.attachChild(geom);
bulletAppState.getPhysicsSpace().add(rigidBody);
}
public static void main(String[] args) {
Test app = new Test();
app.start();
}
}
運行后報了這個錯誤
java.lang.NoClassDefFoundError: com/bulletphysics/dynamics/InternalTickCallback
at com.jme3.bullet.BulletAppState.startPhysics(BulletAppState.java:164)
at com.jme3.bullet.BulletAppState.stateAttached(BulletAppState.java:211)
at com.jme3.app.state.AppStateManager.attach(AppStateManager.java:133)
at Test.Test1.Test.simpleInitApp(Test.java:50)
at com.jme3.app.SimpleApplication.initialize(SimpleApplication.java:220)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.initInThread(LwjglAbstractDisplay.java:130)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:211)
at java.base/java.lang.Thread.run(Thread.java:830)
Caused by: java.lang.ClassNotFoundException: com.bulletphysics.dynamics.InternalTickCallback
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:602)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 8 more
jar包都匯入了,請那位大神看看是那里出了問題,謝謝。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/88878.html
標籤:Java相關
上一篇:java網路編程
下一篇:Idea運行錯誤求大佬解決
