משחק online - עזרה...

freak2100

New member
משחק online - עזרה...

אהלן אני מנסה לעשות מוד של משחק online לking pong 2 http://www.anykeysoft.net עכשיו, יש לי את המשחק (בפלאש) ואת האפליקציה שמשנה את הרזולוציה של המשתמש (בסי פלאס פלאס) עכשיו, הוספתי לאפליקציה שני קלאסים שכתבתי (אני גאה בעצמי שכתבתי אותם
במיוחד בהתחשב בעובדה שאני לא יודע סי פלאס פלאס
) * תקשורת בין האפלירציה לפלאש (בעזרת XMLSocket של פלאש וsocket רגיל באפליקציה) * תקשורת בין האפליקציה לאפליקציה במחשב מרוחק (בעזרת socket רגיל) עכשיו, תיאמתי בינהם והכל.... אני יכול לשלוח הודעות מפלאש לפלאש
התחלתי לעבוד על המשחק (בעצם אני עובד על זה כבר איזה חצי שנה... אבל רק אתמול עשיתי את התקשורת בין האפליקציה לפלאש ככה, עד אתמול השתמשתי בקוד גרוע שהורדתי מהאינטרנט שלא עבד כל כך טוב), ויצרתי משחק פשוט - כדור ושני פאדלים, בינתיים (בלי הבונוסים והיריות וכו'). עכשיו, הבעייה היא שיש לאג בין שני השחקנים... ויש לאג גם כשאני משחק בין שני חלונות על אותו מחשב
כרגע זה עובד ככה: * כל פאדל זז אצל השחקן הרלוונטי * כל שחקן שולח 10 פעמים בשנייה (בניגוד ל32 פריימים לשנייה - הFPS של המשחק) את המיקום של הפאדל שלו לשחקן השני * הכדור נוצר אצל הHOST, והמידע על המיקום שלו והמהירות ההתחלתית שלו נשלח לשחקן * כשהכדור פוגע באחד השחקנים, הוא שולח את המידע על המיקום של הכדור והמהירות שלו לשחקן השני עכשיו, הכל עובד טוב, אבל ככל שהמשחק מתקדם ככה לוקח לכדור יותר זמן עד שהוא קופץ מהפאדל השני. מה זאת אומרת? נניח אני הפאדל השמאלי, והכדור פוגע הפאדל הימני - אני לא רואה את זה מיד, אני רואה כאילו הכדור עובר דרך הפאדל הימני ופתאום הוא קופץ חזרה. עכשיו, יש לי חשד למה זה קורה... מה שאני חושב שקורה זה שאם נניח הכדור קופץ מהפאדל שלי ואני שולח את זה לשחקן השני, לוקח לזה נניח 2 פריימים להגיע לשחקן השני. ואז לא רק שהשחקן השני רואה את זה באיחור של 2 פריימים (זה לא נורא), אלא גם הכדור נמצא אצלו 2 פריימים לפני איפה שהכדור נמצא אצלי. ואז כשאני רואה שהכדור כבר הגיע אליו, אצלו יעברו רק עוד שני פריימים עד שהכדור יגיע לפאדל שלו, ואז יקח עוד 2 פריימים עד שהמידע על ההתנגשות יגיע אלי - ואז כבר יש לאג של 4 פריימים. וככה בכל התנגשות הלאג גדל... זאת ההשערה שלי. היא נראית לי די הגיונית
עכשיו, זה הפתרון שחשבתי עליו... לספור את מספר הפריימים שעברו מתחילת המשחק, וכל הודעה לשלוח עם מידע על הפריים שבו היא נשלחה. אז כששחקן מקבל הודעה, הוא בודק כמה פריימים עבר מאז שהיא נשלחה עד שהיא הגיעה אליו, נניח יצא לו 3 פריימים. ואז נניח הוא מקבל מידע על שינוי המיקום של הכדור - אז הוא משנה אותו, ואז מזיז אותו כאילו עברו עוד 3 פריימים. מה דעתכם? יש למישהו פתרון יותר טוב? איך עושים את זה במשחקים אחרים?
 

yoniBLA

New member
נשמע כמו פיתרון הגיוני,

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

freak2100

New member
אז אני צריך רק להוסיף את זמן השליחה

תודה
אני אנסה, נראה אם זה יעבוד כמו שצריך או יצור לי עוד בעיות
 

freak2100

New member
אוף... זה לא עזר :-\

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

freak2100

New member
אגב, יש לאג גם

כשזה בין שני חלונות פתוחים באותו מחשב...
 

Terminal Frost

New member
XML SOCKET איטי מדי

אתה צריך משהו יותר מהיר אני לא מכיר FLASH אז אני לא יכול לעזור בקטע טכני. במשחקים כבדים, למה ששאלת, כל קטעים של REAL TIME ממומשים בUDP, שם אין דבר כזה SOCKET כי אין "חיבור"/"צינור" בין שני מחשבים, זה חד-צדדי. מצד שני זה הרבה יותר מהיר תבדוק אם יש אפשרות להשתמש בUDP בFLASH, ואז תוכל להגיע גם ל32 עידכונים בשנייה
 

freak2100

New member
הבעייה היא לא בXML SOCKET

כי הוא שולח 240 הודעות לכל כיוון, חוץ מזה שהוא פועל על אותו מחשב... אלא בsocket שבין שני המחשבים הsocket הזה הוא בסי פלאס פלאס... אז אתה אומר שפרוטוקול UPD יותר מהיר מפרוטוקול TCP/IP? מה ההבדל בינהם? איך עובד UPD? אין איבוד של הודעות בדרך או משהו?
 

Terminal Frost

New member
...

גיגול תמיד יכול לעזור דבר שני ברור שעל אותו מחשב הSOCKET שלך יהיה מהיר ועצבני, אבל זה גם ברור שהמשחק הזה מיועד להיות משחק רשת שבו שני משתתפים ממקומות שונים בעולם יכולים לשחק, ובשביל זה אולי הSOCKET שלך איטי מדי בעיקרון יש כמה הבדלים עקרוניים בין TCP לUCP: - כדי לדבר בTCP יש לפתוח "צינור"/SOCKET בין שני לקוחות. בשביל UDP לא צריך צינור, פשוט שולחים הודעה - TCP בודק אם ההודעה שנשלחה באמת התקבלה ומקבל/שולח ACKים (אישורים) על קבלה/שליחה של הודעות, UDP לא מעניין אותו (שוב, בגלל שאין "חיבור") - פאקט TCP גדול ואיטי, פאקט UDP קטן ומהיר - TCP אמין מאוד ואיטי, UDP לא אמין אבל מפצה על זה במהירות
 

freak2100

New member
לא הבנת..

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

Ultra Spidey

New member
כמה פתרונות

לשלוח יותר מידע - בכמות הFPS לפאדל בפונג אין הרבה לאן לזוז, אז נסה לשלוח מידע רק כשהשחקן משנה כיוון (לא יעבוד אם המהירות של הפאדל לא קבועה)
 

freak2100

New member
תודה ../images/Emo13.gif

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

Alkhimey

New member
כמה אפשרויות

1) שמעתי שיש שרת פלאש. 2) לשלוח הודעה רק כשמשהוא קורה. למשל כדור פוגע בקיר, שחקן לוחץ על כפתור.
 

De-Panther

New member
אני לא חושב ששרת...|זבנג|../images/Emo23.gif../images/Emo185.gif

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