שימוש במקשי המקלדת

mayan456

New member
שימוש במקשי המקלדת

היי, יש לי בעיה בשימוש באירועי המקלדת -

עשיתי מחלקת במה וממנה אני מוסיפה אובייקט מסוים שיש לו מחלקה משלו. בתוך המחלקה שלו יצרתי אירוע של המקלדת ומשום מה זה לא עובד לי...
ניסיתי לבדוק האם הבעיה היא בסוג האובייקט, ייבוא מחלקות וכו' אבל לא מצאתי משהו חריג.
ניסיתי לעשות את אותו הדבר אך הפעם במקום אירוע מקלדת עשיתי אירוע עכבר. עם אירוע העכבר זה עובד מצוין, רק אירוע המקלדת פשוט לא נקלט על האובייקט.

ניסיתי גם להוסיף את האובייקט לבמה בצורה ידנית ולא בצורה תכנותית, ואירוע המקלדת כן עובד.
ניסיתי ליצור אובייקט במחלקת הבמה ובתוך מחלקת הבמה לעשות אירוע מקלדת- וזה גם עובד.

אבל רק אירוע מקלדת במחלקת האובייקט לא עובד לי....... מישהו יודע למה זה קורה?

תודה מראש!
 

erezor

New member
זה תלוי לאיזה אובייקט את מצמידה את המאזין

אני לא יודע בדיוק איך בנוי האובייקט שלך, אבל תנסי להצמיד בתוכו את המאזין לבמה באופן כזה:

stage.addEventListener(KeyboardEvent.KEY_DOWN, myHandler);


אם אין לך שם reference לבמה, אפשר להעביר את הבמה לאובייקט שלך כאובייקט מסוג מוביקליפ.
 

mayan456

New member
תגובה

מחלקת הבמה שלי מקושרת לבמה. במחלקה הזו עשיתי addChild לאובייקט שלי וכשאני מדפיסה את הstage במחלקת הבמה אני רואה שיש לי אובייקט מהסוג שרציתי, אבל כשאני מדפיסה את הstage במחלקת האובייקט יש לי null ולכן אני לא יכולה להוסיף לaddEventListener את הstage.

כשאני מוסיפה ידנית את האובייקט לבמה ומצמידה ל addEventListener את הstage זה עובד לי...

רק אירוע המקשים לא עובד לי ]=
 

erezor

New member
את צודקת לגבי ה-null

זה מה שאמור היה לקרות...
האובייקט שלך יורש מאיזושהי מחלקה? אם הוא יורש ממשהו שירש בתורו מ-displayObject, אז יש לו מאפיין בשם stage, ואז אפשר להצמיד את זה אליו. אם לא, אז את יכולה יכולה להעביר את הבמה כפרמטר לאובייקט כשאת יוצרת אותו, או לשים את הבמה כמשתנה סטטי ב-document class, ואת המאזין להצמיד אליה.
 

mayan456

New member
תגובה נוספת

package
{

import flash.display.*;
import flash.events.*;
import flash.ui.*;

public class shape1 extends Sprite
{

public function shape1()
{
addEventListener(KeyboardEvent.KEY_DOWN,tracing);
}
public function tracing(e:KeyboardEvent):void
{
trace("in");
}
}
}




וזו מחלקת הבמה שלי שמקושרת בdocumnet class לבמה


package
{

import flash.display.*;
import shape1;
import flash.events.*;

public class myStage extends MovieClip
{
private var myPlayer:shape1;

public function myStage()
{

addEventListener(Event.ADDED_TO_STAGE,creatingCharacter);

}
public function creatingCharacter(e:Event):void
{
myPlayer=new shape1();
addChild(myPlayer);
myPlayer.x = 90;
myPlayer.y = 320;
}

}
}


מה שממש מוזר לי שאם אעשה אירוע עכבר הוא כן יקלוט אבל אירוע מקלדת לא...
 

erezor

New member
בלי לבדוק...

1. את השורה עם ה-addEventListener של המקלדת תשני כך:
this.stage.addEventListener(KeyboardEvent.KEY_DOWN,tracing);

2. אם 1 לא עבד, אז במחלקה myStage תוסיפי משתנה חדש, תקראי לו למשל "keyStage" בצורה הזו:
public static var keyStage:MovieClip;

בפונקציה myStage תוסיפי את השורה:
keyStage = this;

ואז את השורה עם ה-addEventListener של המקלדת:
myStage.keyStage.addEventListener(KeyboardEvent.KEY_DOWN,tracing);


לא בדקתי, אבל נשמע לי הגיוני...
 

mayan456

New member
זה עדיין לא עובד לי...

אולם ניסיתי את זה עם אירוע עכבר וזה כן עבד, אני חושבת שיש בעיה בקליטה של אירוע המקלדת...

ותודה רבה על הנחישות והעזרה!
 

erezor

New member
עכשיו בדקתי...

והנה הפתרון:
package {
import flash.events.*;
import flash.ui.*;
import flash.display.*;

public class shape1 extends Sprite {

public function shape1() {
this.addEventListener(Event.ADDED_TO_STAGE, onAdded);
}

private function onAdded(e:Event):void {
this.stage.addEventListener(KeyboardEvent.KEY_DOWN,tracing);
}

public function tracing(e:KeyboardEvent):void {
trace("in");
}
}
}


this.stage יהיה שווה לבמה רק אחרי שהוא נוסף לבמה. לכן, הוספתי את האירוע שבודק מתי זה קורה, ורק אז אני מוסיף את המאזין של המקלדת. אצלי זה עבד, וכשאני לוחץ על מקשים הוא מדפיס לי "in".
 

mayan456

New member
ת ו ד ה ע נ ק י ת !!!!!

הבנתי אותך!
רק לאחר הוספת האובייקט לבמה אצמיד לו מאזין :)

באמת תודה רבה, עזרת לי מאוד!
חג פורים שמח!
 
למעלה