मैं सप्ताहों से एक समस्या को हल करने की कोशिश कर रहा हूं और मुझे अंततः इस वेबसाइट पर प्रश्न पूछना है।

संकट :-

जब उपयोगकर्ता वीडियो विज्ञापन चलाता है तो अंक बढ़ जाते हैं और उपयोगकर्ता को पुरस्कृत किया जाता है। लेकिन जब यूजर पॉइंट्स से कुछ खरीदता है तो पॉइंट्स कम नहीं हो रहे हैं।

मेरी समझ से यह एक वस्तु उन्मुख समस्या है।

यह कोड देखें स्निपेट:

पायथन कोड:

class PlayScreen(Screen):

# Function for display sneak peak (Ad Advantage)
    def Purchase_For_points(self):       #This FUnction will be called when user purchases some hint
        // Irrelevant Code
        app = MDApp.get_running_app()
        app.Num -= 1                     #After Purchase Deducted 1 Point

    def VideoAdPopup(self):
        video_dialog = MDDialog(title = "Watch an Ad",text = "Watch a small video Ad In Exchange of Reward",
                       size_hint = [1,0.3],auto_dismiss = False,text_button_ok = "Ok",text_button_cancel = 
                       "Cancel",events_callback = self.videocallback)

        video_dialog.open()

    def videocallback(self,text_of_Selection,popup_widget):  #Popup Function for rewarded ads
        if(text_of_Selection == "Ok"):
            SlipsApp.ads.show_rewarded_ad()     #Ad is Shown and rewards will be handled accordingly
        else:
            print("User did not want to watch ad")


class SlipsApp(MDApp):

    # These are our Admob Ad IDs
    APP = "ca-app-pub-XXXXXXXXXXXXXXXXXXXX"
    BANNER = "ca-app-pub-XXXXXXXXXXXXXXXXXXXX"
    INTERSTITIAL = "ca-app-pub-XXXXXXXXXXXXXXX"
    REWARDED_VIDEO = "ca-app-pub-XXXXXXXXXXXXXXXXX"
    TEST_DEVICE_ID = "3C91BAC5C088815B62389497AC1E309D"
    # Creating Ad Instance
    ads = KivMob(APP)

    #Number oF Rewards(Points)
    Num = NumericProperty(5)       #Variable for points

    def __init__(self, *args,**kwargs):
        self.theme_cls.theme_style = "Dark"
        super().__init__(*args,**kwargs)
        self.reward = Rewards_Handler(self)

    #Build Function
    def build(self):
        # Loading Ads
        self.ads.add_test_device(self.TEST_DEVICE_ID)
        self.ads.new_banner(self.BANNER, False)
        self.ads.new_interstitial(self.INTERSTITIAL)
        self.ads.request_banner()
        self.ads.set_rewarded_ad_listener(self.reward)
        self.ads.load_rewarded_ad(self.REWARDED_VIDEO)
        self.ads.show_banner()
        return intro()

#Class For Handling Rewards Callback Functions
class Rewards_Handler(RewardedListenerInterface):
    def __init__(self,other):
        self.game = other

    #Overriding Rewards Callback Functions
    def on_rewarded(self, reward_name, reward_amount):
        self.game.Num += 1                  #Reward given 1 Point
        print("User Given 1 reward")

कीवी कोड:-

<PlayScreen>:
    name: 'PlayScreen'

    MDLabel:
        text:"  Points : "+str(app.Num)    #Showing Points On Screen
        pos_hint:{"top":1.35}
1
Abhay Jaiswal 9 अप्रैल 2020, 12:56

1 उत्तर

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

हाँ, आप सही कह रहे हैं यह एक वस्तु समस्या है। समारोह में PlayScreen वर्ग में Buy_For_points()। आप ऐप क्लास तक पहुंचने के लिए फिर से ऑब्जेक्ट बना रहे हैं। यह नई ऑब्जेक्ट में सभी विशेषताओं की प्रतिलिपि बनायेगा और हर बार रनिंग ऐप के नए ऑब्जेक्ट में संख्या घटाएगा।

और, स्क्रीन पर जो दिखाया जाता है वह ऐप स्टार्टअप पर बनाए गए मुख्य ऐप ऑब्जेक्ट का न्यूम वेरिएबल है। तो, संख्या चर को कम करने और बढ़ाने के लिए आपके पास मुख्य ऐप ऑब्जेक्ट तक पहुंच होनी चाहिए।

आपके कोड में मैंने देखा है कि आपने init विधि द्वारा रिवार्ड्स_हैंडलर क्लास को ऐप क्लास की एक्सेस दी है। तो रिवार्ड्स_हैंडलर क्लास में गेम ऑब्जेक्ट मुख्य ऐप ऑब्जेक्ट के समान है।

रिवार्ड्स_हैंडलर वर्ग में अंक घटाने के लिए एक अलग फ़ंक्शन बनाएं क्योंकि यह वह वर्ग है जो इनाम से संबंधित चीजों को संभालता है

class Rewards_Handler(RewardedListenerInterface):
    def decrementReward(self):
        self.game.Num -= 1

इस फ़ंक्शन को विभिन्न वर्गों से एक्सेस करने के लिए आप ऐप क्लास में एक फ़ंक्शन बना सकते हैं यह स्थिर विधि होनी चाहिए ताकि आप ऑब्जेक्ट्स में कोई अन्य ऑब्जेक्ट और ट्रैप न बनाएं

class SlipsApp(MDApp):
    @staticmethod
    def decrement(element): #The element will be the main app object.
        element.reward.decrementReward()

अब उस वर्ग तक पहुँच प्राप्त करने के लिए जिसमें आप इस फ़ंक्शन का उपयोग कमी के लिए करना चाहते हैं। कक्षा में बस एक init() विधि जोड़ें

class PlayScreen(Screen):
    def __init__(self, **kw):
        super().__init__(**kw)
        self.app = MDApp.get_running_app() #this is main app object

    def Purchase_For_points(self):
        SlipsApp.decrement(self.app) #passing main App object.
0
Abhay Gupta 13 अप्रैल 2020, 13:05