मैं Pygame सीखने की प्रक्रिया में हूं, और समय-समय पर मैंने Pygame में स्प्राइट फ्रेमवर्क का उपयोग करके ट्यूटोरियल पर ठोकर खाई है। यह मेरे लिए स्पष्ट नहीं है कि उन्होंने अन्य तरीकों के विपरीत इस ढांचे का उपयोग करने के लिए क्यों चुना है; एक स्प्राइट ढांचे का उपयोग चल वस्तुओं के लिए एकमात्र उपलब्ध विधि है, या कोई और तरीका है? स्प्राइट फ्रेमवर्क वास्तव में क्या है और यह क्या वांछनीय बनाता है? एक ट्यूटोरियल उदाहरण में, मैंने उस व्यक्ति को यह कहते हुए भी सुना कि "यह इस पूरी चीज़ को बहुत आसान बना देता है।" तो स्प्राइट ढांचे के कौन से गुण इसे अन्य तरीकों से बेहतर बनाते हैं (यदि वे मौजूद भी हैं)?

पढ़ने के लिए धन्यवाद :-)

1
Curious Bill 3 पद 2019, 23:35

1 उत्तर

सबसे बढ़िया उत्तर

जबकि PyGame एक पुस्तकालय है जिसमें ग्राफिक्स, बिटमैप, रेखाएं और आकार खींचने के लिए बहुत सारी विधियां हैं। प्रमुख गेम उपयोग-मामलों में से एक बिटमैप छवियों को खींचना और स्थानांतरित करना है। इस प्रकार के संचालन में खेलों की एक बड़ी श्रृंखला शामिल होती है, विशेष रूप से शुरुआती "आर्केड" गेम।

आम तौर पर एक खेल चल और स्थिर भागों से बना होता है, और अंततः टकराव के लिए परीक्षण किए जाने की आवश्यकता होती है। दीवारों, प्लेटफार्मों, राक्षसों, गोलियों, पेड़ों आदि जैसी चीजों को कभी-कभी खेल यांत्रिकी के हिस्से के रूप में खिलाड़ी से टकराने की जरूरत होती है।

बिटमैप टकराव सतही रूप से काफी आसान है। बस परीक्षण करें कि क्या खिलाड़ी बिटमैप द्वारा कब्जा कर लिया गया आयत टकराने योग्य आयतों के कब्जे वाले आयतों के साथ प्रतिच्छेद करता है। लेकिन क्या होगा यदि आपका बिटमैप वर्गाकार नहीं है, और कोनों या कुछ नुकीले हिस्से के आसपास का क्षेत्र "वहां नहीं" है। फिर तुम कैसे टकराते हो? (कोड को अन्य बिटमैप के विरुद्ध प्रति-पिक्सेल परीक्षण करना होता है)।

पायगैम स्प्राइट क्लास में पहले से ही बिटमैप स्प्राइट बनाने, उन्हें स्थानांतरित करने और टकराव के परीक्षण के लिए लिखे गए बहुत से आवश्यक बुनियादी ढांचे हैं। इसके अलावा यह वस्तु समूहों से टकराने का भी समर्थन करता है।

सभी "ग्रंट-वर्क" कोडिंग पहले से ही पुस्तकालय में की जा चुकी है, एक कुशल तरीके से लिखी गई है। कई बार मैंने यहां SO पर सवालों के जवाब दिए हैं, जहां लेखक ने मूल रूप से परीक्षण और आंशिक रूप से डीबग कोड लिखा है, उन्हें लिखने की आवश्यकता नहीं है। यह कोड सीखने के लिए अच्छा है, लेकिन अगर आप वास्तव में एक तैयार उत्पाद तक पहुंचना चाहते हैं, तो आप स्प्राइट लाइब्रेरी का उपयोग कर सकते हैं, और गेम डिज़ाइन पर उस बचाए गए समय को खर्च कर सकते हैं। यह आप पर निर्भर है, बिल्कुल।

उत्तर को पूरा करने के लिए, यहाँ एक सरल स्प्राइट उदाहरण दिया गया है:

import pygame
import random

# Window size
WINDOW_WIDTH    = 400
WINDOW_HEIGHT   = 400
WINDOW_SURFACE  = pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE

INKY_BLACK = ( 18, 18, 67)


class DemoSprite( pygame.sprite.Sprite ):

    def __init__( self, image_filename, x, y ):
        ### Called when the sprite is created.  Do initialisation here.
        pygame.sprite.Sprite.__init__(self)
        self.image       = pygame.image.load( image_filename ).convert_alpha()   # the image used
        self.rect        = self.image.get_rect()                                 # bounding rectangle for collision
        self.rect.center = ( x, y )                                              # Initial position
        self.movement    = ( random.randrange(-2, 3), random.randrange(-2, 3) )  # move randomly

    def update( self ):
        ### Called to move, or change the state of the sprite
        dx, dy = self.movement
        self.rect.x += dx
        self.rect.y += dy

        # make sure we're still on the screen, if not - wrap around
        if ( self.rect.x < 0 ):
            self.rect.x = WINDOW_WIDTH
        elif ( self.rect.x > WINDOW_WIDTH ):
            self.rect.x = 0
        if ( self.rect.y < 0 ):
            self.rect.y = WINDOW_HEIGHT
        elif ( self.rect.y > WINDOW_HEIGHT ):
            self.rect.y = 0




### MAIN
pygame.init()
window = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), WINDOW_SURFACE )
pygame.display.set_caption("Sprite Demo")


# Add some sprites
sprite_group = pygame.sprite.Group()
for i in range( 30 ):
    # Random position within the middle 80% of screen 
    pos_x = random.randrange( WINDOW_WIDTH//10, WINDOW_WIDTH-WINDOW_WIDTH//10 )
    pos_y = random.randrange( WINDOW_HEIGHT//10, WINDOW_HEIGHT-WINDOW_HEIGHT//10 )
    sprite_group.add( DemoSprite( "alien.png", pos_x, pos_y ) )


clock = pygame.time.Clock()
done = False
while not done:
    # re-position all the cars
    sprite_group.update()

    # Handle any collisions
    # Simply removes the sprites if they collide
    for alien in sprite_group:
        collided_with = pygame.sprite.spritecollide( alien, sprite_group, False )
        collided_with.remove( alien ) # other than ourselves
        if ( len( collided_with ) > 0 ):
            sprite_group.remove( alien )   # it's now gone

    # Handle User-input Events
    for event in pygame.event.get():
        if ( event.type == pygame.QUIT ):
            done = True
        elif ( event.type == pygame.MOUSEBUTTONUP ):
            # On mouse-click, add a new sprite (at the cursor)
            mouse_pos = pygame.mouse.get_pos()
            sprite_group.add( DemoSprite( "alien.png", mouse_pos[0], mouse_pos[1] ) )

    # Handle User Movement keys
    keys = pygame.key.get_pressed()
    #if ( keys[pygame.K_UP] ):
    #    print("up")

    # Update the window, but not more than 60fps
    window.fill( INKY_BLACK )
    sprite_group.draw( window )
    pygame.display.flip()

    # Clamp FPS
    clock.tick_busy_loop(60)


pygame.quit()

स्प्राइट लाइब्रेरी का उपयोग करते हुए, हम कोड की 5 पंक्तियों में हर स्प्राइट को हर दूसरे स्प्राइट से टकराने में कामयाब रहे। निश्चित रूप से यह एक साधारण आकस्मिक मामला है, लेकिन यह आसानी से गोलियों और एलियंस, या एक खिलाड़ी और प्लेटफार्मों के sprite_groups हो सकता था - अभी भी बहुत अधिक कोड नहीं होता।

यह आसान, तेज़ और पहले से लिखा हुआ है।

अगर आप अपना खुद का लिखना चाहते हैं, अच्छा! यदि आप पुस्तकालय का उपयोग करना चाहते हैं, तो यह भी बहुत अच्छा है। यह आपका कोड है, आप जैसा चाहें वैसा करें।

1
Kingsley 4 पद 2019, 00:51