Project1

标题: 有沒有辦法做一個彈奏鋼琴的 [打印本页]

作者: 小叮鈴    时间: 2016-1-2 02:56
标题: 有沒有辦法做一個彈奏鋼琴的
本帖最后由 小叮鈴 于 2016-1-2 02:57 编辑

就是 需要依照順序彈奏鋼琴 用按鈕判斷發音 比如按上是DO 按下是RE 按左是MI

初步想法是用公用事件 建立七個音階 七個公用事件為正確 七個為錯誤 總共14個事件並行

然後如果是正確就變量=1 錯誤變量=2 在建立兩個事件並行變量

每次判斷音符就重複上面這些動作 搞了幾個音符就複雜到快發瘋 有沒有甚麼更簡單的方法{:2_277:}

另外弱弱問問MV好像支援滑鼠和觸控吧 有沒有能直接點鋼琴的方法{:2_276:}

作者: 汪汪    时间: 2016-1-2 11:56
能是能,不过要看你这个东西的具体实现方式吧....
作者: 夜$神    时间: 2016-1-2 13:37
提示: 作者被禁止或删除 内容自动屏蔽
作者: 小叮鈴    时间: 2016-1-2 15:14
夜$神 发表于 2016-1-2 13:37
事件块。点击事件触发音符的SE。

怎麼用?{:2_248:}
作者: 夜$神    时间: 2016-1-2 16:11
提示: 作者被禁止或删除 内容自动屏蔽
作者: 小叮鈴    时间: 2016-1-2 17:17
夜$神 发表于 2016-1-2 16:11
专门做一个钢琴的地图,用远景图做地图放一张钢琴的图在后面就好。然后行走图透明,在地图上直接设定黑白 ...

恩 這招不錯 我真沒想到
不過假如如果要依序輸入正確的順序 有沒有甚麼比較簡單的方法?
作者: andrewx    时间: 2016-1-2 17:55
本帖最后由 andrewx 于 2016-1-2 18:10 编辑

用一个变量A记录这是第几次按键,一个变量B记录当前按的是1~7中的哪一个。
一个公共事件进行判定,如当A=1时,B不等于3算作失败变量A复位为0;当A=2时,B不等于2失败。。。最后一个判定如果成功就算做成功
每一个按键事件触发后播完SE,变量A+1,改变变量B到对应的值并调用这个公共事件
作者: 小叮鈴    时间: 2016-1-2 19:27
andrewx 发表于 2016-1-2 17:55
用一个变量A记录这是第几次按键,一个变量B记录当前按的是1~7中的哪一个。
一个公共事件进行判定,如当A=1 ...

所以do re mi fa so la si 是紀錄變量B=1~7嗎? 有點複雜 想了好久還是轉不過來
作者: 汪汪    时间: 2016-1-2 19:46
判断时可以使用文本
比如
$gameVariables._data[id] = ""
点击事件1 后
$gameVariables._data[id] += "1"
以此类推
然后使用
$gameVariables._data[id].indexOf("567") >= 0 来判断是否 按下过 567

作者: andrewx    时间: 2016-1-2 19:52
小叮鈴 发表于 2016-1-2 19:27
所以do re mi fa so la si 是紀錄變量B=1~7嗎? 有點複雜 想了好久還是轉不過來  ...

其实思路很简单,你只要判断第几次按的键是不是你要求的,比如你要mi re do re mi mi mi,其实就是第一次按键是不是3(mi),是的话继续,不是的话全部重来,第二次按键是不是2,以此类推。变量A就是用来记录这是第几次按键的
作者: 汪汪    时间: 2016-1-2 20:02
本帖最后由 汪汪 于 2016-1-2 20:06 编辑
andrewx 发表于 2016-1-2 19:52
其实思路很简单,你只要判断第几次按的键是不是你要求的,比如你要mi re do re mi mi mi,其实就是第一次 ...

直接修改值的话就可以越过变量只能输入数的问题了
也就是对 $gameVariables._data[id]  进行修改
不过不会触发 this.onChange()
不过可以加上一句 $gameVariables.onChange()

  1. //-----------------------------------------------------------------------------
  2. // Game_Variables
  3. // 游戏变量  $gameVariables
  4. // The game object class for variables.
  5. // 变量的游戏对象类

  6. function Game_Variables() {
  7.     this.initialize.apply(this, arguments);
  8. }
  9. //初始化
  10. Game_Variables.prototype.initialize = function() {
  11.     this.clear();
  12. };
  13. //清除
  14. Game_Variables.prototype.clear = function() {
  15.     this._data = [];
  16. };
  17. //值
  18. Game_Variables.prototype.value = function(variableId) {
  19.     return this._data[variableId] || 0;
  20. };
  21. //设置值
  22. Game_Variables.prototype.setValue = function(variableId, value) {
  23.     if (variableId > 0 && variableId < $dataSystem.variables.length) {
  24.         if (typeof value === 'number') {
  25.             value = Math.floor(value);
  26.         }
  27.         this._data[variableId] = value;
  28.         this.onChange();
  29.     }
  30. };
  31. //当改变
  32. Game_Variables.prototype.onChange = function() {
  33.     $gameMap.requestRefresh();
  34. };
复制代码

作者: 小叮鈴    时间: 2016-1-2 20:56
andrewx 发表于 2016-1-2 19:52
其实思路很简单,你只要判断第几次按的键是不是你要求的,比如你要mi re do re mi mi mi,其实就是第一次 ...

恩恩~所以假如要依序輸入do mi do re mi

當觸發事件後,就建立一個公用事件設定並行

當A=1 B=1(do)就正確 B=2~7就錯誤中斷事件

當A=2 B=3(mi)就正確 B=1~2和4~7就錯誤中斷事件

當A=3 B=1(do)就正確 B=2~7就錯誤中斷事件

以此類推嗎? 總共六個音符就要建立六個公用事件嗎?
作者: 小叮鈴    时间: 2016-1-2 20:57
汪汪 发表于 2016-1-2 19:46
判断时可以使用文本
比如
$gameVariables._data = ""

這是用樓上A和B的變量嗎?
作者: andrewx    时间: 2016-1-2 21:16
本帖最后由 andrewx 于 2016-1-2 21:18 编辑
小叮鈴 发表于 2016-1-2 20:56
恩恩~所以假如要依序輸入do mi do re mi

當觸發事件後,就建立一個公用事件設定並行

只用一个公共事件就行了,而且不需要并行。

地图上的钢琴按钮事件有7个代表七个音,每个触发之后首先播放声音,然后给A加1,再把B等于自身的那个数字,然后调用公共事件。
比如:


公共事件大致流程:


这样重复,你的正确旋律有几个音就重复几次,把第一层条件判定的A值往上加
最后一次增加一个成功的条件:


以上
作者: 汪汪    时间: 2016-1-2 22:11
本帖最后由 汪汪 于 2016-1-2 22:24 编辑
小叮鈴 发表于 2016-1-2 20:57
這是用樓上A和B的變量嗎?
  1. if(!$gameVariables._data[1]){$gameVariables._data[1]="7"}else{$gameVariables._data[1] +=7}
复制代码


作者: 汪汪    时间: 2016-1-2 22:12
本帖最后由 汪汪 于 2016-1-3 00:10 编辑
小叮鈴 发表于 2016-1-2 20:57
這是用樓上A和B的變量嗎?

  1.         if (TouchInput.isRepeated()) {
  2.                //获取点击处x y  你可能需要用到
  3.                 var x = $gameMap.canvasToMapX(TouchInput.x);
  4.                 var y = $gameMap.canvasToMapY(TouchInput.y);
  5.                
  6.     }

复制代码

作者: 小叮鈴    时间: 2016-1-2 23:48
汪汪 发表于 2016-1-2 22:11

不太離解這個腳本的意思,你可以把存檔給我看一下範例嗎^^
作者: 小叮鈴    时间: 2016-1-2 23:50
andrewx 发表于 2016-1-2 21:16
只用一个公共事件就行了,而且不需要并行。

地图上的钢琴按钮事件有7个代表七个音,每个触发之后首先播放 ...


我還有一個笨問題

假如點鋼琴開始之後,就是在地圖上的事件觸發打開公用事件

這樣公用事件不是會直接整個跑完嗎?

打開公用事件之後 A=1 B還未有函數(因為還沒點任何鋼琴鍵) 這時候B就不等於1 直接顯示錯誤
作者: andrewx    时间: 2016-1-3 00:50
小叮鈴 发表于 2016-1-2 23:50
我還有一個笨問題

假如點鋼琴開始之後,就是在地圖上的事件觸發打開公用事件

公共事件只在触发了按键事件后被这个按键事件call起来,在这之前你的按键事件已经给B赋值了。然后它会检查现在是第几下(A的值)以及是否弹错(B的值)。每按一次键都会call一次公共事件来检测对错。看我的示例,第一张图就是第一个按键do的设置,其余的修改变量B的值依次为1~7
作者: 小叮鈴    时间: 2016-1-3 01:45
andrewx 发表于 2016-1-3 00:50
公共事件只在触发了按键事件后被这个按键事件call起来,在这之前你的按键事件已经给B赋值了。然后它会检 ...

不太對阿 假如我第一個按對 這時候A=1 B=1 因為答對 所以A+1
這時候A=2 B=1
然後因為A=2 所以觸發了第二個條件 當A=2時 B不等於3
這時候因為才剛按下 所以B還是停留在B=1 就跳到下一個分支下去
作者: andrewx    时间: 2016-1-3 10:27
本帖最后由 andrewx 于 2016-1-3 11:09 编辑
小叮鈴 发表于 2016-1-3 01:45
不太對阿 假如我第一個按對 這時候A=1 B=1 因為答對 所以A+1
這時候A=2 B=1
然後因為A=2 所以觸發了第二 ...


不不,A只在按键以后+1,判断正确不+1,实际上如果输入正确什么都不做,所以公共事件会直接结束等待下一次按键。
不理解的话先严格按照我的图示做一遍,之后再加你想要的效果吧
作者: 汪汪    时间: 2016-1-3 13:08
本帖最后由 汪汪 于 2016-1-3 13:12 编辑

试着打开地图就好,只有一个事件,所以直接看也行

Map002.zip

1.05 KB, 下载次数: 48


作者: 小叮鈴    时间: 2016-1-3 14:46
汪汪 发表于 2016-1-3 13:08
试着打开地图就好,只有一个事件,所以直接看也行

問問.json怎麼開@@
作者: 小叮鈴    时间: 2016-1-3 15:56
小叮鈴 发表于 2016-1-3 14:46
問問.json怎麼開@@

你說讀取範例地圖嗎? 我丟進去也沒看見耶@@ 你地圖名子叫甚麼?




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1