AMcoder - javascript, python, java, html, php, sql

Pyglet: blit_into հյուսվածք և ալֆա

Ես վաղուց օգտագործում եմ pyglet և ինձ շատ է դուր գալիս: Ես ունեմ մի բան, որը կցանկանայի անել, բայց մինչ այժմ չեմ կարողացել անել:

Ես աշխատում եմ 2D ​​դերակատարման խաղի վրա և կցանկանայի, որ կերպարները կարողանայի տարբեր տեսք ունենալ, այսինքն՝ ես չէի ցանկանա օգտագործել ամբողջովին նախապես պատրաստված սփրայթեր, բայց փոխարենը կցանկանայի, որ լիներ մի շարք , ասենք, սանրվածքներ և սարքավորումներ, որոնք տեսանելի են խաղի հերոսների վրա:

Այսպիսով, այս բանն աշխատեցնելու համար, ես մտածեցի, որ դրա մասին շարունակելու ամենախելամիտ ձևը կլինի pyglet.image.Texture.create()-ի միջոցով հյուսվածք ստեղծելը և այդ հյուսվածքի վրա ճիշտ սփրայթի սկզբնաղբյուր պատկերները ջնջելը՝ օգտագործելով Texture.blit_into: Օրինակ՝ ես կարող էի մերկ մարդու պատկերը շողոքորթել հյուսվածքի վրա, ապա դրա վրա մազի հյուսվածքը և այլն:

human_base  = pyglet.image.load('x/human_base.png').get_image_data()
hair_style  = pyglet.image.load('x/human_hair1.png').get_image_data()

texture = pyglet.image.Texture.create(width=human_base.width,height=human_base.height)

texture.blit_into(human_base, x=0, y=0, z=0)
texture.blit_into(hair_style, x=0, y=0, z=1)

sprite = pyglet.sprite.Sprite(img=texture, x=0, y=0, batch=my_sprite_batch)

Խնդիրն այն է, որ երկրորդ պատկերը հյուսվածքի մեջ փչացնելը «վերագրում է» արդեն փչացած հյուսվածքը: Թեև երկու պատկերներն էլ ունեն ալֆա ալիք, ստորև (human_base) պատկերը չի երևում այն ​​բանից հետո, երբ hair_style-ը կպչում է դրա վրա:

Սա ընթերցողներից մեկը կարող է մտածել, թե ինչու դա այդպես վարվի, ասենք, երկու տարբեր pyglet.sprite.Sprite օբյեկտներ ստեղծելու փոխարեն, մեկը human_base-ի և մյուսը hair_style-ի համար և պարզապես տեղափոխեք դրանք միասին: Մի բան է վիճակահանության դասավորությունը. խաղը հիմնված է սալիկների վրա և իզոմետրիկ է, ուստի տեսանելի օբյեկտի տեսակավորումը, որը բաղկացած է տարբեր շերտերով (կամ դասավորված խմբերից, ինչպես դրանք անվանում է պիգլետը) բաղկացած է տարբեր շերտերով, մեծ ցավ կլինի:

Այսպիսով, իմ հարցն այն է, արդյոք կա ալֆան պահպանելու միջոց, երբ օգտագործում եք blit_into pyglet-ի հետ: Եթե ​​դա անելու ոչ մի միջոց չկա, խնդրում եմ, այս մասին շարունակելու այլընտրանքային ուղիների ցանկացած առաջարկ շատ գնահատելի կլինի:

12.09.2015

Պատասխանները:


1

Խառնուրդի ֆունկցիան ճիշտ սահմանելը պետք է շտկի սա.

pyglet.gl.glBlendFunc(pyglet.gl.GL_SRC_ALPHA,pyglet.gl.GL_ONE_MINUS_SRC_ALPHA)
21.01.2016
  • Սա ավելի լավ լուծում է թվում 14.08.2018

  • 2

    Ես հանդիպեցի նույն խնդրին և չկարողացա գտնել համապատասխան լուծում: Ըստ երևույթին, երկու RGBA պատկերներ/հյուսվածքներ, որոնք համընկնում են իրար, կհեռացվի տակի պատկերը: Մեկ այլ մոտեցում, որին ես հայտնեցի, յուրաքանչյուր կերպարի վրա «հագուստի պատկերի» օգտագործումն էր որպես անկախ սփրայթ՝ կցված խմբաքանակներին և խմբերին, բայց դա հեռու էր օպտիմալից և կտրուկ նվազեցրեց FPS-ը:

    Ես ստացա իմ սեփական լուծումը՝ օգտագործելով PIL-ը

    import pyglet
    from PIL import Image
    class main(pyglet.window.Window):
        def __init__ (self):
            TILESIZE = 32
            super(main, self).__init__(800, 600, fullscreen = False)
            img1 = Image.open('under.png')
            img2 = Image.open('over.png')
            img1.paste(img2,(0,0),img2.convert('RGBA'))
            img = img1.transpose(Image.FLIP_TOP_BOTTOM)
            raw_image=img.tostring()
            self.image=pyglet.image.ImageData(TILESIZE,TILESIZE,'RGBA',raw_image)
    
        def run(self):
            while not self.has_exit:
                self.dispatch_events()
                self.clear()
                self.image.blit(0,0)
                self.flip()
    x = main()
    x.run()
    

    Սա կարող է լինել ոչ օպտիմալ լուծումը, բայց եթե դուք բեռնում եք տեսարանի բեռնման մեջ, ապա դա նշանակություն չի ունենա, և արդյունքում դուք կարող եք անել գրեթե այն ամենը, ինչ ցանկանում եք (քանի դեռ այն չեք ջնջել: մեկ այլ հյուսվածք, հեհ): Եթե ​​ցանկանում եք PIL-ով սալիկների հավաքածուից ստանալ ընդամենը 1 կղմինդր (կամ սյունակ, տող կամ ուղղանկյուն տուփ), կարող եք օգտագործել Crop ֆունկցիան:

    10.03.2016
    Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..