实现输入
This commit is contained in:
parent
aad4c1775a
commit
580de2d245
@ -0,0 +1,126 @@
|
||||
%YAML 1.1
|
||||
%TAG !u! tag:unity3d.com,2011:
|
||||
--- !u!114 &11400000
|
||||
MonoBehaviour:
|
||||
m_ObjectHideFlags: 0
|
||||
m_CorrespondingSourceObject: {fileID: 0}
|
||||
m_PrefabInstance: {fileID: 0}
|
||||
m_PrefabAsset: {fileID: 0}
|
||||
m_GameObject: {fileID: 0}
|
||||
m_Enabled: 1
|
||||
m_EditorHideFlags: 0
|
||||
m_Script: {fileID: 11500000, guid: 66fc8233a79cd254f8d005452dcd4ac0, type: 3}
|
||||
m_Name: ControlSettings
|
||||
m_EditorClassIdentifier:
|
||||
Player1:
|
||||
UP:
|
||||
buttonType: 1
|
||||
keyCode: 119
|
||||
DOWN:
|
||||
buttonType: 2
|
||||
keyCode: 115
|
||||
LEFT:
|
||||
buttonType: 4
|
||||
keyCode: 97
|
||||
RIGHT:
|
||||
buttonType: 8
|
||||
keyCode: 100
|
||||
A:
|
||||
buttonType: 16
|
||||
keyCode: 107
|
||||
B:
|
||||
buttonType: 32
|
||||
keyCode: 106
|
||||
SELECT:
|
||||
buttonType: 64
|
||||
keyCode: 118
|
||||
START:
|
||||
buttonType: 128
|
||||
keyCode: 98
|
||||
MIC:
|
||||
buttonType: 256
|
||||
keyCode: 0
|
||||
Player2:
|
||||
UP:
|
||||
buttonType: 1
|
||||
keyCode: 0
|
||||
DOWN:
|
||||
buttonType: 2
|
||||
keyCode: 0
|
||||
LEFT:
|
||||
buttonType: 4
|
||||
keyCode: 0
|
||||
RIGHT:
|
||||
buttonType: 8
|
||||
keyCode: 0
|
||||
A:
|
||||
buttonType: 16
|
||||
keyCode: 0
|
||||
B:
|
||||
buttonType: 32
|
||||
keyCode: 0
|
||||
SELECT:
|
||||
buttonType: 64
|
||||
keyCode: 0
|
||||
START:
|
||||
buttonType: 128
|
||||
keyCode: 0
|
||||
MIC:
|
||||
buttonType: 256
|
||||
keyCode: 0
|
||||
Player3:
|
||||
UP:
|
||||
buttonType: 1
|
||||
keyCode: 0
|
||||
DOWN:
|
||||
buttonType: 2
|
||||
keyCode: 0
|
||||
LEFT:
|
||||
buttonType: 4
|
||||
keyCode: 0
|
||||
RIGHT:
|
||||
buttonType: 8
|
||||
keyCode: 0
|
||||
A:
|
||||
buttonType: 16
|
||||
keyCode: 0
|
||||
B:
|
||||
buttonType: 32
|
||||
keyCode: 0
|
||||
SELECT:
|
||||
buttonType: 64
|
||||
keyCode: 0
|
||||
START:
|
||||
buttonType: 128
|
||||
keyCode: 0
|
||||
MIC:
|
||||
buttonType: 256
|
||||
keyCode: 0
|
||||
Player4:
|
||||
UP:
|
||||
buttonType: 1
|
||||
keyCode: 0
|
||||
DOWN:
|
||||
buttonType: 2
|
||||
keyCode: 0
|
||||
LEFT:
|
||||
buttonType: 4
|
||||
keyCode: 0
|
||||
RIGHT:
|
||||
buttonType: 8
|
||||
keyCode: 0
|
||||
A:
|
||||
buttonType: 16
|
||||
keyCode: 0
|
||||
B:
|
||||
buttonType: 32
|
||||
keyCode: 0
|
||||
SELECT:
|
||||
buttonType: 64
|
||||
keyCode: 0
|
||||
START:
|
||||
buttonType: 128
|
||||
keyCode: 0
|
||||
MIC:
|
||||
buttonType: 256
|
||||
keyCode: 0
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fa3a6bfd9566da84eb494ff280abe34c
|
||||
NativeFormatImporter:
|
||||
externalObjects: {}
|
||||
mainObjectFileID: 11400000
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -3,7 +3,6 @@ using VirtualNes.Core;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
{
|
||||
|
||||
public class AudioProvider : MonoBehaviour
|
||||
{
|
||||
public NesEmulator NesEmu;
|
||||
@ -40,7 +39,6 @@ namespace AxibugEmuOnline.Client
|
||||
data[i] = rawFloat;
|
||||
for (int fill = 1; fill < step; fill++)
|
||||
data[i + fill] = rawFloat;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -98,5 +98,11 @@ namespace AxibugEmuOnline.Client
|
||||
var db = Resources.Load<RomDB>("NES/ROMDB");
|
||||
return db.GetMapperNo(rom.GetPROM_CRC(), out mapperNo);
|
||||
}
|
||||
|
||||
public ControllerState GetControllerState()
|
||||
{
|
||||
var mapper = Resources.Load<NesControllerMapper>("NES/ControlSettings");
|
||||
return mapper.CreateState();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,84 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using VirtualNes.Core;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
{
|
||||
public class NesControllerMapper : ScriptableObject
|
||||
{
|
||||
public MapperSetter Player1 = new MapperSetter();
|
||||
public MapperSetter Player2 = new MapperSetter();
|
||||
public MapperSetter Player3 = new MapperSetter();
|
||||
public MapperSetter Player4 = new MapperSetter();
|
||||
|
||||
public ControllerState CreateState()
|
||||
{
|
||||
var state1 = Player1.GetButtons();
|
||||
var state2 = Player2.GetButtons();
|
||||
var state3 = Player3.GetButtons();
|
||||
var state4 = Player4.GetButtons();
|
||||
|
||||
return new ControllerState(state1, state2, state3, state4);
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public class Mapper
|
||||
{
|
||||
public EnumButtonType buttonType;
|
||||
public KeyCode keyCode;
|
||||
|
||||
public Mapper(EnumButtonType buttonType)
|
||||
{
|
||||
this.buttonType = buttonType;
|
||||
}
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public class MapperSetter
|
||||
{
|
||||
public Mapper UP = new Mapper(EnumButtonType.UP);
|
||||
public Mapper DOWN = new Mapper(EnumButtonType.DOWN);
|
||||
public Mapper LEFT = new Mapper(EnumButtonType.LEFT);
|
||||
public Mapper RIGHT = new Mapper(EnumButtonType.RIGHT);
|
||||
public Mapper A = new Mapper(EnumButtonType.A);
|
||||
public Mapper B = new Mapper(EnumButtonType.B);
|
||||
public Mapper SELECT = new Mapper(EnumButtonType.SELECT);
|
||||
public Mapper START = new Mapper(EnumButtonType.START);
|
||||
public Mapper MIC = new Mapper(EnumButtonType.MIC);
|
||||
|
||||
public EnumButtonType GetButtons()
|
||||
{
|
||||
EnumButtonType res = 0;
|
||||
|
||||
if (Input.GetKey(UP.keyCode))
|
||||
res |= EnumButtonType.UP;
|
||||
|
||||
if (Input.GetKey(DOWN.keyCode))
|
||||
res |= EnumButtonType.DOWN;
|
||||
|
||||
if (Input.GetKey(LEFT.keyCode))
|
||||
res |= EnumButtonType.LEFT;
|
||||
|
||||
if (Input.GetKey(RIGHT.keyCode))
|
||||
res |= EnumButtonType.RIGHT;
|
||||
|
||||
if (Input.GetKey(A.keyCode))
|
||||
res |= EnumButtonType.A;
|
||||
|
||||
if (Input.GetKey(B.keyCode))
|
||||
res |= EnumButtonType.B;
|
||||
|
||||
if (Input.GetKey(SELECT.keyCode))
|
||||
res |= EnumButtonType.SELECT;
|
||||
|
||||
if (Input.GetKey(START.keyCode))
|
||||
res |= EnumButtonType.START;
|
||||
|
||||
if (Input.GetKey(MIC.keyCode))
|
||||
res |= EnumButtonType.MIC;
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 66fc8233a79cd254f8d005452dcd4ac0
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -57,6 +57,8 @@ namespace AxibugEmuOnline.Client
|
||||
{
|
||||
if (NesCore != null)
|
||||
{
|
||||
var controlState = Supporter.GetControllerState();
|
||||
NesCore.pad.Sync(controlState);
|
||||
NesCore.EmulateFrame(true);
|
||||
|
||||
var screenBuffer = NesCore.ppu.GetScreenPtr();
|
||||
|
@ -1,5 +1,6 @@
|
||||
using Codice.CM.Client.Differences;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
@ -25,6 +26,19 @@ namespace VirtualNes.Core
|
||||
|
||||
public uint pad1bit, pad2bit, pad3bit, pad4bit;
|
||||
|
||||
private static int[] ren10fps = new int[6] { 1, 1, 1, 0, 0, 0 };
|
||||
private static int[] ren15fps = new int[4] { 1, 1, 0, 0 };
|
||||
private static int[] ren20fps = new int[3] { 1, 1, 0 };
|
||||
private static int[] ren30fps = new int[2] { 1, 0 };
|
||||
private static int[] renmask = new int[4] { 6, 4, 3, 2 };
|
||||
public static Dictionary<int, int[]> rentbl = new Dictionary<int, int[]>()
|
||||
{
|
||||
{0,ren10fps },
|
||||
{1,ren15fps },
|
||||
{2,ren20fps },
|
||||
{3,ren30fps },
|
||||
};
|
||||
|
||||
public PAD(NES parent)
|
||||
{
|
||||
nes = parent;
|
||||
@ -405,6 +419,106 @@ namespace VirtualNes.Core
|
||||
}
|
||||
}
|
||||
|
||||
public void Sync(ControllerState state)
|
||||
{
|
||||
padbit[0] = SyncSub(0, state);
|
||||
padbit[1] = SyncSub(1, state);
|
||||
padbit[2] = SyncSub(2, state);
|
||||
padbit[3] = SyncSub(3, state);
|
||||
|
||||
// Mic
|
||||
micbit = 0;
|
||||
if (state.HasButton(1, EnumButtonType.MIC)) micbit |= 4;
|
||||
|
||||
// For Excontroller
|
||||
if (expad != null)
|
||||
{
|
||||
expad.Sync();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private byte SyncSub(int no, ControllerState state)
|
||||
{
|
||||
ushort bit = 0;
|
||||
|
||||
// Up
|
||||
if (state.HasButton(no, EnumButtonType.UP))
|
||||
bit |= 1 << 4;
|
||||
// Down
|
||||
if (state.HasButton(no, EnumButtonType.DOWN))
|
||||
bit |= 1 << 5;
|
||||
// Left
|
||||
if (state.HasButton(no, EnumButtonType.LEFT))
|
||||
bit |= 1 << 6;
|
||||
// Right
|
||||
if (state.HasButton(no, EnumButtonType.RIGHT))
|
||||
bit |= 1 << 7;
|
||||
|
||||
// 同時入力を禁止する
|
||||
// if( (bit&((1<<4)|(1<<5))) == ((1<<4)|(1<<5)) )
|
||||
// bit &= ~((1<<4)|(1<<5));
|
||||
if ((bit & ((1 << 6) | (1 << 7))) == ((1 << 6) | (1 << 7)))
|
||||
bit = (byte)(bit & ~((1 << 6) | (1 << 7)));
|
||||
|
||||
// A
|
||||
if (state.HasButton(no, EnumButtonType.A)) bit |= 1 << 0;
|
||||
// B
|
||||
if (state.HasButton(no, EnumButtonType.B)) bit |= 1 << 1;
|
||||
|
||||
// Select
|
||||
if (state.HasButton(no, EnumButtonType.SELECT)) bit |= 1 << 2;
|
||||
// Start
|
||||
if (state.HasButton(no, EnumButtonType.START)) bit |= 1 << 3;
|
||||
|
||||
// A rapid setup
|
||||
if ((bit & (1 << 8)) != 0)
|
||||
{
|
||||
int spd = Supporter.Config.controller.nRapid[no][0];
|
||||
if (spd >= 3) spd = 3;
|
||||
|
||||
int[] tbl = rentbl[spd];
|
||||
|
||||
if (padcnt[no][0] >= renmask[spd])
|
||||
padcnt[no][0] = 0;
|
||||
|
||||
if ((tbl[padcnt[no][0]]) != 0)
|
||||
bit |= (1 << 0);
|
||||
else
|
||||
bit = (byte)(bit & ~(1 << 0));
|
||||
|
||||
padcnt[no][0]++;
|
||||
}
|
||||
else
|
||||
{
|
||||
padcnt[no][0] = 0;
|
||||
}
|
||||
// B rapid setup
|
||||
if ((bit & (1 << 9)) != 0)
|
||||
{
|
||||
int spd = Supporter.Config.controller.nRapid[no][1];
|
||||
if (spd >= 3) spd = 3;
|
||||
int[] tbl = rentbl[spd];
|
||||
|
||||
if (padcnt[no][1] >= renmask[spd])
|
||||
padcnt[no][1] = 0;
|
||||
|
||||
if ((tbl[padcnt[no][1]]) != 0)
|
||||
bit |= (1 << 1);
|
||||
else
|
||||
bit = (byte)(bit & ~(1 << 1));
|
||||
|
||||
padcnt[no][1]++;
|
||||
}
|
||||
else
|
||||
{
|
||||
padcnt[no][1] = 0;
|
||||
}
|
||||
|
||||
return (byte)(bit & 0xFF);
|
||||
}
|
||||
|
||||
internal bool IsZapperMode()
|
||||
{
|
||||
return bZapperMode;
|
||||
|
@ -0,0 +1,51 @@
|
||||
using System;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public struct ControllerState
|
||||
{
|
||||
private uint raw0;
|
||||
private uint raw1;
|
||||
private uint raw2;
|
||||
private uint raw3;
|
||||
|
||||
public ControllerState(
|
||||
EnumButtonType player0_buttons,
|
||||
EnumButtonType player1_buttons,
|
||||
EnumButtonType player2_buttons,
|
||||
EnumButtonType player3_buttons)
|
||||
{
|
||||
raw0 = (uint)player0_buttons;
|
||||
raw1 = (uint)player1_buttons;
|
||||
raw2 = (uint)player2_buttons;
|
||||
raw3 = (uint)player3_buttons;
|
||||
}
|
||||
|
||||
public bool HasButton(int player, EnumButtonType button)
|
||||
{
|
||||
uint raw = 0;
|
||||
switch (player)
|
||||
{
|
||||
case 0: raw = raw0; break;
|
||||
case 1: raw = raw1; break;
|
||||
case 2: raw = raw2; break;
|
||||
case 3: raw = raw3; break;
|
||||
}
|
||||
return (raw & (uint)button) == (uint)button;
|
||||
}
|
||||
}
|
||||
|
||||
[Flags]
|
||||
public enum EnumButtonType
|
||||
{
|
||||
UP = 1,
|
||||
DOWN = 2,
|
||||
LEFT = 4,
|
||||
RIGHT = 8,
|
||||
A = 16,
|
||||
B = 32,
|
||||
SELECT = 64,
|
||||
START = 128,
|
||||
MIC = 256
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 88eb13b75812fc040ad7eb146af2bb80
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -1,6 +1,27 @@
|
||||
namespace VirtualNes.Core
|
||||
using Codice.CM.Client.Differences;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class CfgController
|
||||
{
|
||||
public ushort[][] nButton = new ushort[4][]
|
||||
{
|
||||
new ushort[64],new ushort[64], new ushort[64], new ushort[64],
|
||||
};
|
||||
public ushort[][] nRapid = new ushort[4][]
|
||||
{
|
||||
new ushort[2],new ushort[2],new ushort[2],new ushort[2],
|
||||
};
|
||||
|
||||
// 0:Crazy Climber
|
||||
// 1:Famly Trainer
|
||||
// 2:Exciting Boxing
|
||||
// 3:Mahjang
|
||||
public ushort[][] nExButton = new ushort[4][]
|
||||
{
|
||||
new ushort[64],new ushort[64], new ushort[64], new ushort[64],
|
||||
};
|
||||
|
||||
public ushort[] nVSUnisystem = new ushort[64];
|
||||
}
|
||||
}
|
@ -1,4 +1,6 @@
|
||||
namespace VirtualNes.Core
|
||||
using System;
|
||||
|
||||
namespace VirtualNes.Core
|
||||
{
|
||||
public class EmulatorConfig
|
||||
{
|
||||
|
@ -54,6 +54,11 @@ namespace VirtualNes.Core
|
||||
return s_support.TryGetMapperNo(rom, out mapperNo);
|
||||
}
|
||||
|
||||
public static ControllerState GetControllerState()
|
||||
{
|
||||
return s_support.GetControllerState();
|
||||
}
|
||||
|
||||
public static EmulatorConfig Config => s_support.Config;
|
||||
}
|
||||
|
||||
@ -70,5 +75,6 @@ namespace VirtualNes.Core
|
||||
void SaveFile(byte[] fileData, string directPath, string fileName);
|
||||
Stream OpenFile(string directPath, string fileName);
|
||||
bool TryGetMapperNo(ROM rom, out int mapperNo);
|
||||
ControllerState GetControllerState();
|
||||
}
|
||||
}
|
||||
|
Binary file not shown.
Loading…
Reference in New Issue
Block a user