Как вознаграждать пользовательские баллы в kivy из вознагражденных видеообъявлений - PullRequest
1 голос
/ 09 апреля 2020

Я пытаюсь решить проблему с Недель, и мне нужно наконец задать вопрос на этом сайте.

Проблема: -

Когда пользователь воспроизводит видео Ad, баллы увеличиваются и пользователь вознагражден. Но когда пользователь покупает что-то из точек, то точки не уменьшаются.

Насколько я понимаю, это объектно-ориентированная проблема.

См. Этот фрагмент кода:

Python Код:

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 Ответ

0 голосов
/ 13 апреля 2020

Да, вы правы, это проблема объекта. В функции Purchase_For_points () в классе PlayScreen. Вы снова создаете объект для доступа к классу App. Это скопирует все атрибуты в новом объекте и уменьшит Num каждый раз в новом объекте Running App.

И, то, что показано на экране, переменная Num основного объекта приложения, которая создается при запуске приложения. Итак, для уменьшения и увеличения переменной Num у вас должен быть доступ к основному объекту приложения.

В вашем коде я вижу, что вы предоставили доступ класса App к классу Rewards_Handler методом init, Таким образом, в классе Rewards_Handler игровой объект совпадает с Главный объект приложения .

создает в классе Rewards_Handler другую функцию для уменьшения значения, поскольку это класс, который обрабатывает вещи, связанные с вознаграждением

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

Для доступа к этой функции из разных классов вы можете создать функцию в классе приложения. Это должен быть метод stati c, чтобы вы не создавали другой объект и не ловили объекты

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.
...