אפקטי ספרייט וטקסט
צל, קו מתאר, זוהר וטשטוש על ספרייטים דו-ממדיים ועל טקסט, עם מה כל אחד עולה, מה הוא עושה לספרייט נע, ומתכון-היד שהוא מחליף.
למה זה נועד#
עד עכשיו ספרייט דו-ממדי יכול היה לשאת גוון ותמונה, ושום דבר אחר. כדי להרים דמות מעל הרקע שלה הייתם צריכים לבנות את האפקט ביד: ליצור ספרייט שני, לגוון אותו שחור, להזיז אותו, לשים אותו מאחורי, ולשמור אותו בקצב עם הראשון בכל פריים בודד. זה עובד. זה גם ארבע שורות נוספות של הנהלת חשבונות לכל דמות, וביום שבו שוכחים אחת מהן הצל נגרר מאחורי הבעלים שלו.
ארבע פקודות עושות את זה בשבילכם, על ספרייטים ועל טקסט:
hero = LoadSprite("hero.png")
SpritePosition(hero, 160, 120)
SpriteShadow(hero, 4, 4, 6, 128) ' offset x, offset y, softness, opacity
SpriteOutline(hero, 2, 255, 255, 255) ' thickness, colour
SpriteGlow(hero, 0, 240, 255, 8) ' colour, size
DO
Sync()
LOOP
שום דבר אחר לתחזק. הזיזו את הספרייט, שנו לו גודל, הפכו אותו, נגנו את האנימציה שלו: האפקטים עוקבים.
ארבעת האפקטים#
צל (Shadow)#
SpriteShadow(spriteID, offsetX, offsetY, softness, opacity)
SpriteShadowColor(spriteID, red, green, blue)
offsetX ו-offsetY הם ביחידות המסך שלכם, נספרים באותה צורה כמו
SpritePosition: Y חיובי הוא למטה. softness פורש את הצל;
opacity נע מ-0 עד 255. הצבע שחור אלא אם אתם אומרים אחרת.
SpriteShadow(hero, 3, 5, 4, 110)
SpriteShadowColor(hero, 20, 0, 40) ' a cold shadow, not a grey one
צל עם opacity 0 הוא לא צל. ככה מכבים אותו.
קו מתאר (Outline)#
SpriteOutline(spriteID, thickness, red, green, blue)
קו המתאר עוקב אחרי הצללית של הספרייט, לא אחרי המלבן שהוא חי בו: PNG שקוף מקבל קו מתאר סביב הציור, לא סביב הקובץ. העובי ביחידות מסך, ו-1 עד 3 הוא הטווח השימושי. מעל זה שמונת הכיוונים שממנו קו המתאר בנוי מתחילים להיראות כשמונה אונות.
SpriteOutline(hero, 2, 255, 255, 255) ' the readable-on-anything outline
SpriteOutline(hero, 0, 0, 0, 0) ' off
זוהר (Glow)#
SpriteGlow(spriteID, red, green, blue, size)
הילה צבעונית, שנפרשת size יחידות מעבר לצללית. היא יושבת מאחורי
הספרייט ומול הצל, וזה מה שנותן לכם להשתמש בשניהם.
SpriteGlow(pickup, 255, 210, 0, 10) ' this one is worth walking to
טשטוש (Blur)#
SpriteBlur(spriteID, radius)
טשטוש הוא היוצא מהכלל. שלושת האחרים מצוירים סביב הספרייט; טשטוש מחליף את התמונה של הספרייט עצמו בעותק מטושטש שלה. זה אומר שני דברים ששווה לדעת:
- זה עולה כלום לכל פריים (התמונה המטושטשת מחושבת פעם אחת), וגם
- הטשטוש נחתך בקצה התמונה. ציור שנוגע בקצה ה-PNG שלו מאבד את החלק מההילה שהיה נופל מחוץ לגבולות. השאירו כמה פיקסלים שקופים של שוליים בקובץ אם אתם מתכננים לטשטש אותו.
SpriteColor ממשיך לעבוד על ספרייט מטושטש.
כיבוי הכול, וחזרה#
SpriteEffects(spriteID, 0) ' all four off
SpriteEffects(spriteID, 1) ' all four back, exactly as they were
SpriteEffects לא מוחק את ההגדרות שלכם. זה מתג, לא איפוס, כך שדמות
יכולה להבהב בלי שתצטרכו להצהיר מחדש על הצל שלה אחר כך.
אותם ארבעה על טקסט#
score = CreateText("SCORE 0")
TextPositionSet(score, 10, 10)
TextSizeSet(score, 6)
TextOutline(score, 3, 0, 0, 0) ' readable on any background
TextShadow(score, 2, 2, 4, 160)
TextGlow(score, 255, 80, 0, 6)
TextBlur(score, 0)
TextEffects(score, 1)
החתימות תואמות בדיוק לאלה של הספרייט, אז אין שום דבר חדש ללמוד. שני הבדלים בהתנהגות:
- זוהר מנצח את הרכות (softness) של צל. שניהם מצוירים על ידי אותו מנגנון, וזוהר בלי softness הוא בלתי נראה בעוד צל בלי softness הוא עדיין צל. כשמבקשים את שניהם, הזוהר מקבל את ה-softness.
- אלה חלים על טקסט וקטורי, לא על טקסט מבוסס-bitmap. טקסט שמצויר עם
TextFontImageהוא הרכבה של ספרייטים; הפקודות מתעלמות ממנו בשקט. השתמשו באפקטי הספרייט על הספרייטים במקרה הזה.
דוגמה מעובדת: קריא על כל דבר#
הבעיה שהפקודות האלה באמת פותרות היא ניגודיות שאתם לא שולטים בה. ניקוד לבן בלתי נראה על שלג; ניקוד שחור בלתי נראה בלילה. קו מתאר פותר את זה פעם אחת, לכל רקע שאי פעם תציירו.
CreateText(1, "SCORE 0")
TextPositionSet(1, 10, 10)
TextSizeSet(1, 8)
TextColorSet(1, 255, 255, 255, 255)
TextOutline(1, 3, 0, 0, 0)
hero = LoadSprite("hero.png")
SpriteName(hero, "hero")
SpriteShadow(hero, 4, 6, 5, 120)
SpriteOutline(hero, 2, 255, 255, 255)
points = 0
DO
points = points + 1
TextString(1, "SCORE " + Str(points))
Sync()
LOOP
קריאת אפקט בחזרה#
לכל פרמטר שאתם כותבים יש קורא, בדיוק כפי של-SpriteColor יש
SpriteColorRed. זה החוק של הניב, והפקודות האלה עוקבות אחריו.
IF SpriteEffectsEnabled(hero) = 1
SpriteEffects(hero, 0)
ENDIF
alpha = SpriteShadowAlpha(hero) ' 0 to 255
size = SpriteGlowSize(hero) ' 0 means no glow
הסט המלא, לכל משפחה: SpriteShadowOffsetX, SpriteShadowOffsetY,
SpriteShadowBlur, SpriteShadowAlpha, SpriteShadowColorRed,
SpriteShadowColorGreen, SpriteShadowColorBlue, SpriteGlowRed,
SpriteGlowGreen, SpriteGlowBlue, SpriteGlowSize,
SpriteOutlineThickness, SpriteOutlineRed, SpriteOutlineGreen,
SpriteOutlineBlue, SpriteBlurRadius, SpriteEffectsEnabled, בתוספת
אותם שבעה עשר עם קידומת Text.
שני חוקים ששווה לדעת:
- ספרייט שמעולם לא קיבל אפקט מדווח על עצמו כ-ON. זה מצב ברירת המחדל; תשובה 0 הייתה אומרת לתוכנית שהאפקטים שלה מנוטרלים לפני שהיא הגדירה אף אחד.
- שאלה על ספרייט שלא קיים עונה 0, היא לא עוצרת את התוכנית. ככה
הניב מתייחס לשאלות בכל מקום:
SpriteHitעונה 0 כשכלום לא נוגע, ותוכניות קוראות את ה-0 ההוא בלי לבדוק אותו.
מה זה עולה#
צל, קו מתאר וזוהר מצוירים, אז הם עולים draw calls: אחד לצל (שלושה כשהוא רך), ארבעה לזוהר, שמונה לקו מתאר. מסך עם מאתיים ספרייטים בעלי קו מתאר הוא מסך שמצייר אלף שמונה מאות quads, וזה יורגש. הם מיועדים לחופן הדברים שהשחקן אמור להסתכל עליהם: הדמות, הפריט, היחידה הנבחרת.
טשטוש עולה כלום לכל פריים.
חוק מעשי: אפקטים על מה שזז וחשוב, כלום על הרקע.
מה עובר לתוך משחק מיוצא#
| יעד | צל, קו מתאר, זוהר | טשטוש | אפקטי טקסט |
|---|---|---|---|
| העורך | כן | כן | כן |
| ייצוא HTML5 | כן | כן | כן |
| Native ו-wasm (Bevy) | כן | לא | לא |
צל, קו מתאר וזוהר בנויים מספרייטים רגילים, אז הם נוסעים לכל מקום שספרייטים נוסעים. טשטוש ואפקטי הטקסט צריכים גשר שיעדי ה-Bevy עדיין אין להם: דוח ההמרה של הייצוא נוקב בשמם במקום להשמיט אותם בשקט, כך שבנייה אומרת לכם מה היא לא הצליחה לשאת.
איפה האפקטים לא נמצאים#
אין SpriteEffect(id, "glow", ...) שלוקח את שם האפקט כמחרוזת. כל אפקט
הוא פקודה משלו כך שהפרמטרים שלו יכולים להיות בעלי שם, מתועדים ומושלמים
תוך כתיבה. עבור כל דבר מעבר לארבעת אלה, שתי פקודות נוספות נכנסות לתמונה:
SpriteBlendModes(id, src, dst) למיזוג אדיטיבי או מוכפל (אש, לייזר),
ו-SpriteShader(id, shaderID) לשים שיידר שקומפל על ידי LoadSpriteShader
על ספרייט. שתיהן הוכרזו בקטלוג הרבה זמן בלי מימוש, וקריאה להן העלתה
שגיאה; הן עובדות עכשיו.