Tal Siach

מדריך · יאללה משלוח, תל אביב · ספטמבר 2026

איך בונים משחק של העיר שלכם עם סוכן AI

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

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

יוצא ממקור ה-Blender של המשחק, חתוך ל-120 מטר סביב המזרקה. 237 אלף משולשים, 1.2 MB.

הרעיון האחד

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

לא צריך להיות מהנדס משחקים. צריך אבן דרך ראשונה קטנה, שיטה שאפשר להעתיק, ופרומפטים להדבקה. זה העמוד הזה. החלק שלי היה לבחור את ההיקף, את המשחקיות, מה חשוב ויזואלית, ולהסתכל על כל רינדור. הסוכן כתב את ה-Python ב-Blender, חיבר את Three.js, כתב את הבדיקות והריץ אותן.

מה תבנו

משחק דפדפן עם לולאה אחת שהשחקן חוזר עליה:

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

והצינור שגורם לעיר להיראות כמו העיר שלכם:

01
OpenStreetMap + נתונים עירוניים פתוחים
כבישים, שבילי אופניים, קווי מתאר של בניינים
02
קואורדינטות מקומיות משותפות
מטרים, נקודת מוצא אחת, חוזה צירים אחד
03
Python בתוך Blender
מודול אחד לכל נקודת ציון, ניתן לשחזור
04
ייצוא GLB
סטטי מאוחד, תפקידי חומרים וחלקים זזים נשמרים
05
Three.js בדפדפן
לולאת משחק, ניווט, בדיקות

מה צריך

1להגדיר לולאה אחת

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

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

פרומפט · לקבוע את הלולאה01
Build a browser-playable game about [local activity]. State the immediate objective, level objective, progression and lose condition. Keep the tone affectionate. Make the first playable loop coherent before adding content. Use an original, unbranded visual identity. List what the player does every 30 seconds and how they know they succeeded.

2לנעול את האמת בשטח

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

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

בתל אביב נקודת המוצא הייתה קו אורך 34.774207, קו רוחב 32.077963. ב-Blender, X מזרח, Y צפון, Z למעלה. Three.js מקבל [x, z, -y]. כל נכס חי על הרשת האחת הזאת. זה קירוב מקומי שטוח, וזה בסדר גמור לרובע קומפקטי.

The in-game navigation map
המפה במשחק, בנויה מאותן קואורדינטות כמו העולם
Crossings and signs on Dizengoff
מעברי חצייה ושלטים שמוקמו מנתוני מפה, ואז נבדקו מול תמונות

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

פרומפט · ייחוס למקום אמיתי02
Reconstruct [specific 100 to 200 m section] from real evidence. Gather street and bike-lane geometry, building footprints, dated street-level photos and a matching aerial. Record source URLs, IDs, retrieval dates and photo capture dates. Lock one hero camera with coordinates, heading and field of view. Distinguish measured geometry from photo estimates and invented detail. Do not start with a generic city and label it afterward.

3לבנות את המקום מקוביות

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

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

4למדל נקודת ציון אחת ב-Blender

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

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

The Cinema Hotel in Blender
מעבר ראשון ב-Blender על מלון סינמה, 14,660 משולשים
First assembly of the square
הרכבה ראשונה של הכיכר בדפדפן

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

פרומפט · להאציל נכס אחד03
Build only [named building] in Blender from the supplied photos and footprint. Return a reproducible Python module, .blend, preview and a short source/assumption report. Use metres and the provided geographic origin. Preserve the actual plan; match facade rhythm, balconies, ground floor and signs. Keep articulated parts as separate nodes and keep material roles separate. No downloaded 3D assets. Do not edit the parent project or deploy anything. Give the parent exact orientation, dimensions and triangle count.

5לטעון ב-Three.js ולרכוב משלוח אחד

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

המים הולכים לשיידרים על ה-GPU על זמן שחלף, אז הם זזים אותו דבר בכל קצב פריימים וה-CPU אף פעם לא בונה מחדש את הרשת. אנשים ורכבים שחוזרים על עצמם עוברים instancing: רשת אחת, הרבה עותקים, draw call אחד. ככה 487 הולכי רגל עולים בערך כמו כמה בודדים.

Fountain, frame A
המזרקה, מהשיידר
Frishman and the promenade
פרישמן פוגש את הטיילת
The promenade
הטיילת מורכבת

מה יש לכם: הקלטת מסך של לולאה אחת שלמה בדפדפן.

6לשאול "איפה זה?" לפני שמראים את התשובה

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

הרף שלי הוא שלושה זיהויים עיוורים ברצף. מבקר AI טרי הוא ראיה שימושית. המבחן האמיתי הוא תל אביבי שמסתכל על המסך ואומר "אני עובר פה כל יום."

The fountain before the critique round The fountain after the critique round
beforeafter
המזרקה לפני ואחרי סבב ביקורת אחד. גררו את הידית.

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

פרומפט · הביקורת העיוורת, שני שלבים04

שולחים את שלב אחד לבד. את שלב שתיים רק אחרי שהוא עונה.

Stage one. You are an independent critic. From this neutrally named render alone, identify the street or place and the viewing direction. State your confidence and what you based it on. Do not ask for hints.

Stage two, sent only after stage one is answered. Here is the dated reference photo from the same angle. List the differences in street geometry, scale, facade proportions, signs, cars, materials and lighting. Rank the three changes with the greatest recognition benefit. Do not reward labels for fixing incorrect geography.

7לתקן דבר אחד, ואז למדוד

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

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

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

“i think the wow factor is less from trees its more form street shapes building roads signs cars”

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

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

פרומפט · לתקן את צוואר הבקבוק05
Pick the highest-impact mismatch from the critique. Change only the responsible asset or system. Preserve coordinates and camera. Rebuild, capture the same view and have a different critic compare. Report the actual result even if the improvement is small. Measure performance using the same device and method as last time, and say what they were.

8להגדיל קטע בדוק אחד בכל פעם

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

Opera Square
משחיקכיכר האופרה מורכבת
Carmel Market
מחקר נוףשוק הכרמל מחובר למסלול
Navigation on a phone
ניווט ברוחב טלפון
מסך התדריך עם מפת אזור המשלוחים במשחק
מסך התדריך לפני משמרת: הרובע המחובר בוורוד, השאר מסומן "בקרוב". שחקנים צריכים לדעת איפה המשחק נגמר.

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

פרומפט · לשמור את שובל הראיות06
After each meaningful milestone, save the exact prompt, sources, before/after render, script/build, validation result and one reusable lesson. Mark retrospective summaries as summaries. Keep concept art separate from actual screenshots. Never record a test as passed unless it ran.

דוגמה מלאה: כיכר דיזנגוף

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

חבילת המקורות

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

המרת הקואורדינטות

כל מקור מומר לאותם מטרים מקומיים לפני שמשהו ממודל:

east  = (longitude - originLongitude) * 111320 * cos(originLatitude in radians)
north = (latitude  - originLatitude)  * 111320
Blender position  = (east, north, elevation)      # X east, Y north, Z up
Three.js position = [east, elevation, -north]    # X east, Y up, Z south

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

החלקים עם השמות

הייצוא של הכיכר מכיל, בין השאר: facade_cinema, facade_perimeter, fountain_metal, water_water, water_jet, dizengoff_world (הקרקע), פלוס נכסי רמזורים, מכוניות ודמויות נפרדים.

הביקורת העיוורת הראשונה

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

טעויות לדלג עליהן

כל אחת מאלה עלתה לי לפחות בנייה מחדש.

וארבעה באגים שתפגשו, עם התיקון:

החומרים יוצאים שטוחיםתסמיןזכוכית, מתכת וריצוף מרונדרים כאותו משטח גיריסיבההחספוס והמתכתיות נזרקו בייצואתיקוןלשמור תפקידי חומרים בסקריפט הייצואבדיקהלהדפיס חומרים ותכונות מה-GLB הטעון אחרי כל ייצוא
המצלמה מסתכלת לכיוון הלא נכוןתסמיןסיור הפתיחה מראה את גב הכיכרסיבהאינטרפולציית המצלמה חוצה פינת בניין ובוחרת כיוון שגויתיקוןלנעול את נקודת המוקד של הפתיחה ולהגביל את האינטרפולציהבדיקהרינדור פתיחה שמור שמושווה לתצוגת הייחוס אחרי כל בילד
חיבור שנראה מחובר לא באמת מחוברתסמיןה-GPS נתקע והקורקינט נופל מקצה טרסה בלי דרך חזרהסיבההטלת מסלול לא מוגבלת וקצה אחד בלי חיבורתיקוןהטלה מוגבלת, התאוששות מאומתת לשביל, נקודות "בלי חיבור" מפורשותבדיקהביקורת מסלול שבודקת פיזית כל חיבור
איחוד של הכול הורג את קצב הפריימיםתסמיןרשת ענקית אחת, ה-culling לא עושה כלוםסיבהכל העיר אוחדה לאובייקט אחדתיקוןקבוצות סטטיות עם גבולות מרחביים, instancing לחזרותבדיקהdraw calls ומשולשים שנמדדים בבילד האמיתי בדפדפן

פרומפט הפתיחה

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

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

מלאו את הקלטים. אל תיגעו בכללים.

Use the attached guide as a workflow for building an original browser-playable 3D game. Adapt the method to my location and idea; do not copy Tel Aviv-specific coordinates, names or geometry.

My inputs:
- Place and small starting area: [city, street or square; about 100 to 200 m]
- Player activity and objective: [what the player does and how they succeed]
- Visual direction: [stylized, low-poly, realistic proportions, etc.]
- Target devices: [desktop, mobile, or both]
- Available reference photos and maps: [links or files]
- Time and compute constraints: [optional]

First read the guide and inspect the available project and tools. Identify the essential missing inputs. Check whether you can run Blender, Node.js and a browser. State any unavailable tools instead of pretending to use them.

Create a short implementation brief: first playable loop, controls, success, failure, restart, one small geographic boundary and explicit exclusions.

Before modeling the location, collect dated references, mapped roads and building footprints. Record source URLs and IDs and separate measured facts, photo estimates and invented detail. Pick one shared origin, units, axis conversion and a locked comparison camera. Do not substitute a generic street.

Build a graybox to check scale and clearance. Then create original geometry using reproducible Blender Python scripts. Save the source, .blend, .glb, preview and source/assumption notes. Preserve named articulated parts and material roles needed for animation and customization. If multiple workers are available and appropriate, give each one bounded asset ownership and the same coordinate and export contract.

Load the exports in Three.js. Implement one complete playable task before expanding the map. Derive navigation and blockers from the same assembled world, and test the actual exports. Keep the environment recognizable from the player's camera, not just from an aerial showcase.

Capture the locked view and compare it with the dated reference. For an independent recognition test, show a fresh reviewer only the neutral render first; reveal the reference afterward. Fix the highest-impact mismatch, rebuild and repeat. Do not claim recognition based only on your own review.

Use batching, instancing and culling where appropriate. Measure the real browser build and report the device, viewport, method and remaining limits. Verify controls, collisions, completion, failure, restart and loading. If mobile is a target, distinguish responsive layout from physical-phone tests.

Keep a progress log with prompts, sources, before/after views, validation and next steps. Work locally and make each milestone reviewable. Do not publish or connect external services without authorization. Never invent successful tests, precise geography, playtest scores, development costs or elapsed time.

Start now with the tool check, the brief and the reference packet for the first section. Continue through the first runnable, reviewable milestone; do not stop after giving me a plan.

מבנה הקבצים שהפרומפט מתייחס אליו

רינדורים מהבילדים של ספטמבר 2026. התוויות אומרות מה משחיק ומה מחקר נוף.

פריסת טלפון

מה זה עדיין לא עושה

נתוני מפה © תורמי OpenStreetMap (ODbL) והנתונים הפתוחים של עיריית תל אביב-יפו. Blender 4.5, Three.js, Node.js 22, וסוכן קוד. תמונות הייחוס שייכות לצלמים שלהן ולא מופצות כאן. מוזיקה: "Costa Cruising", טראק שלי שנעשה עם Suno. בזמן הבנייה המשחק נקרא Tel Aviv Run.

בנו את העיר שלכם

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