দুটি বিকল্প: যদি "নেস্টেড ইনপুট" ক্ষেত্রে সর্বাধিক তিন, চার হয় তবে আমি কেবল পতাকা ব্যবহার করব। "কোন জিনিস ধরে আছে? গুলি চালানো যায় না?" অন্য যে কোনও কিছু এটির উপরে নজর রাখছে।
অন্যথায়, আপনি ইভেন্ট হ্যান্ডলারগুলির প্রতি ইনপুট-কী স্ট্যাক রাখতে পারেন।
Actions.Empty = () => { return; };
if(IsPressed(Keys.E)) {
keyEventHandlers[Keys.E].Push(Actions.Empty);
keyEventHandlers[Keys.LeftMouseButton].Push(Actions.Empty);
keyEventHandlers[Keys.Space].Push(Actions.Empty);
} else if (IsReleased(Keys.E)) {
keyEventHandlers[Keys.E].Pop();
keyEventHandlers[Keys.LeftMouseButton].Pop();
keyEventHandlers[Keys.Space].Pop();
}
while(GetNextKeyInBuffer(out key)) {
keyEventHandlers[key].Invoke(); // we invoke only last event handler
}
বা এই প্রভাব কিছু :)
সম্পাদন করা : কেউ যদি অন্য নির্মাণগুলি পরিচালনা না করে তবেই তাকে উল্লেখযোগ্য। আমরা কি কোনও ইনপুট ইভেন্ট হ্যান্ডলিং রুটিনের জন্য পুরো ডেটা-চালিত যেতে যাচ্ছি? আপনি অবশ্যই করতে পারেন, কিন্তু কেন?
যাইহোক, এটি হ্যাকের জন্য:
void BuildOnKeyPressedEventHandlerTable() {
onKeyPressedHandlers[Key.E] = () => {
keyEventHandlers[Keys.E].Push(Actions.Empty);
keyEventHandlers[Keys.LeftMouseButton].Push(Actions.Empty);
keyEventHandlers[Keys.Space].Push(Actions.Empty);
};
}
void BuildOnKeyReleasedEventHandlerTable() {
onKeyReleasedHandlers[Key.E] = () => {
keyEventHandlers[Keys.E].Pop();
keyEventHandlers[Keys.LeftMouseButton].Pop();
keyEventHandlers[Keys.Space].Pop();
};
}
/* get released keys */
foreach(var releasedKey in releasedKeys)
onKeyReleasedHandlers[releasedKey].Invoke();
/* get pressed keys */
foreach(var pressedKey in pressedKeys)
onKeyPressedHandlers[pressedKey].Invoke();
keyEventHandlers[key].Invoke(); // we invoke only last event handler
সম্পাদনা 2
কাইলোটান কী ম্যাপিংয়ের কথা উল্লেখ করেছে, যা প্রতিটি গেমের হওয়া উচিত এমন একটি প্রাথমিক বৈশিষ্ট্য (অ্যাক্সেসযোগ্যতার বিষয়েও ভাবুন)। কীম্যাপিং সহ একটি আলাদা গল্প।
একটি মূল প্রেস সংমিশ্রণ বা ক্রমের উপর নির্ভর করে আচরণ পরিবর্তন করা সীমাবদ্ধ। আমি সেই অংশটিকে অবহেলা করেছি।
আচরণ খেলা যুক্তি সম্পর্কিত এবং ইনপুট নয় is যা মোটামুটি সুস্পষ্ট, এটি ভাবতে আসে।
অতএব, আমি নিম্নলিখিত সমাধান প্রস্তাব করছি:
// //>
void Init() {
// from config file / UI
// -something events should be set automatically
// quake 1 ftw.
// name family key keystate
"+forward" "movement" Keys.UpArrow Pressed
"-forward" Keys.UpArrow Released
"+shoot" "action" Keys.LMB Pressed
"-shoot" Keys.LMB Released
"jump" "movement" Keys.Space Pressed
"+lstrafe" "movement" Keys.A Pressed
"-lstrafe" Keys.A Released
"cast" "action" Keys.RMB Pressed
"picknose" "action" Keys.X Pressed
"lockpick" "action" Keys.G Pressed
"+crouch" "movement" Keys.LShift Pressed
"-crouch" Keys.LShift Released
"chat" "user" Keys.T Pressed
}
void ProcessInput() {
var pk = GetPressedKeys();
var rk = GetReleasedKeys();
var actions = TranslateToActions(pk, rk);
PerformActions(actions);
}
void TranslateToActions(pk, rk) {
// use what I posted above to switch actions depending
// on which keys have been pressed
// it's all about pushing and popping the right action
// depending on the "context" (it becomes a contextual action then)
}
actionHandlers["movement"] = (action, actionFamily) => {
if(player.isCasting)
InterruptCast();
};
actionHandlers["cast"] = (action, actionFamily) => {
if(player.isSilenced) {
Message("Cannot do that when silenced.");
}
};
actionHandlers["picknose"] = (action, actionFamily) => {
if(!player.canPickNose) {
Message("Your avatar does not agree.");
}
};
actionHandlers["chat"] = (action, actionFamily) => {
if(player.isSilenced) {
Message("Cannot chat when silenced!");
}
};
actionHandlers["jump"] = (action, actionFamily) => {
if(player.canJump && !player.isJumping)
player.PerformJump();
if(player.isJumping) {
if(player.CanDoubleJump())
player.PerformDoubleJump();
}
player.canPickNose = false; // it's dangerous while jumping
};
void PerformActions(IList<ActionEntry> actions) {
foreach(var action in actions) {
// we pass both action name and family
// if we find no action handler, we look for an "action family" handler
// otherwise call an empty delegate
actionHandlers[action.Name, action.Family]();
}
}
// //<
আমার চেয়ে স্মার্ট লোকেরা এটি অনেক উপায়ে উন্নত করতে পারে, তবে আমি বিশ্বাস করি এটি একটি ভাল সূচনা পয়েন্টও।