Sprite மற்றும் உரை விளைவுகள்
2D sprites மற்றும் உரையின் மேல் Shadow, outline, glow மற்றும் blur, ஒவ்வொன்றும் என்ன செலவாகும், நகரும் ஒரு sprite-க்கு அது என்ன செய்யும், மற்றும் அது மாற்றும் கையால் செய்யப்பட்ட recipe என்பதுடன்.
இது எதற்காக#
இதுவரை ஒரு 2D sprite ஒரு tint-ஐயும் ஒரு படத்தையும் மட்டுமே சுமக்க முடியும், வேறு எதுவும் இல்லை. ஒரு கதாபாத்திரத்தை அதன் பின்னணியிலிருந்து தூக்க, நீங்கள் அந்த விளைவை கையால் கட்டமைக்க வேண்டியிருந்தது: இரண்டாவது sprite-ஐ உருவாக்கி, அதை கருப்பாக tint செய்து, அதை offset செய்து, அதை பின்னால் வைத்து, ஒவ்வொரு frame-உம் அதை முதலாவதுடன் ஒத்திசைவாக வைத்திருக்க வேண்டும். இது வேலை செய்யும். ஒவ்வொரு கதாபாத்திரத்திற்கும் இது நான்கு கூடுதல் வரிகள் bookkeeping கூட, மேலும் அவற்றில் ஒன்றை நீங்கள் மறக்கும் நாளில், shadow அதன் owner-க்குப் பின்னால் trail ஆகும்.
நான்கு commands, sprites-இலும் உரையிலும், அதை உங்களுக்காக செய்கின்றன:
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
வேறு எதையும் பராமரிக்க வேண்டியதில்லை. Sprite-ஐ நகர்த்துங்கள், scale செய்யுங்கள், flip செய்யுங்கள், அதன் அனிமேஷனை இயக்குங்கள்: விளைவுகள் பின்தொடரும்.
நான்கு விளைவுகள்#
Shadow#
SpriteShadow(spriteID, offsetX, offsetY, softness, opacity)
SpriteShadowColor(spriteID, red, green, blue)
offsetX மற்றும் offsetY, SpritePosition எண்ணும் அதே வழியில்,
உங்கள் சொந்த screen units-இல் உள்ளன: நேர்மறை Y கீழே.
softness shadow-ஐ பரப்புகிறது; opacity 0 முதல் 255 வரை
இயங்குகிறது. நீங்கள் வேறு விதமாகச் சொல்லாத வரை நிறம் கருப்பு.
SpriteShadow(hero, 3, 5, 4, 110)
SpriteShadowColor(hero, 20, 0, 40) ' a cold shadow, not a grey one
opacity 0 உள்ள ஒரு shadow, shadow இல்லை. அதை அணைப்பது இப்படித்தான்.
Outline#
SpriteOutline(spriteID, thickness, red, green, blue)
Outline, sprite இருக்கும் rectangle-ஐ அல்ல, sprite-இன் silhouette-ஐ பின்பற்றுகிறது: ஒரு transparent PNG, கோப்பைச் சுற்றி அல்ல, drawing-ஐச் சுற்றி ஒரு outline-ஐப் பெறும். Thickness screen units-இல் உள்ளது, மேலும் 1 முதல் 3 வரை பயனுள்ள range. அதற்கு மேல், outline கட்டமைக்கப்படும் எட்டு திசைகள் எட்டு lobes ஆகத் தெரியத் தொடங்கும்.
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)
silhouette-ஐ தாண்டி size units பரவும் ஒரு வண்ண halo. இது
sprite-க்குப் பின்னாலும் shadow-க்கு முன்னாலும் அமர்கிறது,
இதனால்தான் நீங்கள் இரண்டையும் பயன்படுத்த முடியும்.
SpriteGlow(pickup, 255, 210, 0, 10) ' this one is worth walking to
Blur#
SpriteBlur(spriteID, radius)
Blur தான் மற்றவற்றைப் போலல்லாதது. மற்ற மூன்றும் sprite-ஐச் சுற்றி வரையப்படுகின்றன; blur sprite-இன் சொந்த படத்தை அதன் ஒரு blur செய்யப்பட்ட நகலால் மாற்றுகிறது. இதன் பொருள் தெரிந்துகொள்ள மதிப்புள்ள இரண்டு விஷயங்கள்:
- ஒரு frame-க்கு இது எதையும் செலவழிக்காது (blur செய்யப்பட்ட படம் ஒருமுறை மட்டுமே கணக்கிடப்படுகிறது), மற்றும்
- blur, படத்தின் விளிம்பில் clip செய்யப்படுகிறது. அதன் PNG-இன் விளிம்பைத் தொடும் ஒரு drawing, வெளியே விழக்கூடிய அதன் halo-இன் பகுதியை இழக்கும். அதை blur செய்யத் திட்டமிட்டால், கோப்பில் சில transparent பிக்சல்களின் மார்ஜினை விடுங்கள்.
SpriteColor ஒரு blur செய்யப்பட்ட sprite-இலும் தொடர்ந்து வேலை
செய்கிறது.
எல்லாவற்றையும் அணைத்தல், மீண்டும் இயக்குதல்#
SpriteEffects(spriteID, 0) ' all four off
SpriteEffects(spriteID, 1) ' all four back, exactly as they were
SpriteEffects உங்கள் அமைப்புகளை அழிக்காது. இது ஒரு reset அல்ல,
ஒரு switch, எனவே பின்னர் அதன் shadow-ஐ மீண்டும் declare செய்ய
வேண்டியதில்லாமல் ஒரு கதாபாத்திரம் flash ஆக முடியும்.
அதே நான்கும் உரையின் மேல்#
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)
இந்த signatures sprite-இன் signatures-உடன் சரியாகப் பொருந்துகின்றன, எனவே புதிதாகக் கற்க எதுவும் இல்லை. நடத்தையில் இரண்டு வேறுபாடுகள்:
- ஒரு glow, ஒரு shadow-இன் softness-ஐ விட வெல்லும். இரண்டும் அதே mechanism-ஆல் வரையப்படுகின்றன, மேலும் softness இல்லாத ஒரு glow கண்ணுக்குப் புலப்படாது, ஆனால் softness இல்லாத ஒரு shadow இன்னும் ஒரு shadow தான். நீங்கள் இரண்டையும் கேட்கும்போது, glow தான் softness-ஐ பெறும்.
- இவை vector உரைக்குப் பொருந்தும், bitmap-font உரைக்கு அல்ல.
TextFontImage-உடன் வரையப்பட்ட ஒரு உரை, sprites-இன் ஒரு கலவை; அதன் மேல் commands அமைதியாக புறக்கணிக்கப்படும். அந்த சூழலில் sprites-இன் மேல் sprite effects-ஐ பயன்படுத்தவும்.
ஒரு விவரிக்கப்பட்ட உதாரணம்: எதன் மேலும் படிக்கக்கூடியது#
இந்த commands உண்மையில் தீர்க்கும் பிரச்சினை, நீங்கள் கட்டுப்படுத்தாத contrast. பனியின் மேல் ஒரு வெள்ளை score கண்ணுக்குப் புலப்படாது; இரவில் ஒரு கருப்பு score கண்ணுக்குப் புலப்படாது. ஒரு outline, நீங்கள் எப்போதும் வரையப் போகும் ஒவ்வொரு பின்னணிக்கும், அதை ஒருமுறையே தீர்த்துவிடும்.
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
ஒரு விளைவை மீண்டும் படித்தல்#
நீங்கள் எழுதும் ஒவ்வொரு parameter-க்கும் ஒரு reader உண்டு,
SpriteColor-க்கு SpriteColorRed இருப்பது போல. இதுதான்
dialect-இன் விதி, மேலும் இந்த commands அதைப் பின்பற்றுகின்றன.
IF SpriteEffectsEnabled(hero) = 1
SpriteEffects(hero, 0)
ENDIF
alpha = SpriteShadowAlpha(hero) ' 0 to 255
size = SpriteGlowSize(hero) ' 0 means no glow
முழு தொகுப்பும், ஒவ்வொரு family-க்கும்: SpriteShadowOffsetX,
SpriteShadowOffsetY, SpriteShadowBlur, SpriteShadowAlpha,
SpriteShadowColorRed, SpriteShadowColorGreen,
SpriteShadowColorBlue, SpriteGlowRed, SpriteGlowGreen,
SpriteGlowBlue, SpriteGlowSize, SpriteOutlineThickness,
SpriteOutlineRed, SpriteOutlineGreen, SpriteOutlineBlue,
SpriteBlurRadius, SpriteEffectsEnabled, மேலும் அதே பதினேழு
Text prefix-உடன்.
தெரிந்துகொள்ள மதிப்புள்ள இரண்டு விதிகள்:
- ஒருபோதும் ஒரு விளைவும் கொடுக்கப்படாத ஒரு sprite, தன்னை ON என்று தெரிவிக்கும். அதுதான் இயல்பு நிலை; 0 என்று பதிலளிப்பது, ஒரு நிரல் எதையும் அமைப்பதற்கு முன்பே அதன் விளைவுகள் நிறுத்தப்பட்டுவிட்டன என்று சொல்லிவிடும்.
- இல்லாத ஒரு sprite பற்றி கேட்பது 0 என்று பதிலளிக்கும், அது
நிரலை நிறுத்தாது. dialect எல்லா இடங்களிலும் கேள்விகளை
இப்படித்தான் நடத்துகிறது: எதுவும் தொடப்படாதபோது
SpriteHit0 என்று பதிலளிக்கும், மேலும் நிரல்கள் அதைச் சோதிக்காமலேயே அந்த 0-ஐப் படிக்கின்றன.
இது என்ன செலவாகும்#
Shadow, outline மற்றும் glow வரையப்படுகின்றன, எனவே அவை draw calls-ஐ செலவழிக்கின்றன: shadow-க்கு ஒன்று (soft ஆக இருக்கும்போது மூன்று), ஒரு glow-க்கு நான்கு, ஒரு outline-க்கு எட்டு. இருநூறு outline செய்யப்பட்ட sprites கொண்ட ஒரு திரை, பதினெட்டு நூறு quads வரையும் ஒரு திரை, மேலும் அது தெரியும். விளையாட்டாளர் பார்க்க வேண்டிய சில விஷயங்களுக்காகவே இவை: கதாபாத்திரம், pickup, தேர்ந்தெடுக்கப்பட்ட unit.
Blur ஒரு frame-க்கு எதையும் செலவழிக்காது.
ஒரு நடைமுறை விதி: நகர்வதிலும் முக்கியமானதிலும் விளைவுகள், பின்னணியில் எதுவும் இல்லை.
Export செய்யப்பட்ட விளையாட்டுக்குள் எது கடக்கிறது#
| Target | Shadow, outline, glow | Blur | Text effects |
|---|---|---|---|
| Editor | ஆம் | ஆம் | ஆம் |
| HTML5 export | ஆம் | ஆம் | ஆம் |
| Native மற்றும் wasm (Bevy) | ஆம் | இல்லை | இல்லை |
Shadow, outline மற்றும் glow சாதாரண sprites-இலிருந்து கட்டமைக்கப்பட்டவை, எனவே sprites செல்லும் இடமெல்லாம் அவையும் பயணிக்கும். Blur மற்றும் text effects-க்கு, Bevy targets இன்னும் இல்லாத ஒரு bridge தேவை: export, அவற்றை அமைதியாக கைவிடுவதற்குப் பதிலாக, conversion report அவற்றைப் பெயரிடுகிறது, எனவே ஒரு build அது எதைக் கொண்டு செல்ல முடியவில்லை என்பதை உங்களுக்குச் சொல்கிறது.
விளைவுகள் இல்லாத இடம்#
effect பெயரை ஒரு string ஆக எடுக்கும் SpriteEffect(id, "glow", ...) என்று எதுவும் இல்லை. ஒவ்வொரு effect-உம் அதற்கே உரிய command,
இதனால் அதன் parameters பெயரிடப்பட்டு, ஆவணப்படுத்தப்பட்டு, நீங்கள்
தட்டச்சு செய்யும்போது complete செய்யப்படும். இந்த நான்கையும்
தாண்டிய எதற்கும், மற்ற இரண்டு commands பொறுப்பேற்கின்றன: additive
அல்லது multiplied blending-க்கு (ஒரு தீ, ஒரு laser)
SpriteBlendModes(id, src, dst), மற்றும் LoadSpriteShader-ஆல்
compile செய்யப்பட்ட ஒரு shader-ஐ ஒரு sprite-இல் வைக்க
SpriteShader(id, shaderID). இரண்டும் நீண்ட காலமாக ஒரு
implementation இல்லாமல் catalogue-இல் declare செய்யப்பட்டிருந்தன,
மேலும் அவற்றை அழைப்பது ஒரு error-ஐ எழுப்பியது; அவை இப்போது வேலை
செய்கின்றன.