קטגוריה: flash as3

אפליקציה לשנת השמיטה

לכבוד שנת שמיטה המתקרבת, העלנו אפליקציה חדשה בנושא שנת השמיטה:

האפליקציה כוללת דיני שביעית הלכה למעשה, שאלות ותשובות, מילון מושגים, סיפורים ועוד…

האפליקציה תוכנתה ב-AS3 / FLEX ונסגרה ב-ADOBE AIR.

להורדת האפליקציה למערכת IOS:
https://itunes.apple.com/il/app/smyth/id741599892?mt=8

לאנדרואיד:
https://play.google.com/store/apps/details?id=air.com.ami.smita

למעוניינים להזמין כדיסק הפעלה:

http://www.shtaygen.co.il/?CategoryID=981&ArticleID=12616

אפליקציית שמיטה

אפליקציה לשנת שמיטה

 

אמור זה שם של באג או איך לעבוד נכון מול הלקוח שלך

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

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

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

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

שניכם: תאמו צפיות, דברו על מה עושים ולמה מצפים בכל סיום שלב.

אתה: לא לשלוח סתם מייל עם קישור / קובץ מצורף, לכתוב נושא, ובגוף המייל לכתוב בכמה מילים מה שלחת ומה זה אמור לעשות, את הקישור מומלץ לכתוב בסוף המייל, ואם מדובר בקובץ אפילו לשלוח במייל נוסף.

הלקוח: תקרא את המייל לפני שאתה לוחץ סתם על הקישור, כנראה שזה הקישור לאתר העץ המשפחתי שלי.

 

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

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

אתה: אל תשלח ללקוח משהו שנראה בערך כמו בעיצוב, גם אם הכל עובד בצורה מושלמת, נסה להיצמד לעיצוב כמה שאפשר, מצב הרוח של הלקוח הוא דבר חשוב…

הלקוח:תבין שיש הבדל בין מראה לפונקציונאליות, לא צריך להראות יפה בשביל להיות הרץ המהיר בעולם.

 

אז למה זה לא עובד- זה עובד!!! רק תלחץ על CTRL+SHIFT+ENTER+F2+A+@+V ותראה שזה עובד. במהלך העבודה שמת קיצורי דרך בשביל לחסוך בכתיבה או בדיבאג, הלקוח לא יבין את קיצורי הדרך הללו, ובטח שלא ידע להגיע אליהם בעצמו, ברוב המקרים ההסברים ללקוח איפה ללחוץ ומה לעשות ייקחו יותר זמן מלכתוב GUI נורמאלי.

שניכם: אין כאן שניכם זה רק אתה

אתה: אל תשלח חצי עבודה או משהו עם הרבה דרכי קיצור, אתה יודע טוב מאוד למי מראים חצי עבודה.

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

 

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

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

אתה: תהיה קשוח, אם אין לך דברים סופיים, אל תעביר או שתעביר עם הסתייגויות חמורות.

הלקוח:אם תלחץ עלי אני לא יהפוך למעצב…

 

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

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

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

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

 

צריך לזכור לאורך כל הדרך שמטרה והאינטרס שלכם ושל הלקוח זהים (שניכם רוצים כסף J), סיום מהיר ומוצלח של הפרוייקט!

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

בהצלחה!

שניכם: מרוצים, סוף סוף נפטרתם אחד מהשני.

אתה: אז מתי אתם שולחים את הצ'ק?

הלקוח: אני לא במשרד דבר איתי בשבוע הבא….

משחק מבוסס box2d

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

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

זו הכתובת של המשחק: http://ganana.co.il/ צריך ללחוץ על התחל לשחק (מעל האריה), תהנו.

טיפ שלישי: לדעת שיש סאונד ברקע
יש פעמים שבהם נבנה holder שיטען קבצים חיצוניים, או איזה קובץ שמריץ כל מיני ילדים, ומראש אין לנו אפשרות לדעת האם מתנגן סאונד במה שנטען לתוך הקובץ שלנו.
בשביל לדעת האם יוצא מהקובץ שלנו איזה צליל ניתן להפעיל את הפונקציה הבאה soundPlay:
function soundPlay()
 {
 var mp3ba:ByteArray = new ByteArray();
 SoundMixer.computeSpectrum( mp3ba );
 var soundOut = mp3ba.readFloat();
 if (soundOut != 0)
 {
 return true;
 }
 else
 {
 return false;
 }
 }

אם יתנגן סאונד נקבל חזרה true אם לא נקבל false
טיפ שני: יצוא swf עם תיבת טקסט מסוג tlf

כשעובדים עם תיבות טקסט מסוג tlf (התיבת טקסט שעובדת עם עברית), קובץ ה-swf טוען לפני ההרצה של ה-swf את המאפיינים של ה-tlf, מה שגורם לכל המאפיינים שאמורים להטען מיד עם טעינת ה-swf להטען רק אחרי שהנגן מסיים לטעון את ה-tlf.
הטעינה המוקדמת הזו גורמת לבעיות, אם למשל יש משתנים שאנחנו מצפים לקבל (flashvars לדוגמא), או משתנים מהקובץ שנטען לתוך קונטינר, הם יגיעו רק אחרי זמן ולא מידכשהקובץ נטען.
בשביל לפתור את הבעיה הזו, צריך לגרום לקוד ה-tlf לשבת בתוך הקובץ swf עצמו, זה גורם להעלאת המשקל של הקובץ, אבל מונע בעיות (לשיקולכם).
בשביל להטמיע את הקוד בפלאש עצמו נלך ל-
publish settings –> Flash –> Seetings –> Libraty path
נבחר את: textLayout ונשנה את: Default likage ל-Merged into code במקום Runtime shared library (RSL).

טיפים!

טיפ ראשון: ציר זמן

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

טיפ שני: יצוא swf עם תיבת טקסט מסוג tlf

כשעובדים עם תיבות טקסט מסוג tlf (התיבת טקסט שעובדת עם עברית), קובץ ה-swf טוען לפני ההרצה של ה-swf את המאפיינים של ה-tlf, מה שגורם לכל המאפיינים שאמורים להטען מיד עם טעינת ה-swf להטען רק אחרי שהנגן מסיים לטעון את ה-tlf.
הטעינה המוקדמת הזו גורמת לבעיות, אם למשל יש משתנים שאנחנו מצפים לקבל (flashvars לדוגמא), או משתנים מהקובץ שנטען לתוך קונטינר, הם יגיעו רק אחרי זמן ולא מידכשהקובץ נטען.
בשביל לפתור את הבעיה הזו, צריך לגרום לקוד ה-tlf לשבת בתוך הקובץ swf עצמו, זה גורם להעלאת המשקל של הקובץ, אבל מונע בעיות (לשיקולכם).
בשביל להטמיע את הקוד בפלאש עצמו נלך ל-
publish settings –> Flash –> Seetings –> Libraty path
נבחר את: textLayout ונשנה את: Default likage ל-Merged into code במקום Runtime shared library (RSL).

הקובץ יוסיף את הקוד שבונה את ה-tlf לתוך ה-swf ובא לציון גואל.

שימוש ב-bitmapdata מתקדמים

מחלקה bitmapdata מאפשרת לנו "לזכור" מבנה של displayObject, להעתיק אותו, לשנות אותו ולעשות עליו מניפולציות שונות.
לדוגמא, ניתן לחתוך תמונות, לעוות תמונות, לשנות פיקסלים ספציפיים ועוד.
תיעוד המחלקה נמצא כאן: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/display/BitmapData.html
בשביל להבין את העבודה על המחלקה נתחיל מדוגמא פשוטה, נניח שעל הבמה יש לנו movieClip שמצוייר בו ציור כל שהוא ושמו mc, בדוגמא הראשונה נשכפל את מראה המוביקליפ:

import flash.display.BitmapData;
//איתחול המחלקה ביטמפדטא המחלקה מקבלת את הפרמטרים הבאים
//BitmapData(צבע האטימות,האם השכפול יתחשב באטימות,גובה המקור או גובה היעד,רוחב המקור או רוחב היעד);
var bmd:BitmapData = new BitmapData(mc.width,mc.height);
//הוראה לביטמפדטא לצייר את המוביקליפ
bmd.draw(mc);

כרגע בעצם שמרנו את המוביקליפ כציור בזכרון כמשתנה שנקרא bmd, במידה ונרצה לראות את תוצאת הציור שלנו, נשתמש במחלקה bitmap בדרך הבאה:

 

//איתחול המחלקה ביטמפ ויציקת הביטמפדטא לתוכה
var bm:Bitmap = new Bitmap(bmd);
//יצירת ילד אל הבמה
addChild(bm);


עד כאן בעצם יצרנו שכפול של המוביקליפ אל הבמה, מכאן מתחיל הכיף, לפני שאנחנו יוצקים את הביטמפדטא אל הביטמפ אנחנו יכולים לבצע עליו מניפולציות, את המניפולציות אפשר לבצע בכמה דרכים, אני אראה כאן דוגמא המבוססת על הדוקומנטציה של פלאש, בשביל לבצע את המניפולציה הזו, נשתמש במחלקה מטריקס(כן כמו הסרט), שמאפשרת לשחק עם הביטמפדטא ולבצע עליו פעולות כמו חיתוך,עיוות,הקטנה והגדלה, ניתן לקרוא כאן את התיעוד המלא: http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/geom/Matrix.html
בדוגמא שלי אני אבצע על התמונה שינוי צורה להקטנה פשוטה ע"י מטריקס:

 

import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Matrix;

//הגדרת הרוחב והגובה חלקי 2 כיוון שאנחנו מעוניינים לצייר את הביטמפדטא בצורה המוטקנת בחצי
var bmd:BitmapData = new BitmapData(mc.width/2,mc.height/2);
//איתחול מטריקס
var mat:Matrix = new Matrix();
//שימוש בפעולה scale
mat.scale(0.5,0.5);
//הוראה לביטמפדטא לצייר את המוביקליפ
//ולהכיל עליו גם את ההוראות של המטריקס
bmd.draw(mc,mat);

//איתחול המחלקה ביטמפ ויציקת הביטמפדטא לתוכה
var bm:Bitmap = new Bitmap(bmd);
//יצירת ילד אל הבמה
addChild(bm);


דוגמא נוספת, אני בוחר את כל הפיקסלים האדומים במקור שלי, והופך אותם לשקופים, בשביל לבצע את השינוי הזה, נרוץ בלולאה על הביטמפדטא נבדוק את צבע הפיקסל ואם הוא שווה לצבע אדום(ff0000), נהפוך אותו לשקוף:

 

//הגדרנו את האטימות כאמת כיוון שאנחנו רוצים לשקף חלק מהביטמפדטא
var bmd:BitmapData = new BitmapData(mc.width,mc.height,true);
bmd.draw(mc);
//מעבר על כל הפיקסלים במפת הסביות שלנו
//i רוחב
//j גובה
for(var i:uint=0;i<bmd.width;i++)
{

for(var j:uint=0;j<bmd.height;j++)
{
//בדיקה של צבע הפיקסל הספציפי
if(bmd.getPixel(i,j)==0xff0000)
{
//השמת צבע "שקוף" על הפיקסל הנוכחי
//המספר המועבר הוא בעצם מספר רגיל+שני ספרות בסוף המציינות את רמת השקיפות
bmd.setPixel32(i,j,0x00000000);
}
}

}

//איתחול המחלקה ביטמפ ויציקת הביטמפדטא לתוכה
var bm:Bitmap = new Bitmap(bmd);
//יצירת ילד אל הבמה
addChild(bm);


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