51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

java游戏开发入门(九) -音效

前言 {#前言}

  对于一个游戏来说,音效也是必不可少的一环,自然也不能少了。这章我们加入背景音乐以及一些音效。

音频资源 {#音频资源}

  首先在resource目录下创建assets/music以及assets/sounds目录。resource/assets/music目录下用来存放我们的MP3资源文件,assets/sounds目录用来存放wav资源文件。我们将bgm.mp3放入music目录下,eat.wav放入sounds目录下。

编码 {#编码}

首先完成BGM {#首先完成bgm}

  BGM需要在游戏启动后就开始播发,所以我们需要在游戏引擎初始化完成之后就开始执行。所以我们来重写onPreInit方法,该方法在引擎加载完成之后执行。

    @Override
    protected void onPreInit() {
        // 背景音乐
        loopBGM("bgm.mp3");
    }

紧接着完成音效部分 {#紧接着完成音效部分}

  在我们的Player对象碰撞到Gold对象时,我们需要一个奖励音效。

    /**
     * 初始化物理引擎(碰撞效果)
     */
    @Override
    protected void initPhysics() {
        getPhysicsWorld().addCollisionHandler(new CollisionHandler(EntityType.PLAYER,EntityType.GOLD){
            @Override
            protected void onCollisionBegin(Entity player, Entity gold) {
                //将gold对象从游戏中移除
                gold.removeFromWorld();
                // 设置参数+1
                inc("integral",+1);
                // 在界面内随机位置生成一个 Gold对象
                spawn("Gold", FXGLMath.random(0,getAppWidth()-50),FXGLMath.random(0,getAppHeight()-50));

    			play(<span class="hljs-string">"eat.wav"</span>);
            }
        });

        onCollisionBegin(EntityType.PLAYER, EntityType.ENEMY,(player, enemy)-&gt;{
            inc(<span class="hljs-string">"integral"</span>,-<span class="hljs-number">1</span>);
        });
    }




项目目录 {#项目目录}

1731139863815.png

完整代码 {#完整代码}

import com.almasb.fxgl.app.GameApplication;
import com.almasb.fxgl.app.GameSettings;
import com.almasb.fxgl.core.math.FXGLMath;
import com.almasb.fxgl.dsl.FXGL;
import com.almasb.fxgl.entity.Entity;
import com.almasb.fxgl.physics.CollisionHandler;
import javafx.scene.input.KeyCode;
import javafx.scene.paint.Color;
import javafx.util.Duration;

import java.util.Map;


import static com.almasb.fxgl.dsl.FXGL.\*;
import static com.almasb.fxgl.dsl.FXGL.onCollisionBegin;


/**




* 
  @author lhDream
  \*/
  public class HelloWorldApp extends GameApplication {



  /**



  * 玩家实体
    */
    private Entity player;




  @Override
  protected void onPreInit() {
  // 背景音乐
  loopBGM("bgm.mp3");
  }


  /**



  * 
    初始化设置





  * 
    @param settings 配置对象
    \*/
    @Override
    protected void initSettings(GameSettings settings) {
    settings.setTitle("Hello world");
    settings.setWidth(600);
    settings.setHeight(600);



    settings.setMainMenuEnabled(true);
    settings.setGameMenuEnabled(true);
    }






  /**



  * 
    初始化游戏内容
    \*/
    @Override
    protected void initGame() {
    // 注册实体工厂
    FXGL.getGameWorld().addEntityFactory(new DemoEntityFactory());



    // 在界面正中间生成玩家实体
    player = FXGL.spawn("Player",FXGL.getAppWidth()/2,FXGL.getAppHeight()/2);


    // 在界面200,200位置生成一个Gold实体
    spawn("Gold", 200,200);


    // 每秒生成一个敌方实体
    run(()-\>{
    // 生成坐标
    var x = FXGLMath.random(0,getAppWidth()-50);
    var y = FXGLMath.random(-50,0);


         spawn(<span class="hljs-string">"Enemy"</span>,x,y);




    },Duration.seconds(1));
    }






  /**



  * 初始化输入
    */
    @Override
    protected void initInput() {
    onKey(KeyCode.W,"上",()->{
    player.translateY(-5);
    });
    onKey(KeyCode.S,"下",()->{
    player.translateY(+5);
    });
    onKey(KeyCode.A,"左",()->{
    player.translateX(-5);
    });
    onKey(KeyCode.D,"右",()->{
    player.translateX(+5);
    });
    }




  /**



  * 
    初始化物理引擎(碰撞效果)
    \*/
    @Override
    protected void initPhysics() {
    getPhysicsWorld().addCollisionHandler(new CollisionHandler(EntityType.PLAYER,EntityType.GOLD){
    @Override
    protected void onCollisionBegin(Entity player, Entity gold) {
    //将gold对象从游戏中移除
    gold.removeFromWorld();
    // 设置参数+1
    inc("integral",+1);
    // 在界面内随机位置生成一个 Gold对象
    spawn("Gold", FXGLMath.random(0,getAppWidth()-50),FXGLMath.random(0,getAppHeight()-50));



             play(<span class="hljs-string">"eat.wav"</span>);
         }




    });


    onCollisionBegin(EntityType.PLAYER, EntityType.ENEMY,(player, enemy)-\>{
    inc("integral",-1);
    });
    }






  /**



  * 初始化参数


  * @param vars
    */
    @Override
    protected void initGameVars(Map<String, Object> vars) {
    vars.put("integral",0);
    }




  /**



  * 初始化UI
    */
    @Override
    protected void initUI() {
    // 初始化 Text 字体大小18 颜色 粉色
    var scoreText = getUIFactoryService().newText("", Color.PINK, 18);
    scoreText.textProperty().bind(getip("integral").asString("分数: %d"));
    addUINode(scoreText, 10, 30);
    }




  /**



  * main 程序的开始


  * @param args 参数
    */
    public static void main(String[] args) {
    launch(args);
    }
    }






总结 {#总结}

  至此,入门应该没有什么问题了。代码基础就这么多,可以考虑做一个自己的小游戏了。

完整项目 {#完整项目}

https://github.com/lhDream/lhDreamGameDemo/tree/master/HelloWorld

赞(0)
未经允许不得转载:工具盒子 » java游戏开发入门(九) -音效