Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

02.12.2013, 20:38

C#, XNA Probleme mit Windows Phone Trial Mode

Ich möchte keine Werbung in mein Windows Phone Spiel einbauen(weil es viele Spieler stört), jedoch möchte ich deshalb einen Trial- und einen Bezahl-Modus machen. Man kann ein paar Level im Trial Modus spielen und für den Rest muss man das Spiel im Windows Phone Store kaufen. Das Spiel wird maximal 1 Euro kosten.
Ich möchte das Spiel zuerst im Trial- und im Bezahl-Modus testen bevor ich es veröffentliche. Deshalb habe ich eine kleine Test App als Beta Version in meinem Dev Center Account hochgeladen und die App anschließend auf meinem Windows Phone installiert. Die App befindet sich beim Start auf meinem Windows Phone sofort im Bezahl-Modus obwohl ich das Spiel nicht im Store gekauft habe. Eigentlich müsste sich die App doch im Trial-Modus befinden ?(
Warum wird sofort der Bezahl-Modus gestartet ohne dass man das Spiel im Store gekauft hat?
Kann es sein dass es daran liegt dass ich meine App als Beta hochgeladen habe? Funktioniert das vielleicht nicht mit einer Beta-App? Oder wo liegt das Problem?
Wie baut ihr euren Trial-Modus ein?

Ich habe es mit folgenden zwei Code-Versionen versucht, jedoch ist die App immer sofort im Bezahl-Modus.

Version 1:

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    Texture2D TrialSprite, PurchasedSprite;
    bool TrialmodeActive = false;
    bool TrialmodeDeactivateItNow = false;

    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
        TargetElapsedTime = TimeSpan.FromTicks(333333);
        InactiveSleepTime = TimeSpan.FromSeconds(1);
        this.graphics.IsFullScreen = true;
        #if DEBUG
          Guide.SimulateTrialMode = true;
        #endif
          if (Guide.SimulateTrialMode == true)
          {
              TrialmodeActive = true;
          }
    }

    protected override void Initialize()
    {        
        base.Initialize();
    }

    protected override void LoadContent()
    {
        spriteBatch = new SpriteBatch(GraphicsDevice);
        TrialSprite = Content.Load<Texture2D>("trialsprite");
        PurchasedSprite = Content.Load<Texture2D>("purchasedsprite");
        TouchPanel.EnabledGestures = GestureType.Tap;
    }

    protected override void Update(GameTime gameTime)
    {        
        if (TrialmodeDeactivateItNow == true)
        {
          if (Guide.SimulateTrialMode == false)
            TrialmodeActive = false;

          TrialmodeDeactivateItNow = false;
        }
        while (TouchPanel.IsGestureAvailable)
        {
            GestureSample gs = TouchPanel.ReadGesture();
            switch (gs.GestureType)
            {
                case GestureType.Tap:
                  if (Guide.SimulateTrialMode == true)
                      {
                      Guide.ShowMarketplace(PlayerIndex.One);
                      TrialmodeDeactivateItNow = true;
                      }
                break;
            }
        }
        base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);
        spriteBatch.Begin();
        if (TrialmodeActive == true)
            spriteBatch.Draw(TrialSprite, new Vector2(400, 100), Color.White);
        else
            spriteBatch.Draw(PurchasedSprite, new Vector2(400, 100), Color.White);
        spriteBatch.End();

        base.Draw(gameTime);
    }
}


Version 2:
Hier benutze ich Guide.IsTrialMode anstatt Guide.SimulateTrialMode.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public Game1()
  {
    ...
        if (Guide.IsTrialMode == true)
        {
            TrialmodeActive = true;
        }
        else
            TrialmodeActive = false;
   }

    protected override void Update(GameTime gameTime)
    {        
        if (TrialmodeDeactivateItNow == true)
        {
           if (Guide.IsTrialMode == false)
            TrialmodeActive = false;

          TrialmodeDeactivateItNow = false;
        }
        while (TouchPanel.IsGestureAvailable)
        {
            GestureSample gs = TouchPanel.ReadGesture();
            switch (gs.GestureType)
            {
                case GestureType.Tap:
                   if (Guide.IsTrialMode == true)
                      {
                      Guide.ShowMarketplace(PlayerIndex.One);
                      TrialmodeDeactivateItNow = true;
                      }
                break;
            }
        }
        base.Update(gameTime);
    }

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

2

03.12.2013, 06:42

Nun, Dein Code geht davon aus, dass der Trial-Mode per Default deaktiviert (false) ist und nur beim Debuggen aktiviert wird.
Übrigens würde ich Dir raten das ganze "== true" und "== false" rauszuwerfen.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

3

03.12.2013, 22:39

Warum steht Guide.SimulateTrialMode automatisch auf false wenn man eine Beta App auf dem Phone installiert? Folgender Code wird bei mir nämlich nie ausgeführt:

C#-Quelltext

1
2
3
4
 if (Guide.SimulateTrialMode == true)
          {
              //starte Trialmode
          }


Nur so funktioniert es:

C#-Quelltext

1
2
3
4
5
 Guide.SimulateTrialMode = true;
if (Guide.SimulateTrialMode == true)
          {
              //starte Trialmode
          }


In einem fertigen Spiel(keine Beta) würde ich es so machen:

C#-Quelltext

1
2
3
4
5
6
 if (Guide.IsTrialMode == true)
        {
            //Trialmode starten
        }
        else
            //Bezahl-Modus starten

Weiss zufällig jemand ob das so in einer richtigen App funktionieren würde? Ich kann den Code ja nicht testen da ich noch keine App zum Verkauf reinstellen kann.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

04.12.2013, 06:43

Warum der Trial-Mode automatisch auf false steht?
Weil Du das so einprogrammiert hast:

C#-Quelltext

1
2
    bool TrialmodeActive = false;
    bool TrialmodeDeactivateItNow = false;
Und ja, das wäre auch mit einer fertig installierten App so. Wieso sollte sich das Programm da auch anders verhalten?

Übrigens ist das doppelt-gemoppelt. C# hat default-Werte für Booleans. Dieser ist false.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

5

08.12.2013, 23:05

Ich habe den Code jetzt mal gekürzt. Wenn ich das Projekt als Beta hochlade und teste dann bin ich automatsich im Bezahlmodus weil Guide.IsTrialMode immer per default auf false steht.

Wenn man die App nicht sofort kauft sondern nur die gratis Version runterlädt dann müsste Guide.IsTrialMode doch auch automatisch auf true stehen, oder nicht? Erst wenn der Spieler die App kauft wird Guide.IsTrialMode ja auf false gesetzt.
Ich gehe davon aus dass das so abläuft:
Trialmodus:
Spieler lädt gratis App runter. Da er nichts gezahlt hat hat er keine Lizenz für das Spiel und die App erkennt das beim Spielstart und so wird Guide.IsTrialMode automatisch auf true gesetzt.
Bezahlmodus:
Kauft der Spieler die App so wird eine Lizenz für das Spiel auf seinem Handy angelegt. Die App erkennt die Lizenz beim Spielstart und so wird Guide.IsTrialMode automatisch auf false gesetzt.

Läuft das tatsächlich so ab wie ich es beschrieben habe? Falls ja, dann müsste mein Code ja richtig sein und bei Apps die man im Windows Phone Store kaufen kann auch richtig funktionieren? Oder mache ich was falsch? Wird Guide.IsTrialMode nicht automatisch auf true gesetzt wenn man die gratis Version runterlädt?

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
 public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;
        Texture2D TrialSprite, PurchasedSprite;     

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";
            TargetElapsedTime = TimeSpan.FromTicks(333333);
            InactiveSleepTime = TimeSpan.FromSeconds(1);
            this.graphics.IsFullScreen = true;
        }

        protected override void Initialize()
        {        
            base.Initialize();
        }

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            TrialSprite = Content.Load<Texture2D>("extrasspr");
            PurchasedSprite = Content.Load<Texture2D>("creditsspr");
            TouchPanel.EnabledGestures = GestureType.Tap;
        }

        protected override void Update(GameTime gameTime)
        {
            while (TouchPanel.IsGestureAvailable)
            {
                GestureSample gs = TouchPanel.ReadGesture();
                switch (gs.GestureType)
                {
                    case GestureType.Tap:
                        if (Guide.IsTrialMode == true)
                            Guide.ShowMarketplace(PlayerIndex.One);
                        break;
                }
            }

            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);

            spriteBatch.Begin();
            if (Guide.IsTrialMode == true)
                spriteBatch.Draw(TrialSprite, new Vector2(400, 100), Color.White);
            else
                spriteBatch.Draw(PurchasedSprite, new Vector2(400, 100), Color.White);

            spriteBatch.End();

            base.Draw(gameTime);
        }
    }

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

09.12.2013, 07:12

Ich zitiere nochmal Deinen Code. Da steht eindeutig, dass es nicht im TrialMode startet:

C#-Quelltext

1
2
bool TrialmodeActive = false; 
bool TrialmodeDeactivateItNow = false;

Guide.SimulateTrialMode ist automatisch false beim Start, wenn Du ihm nichts anderes zuweist.
Wie soll der Code da jemals in dieses IF reinspringen?

C#-Quelltext

1
2
3
4
if (Guide.SimulateTrialMode == true)
          {
              //starte Trialmode
          }


Ich würde Dir empfehlen die Sache mit dem Bezahlmodus erst einmal nicht einzuführen, bis Deine Fähigkeiten so ein Level an Sicherheit gewährleisten können. Nichts wäre schlimmer, als wenn ein Kunde das Teil kauft und wegen einem Bug trotzdem keine zusätzlichen Features bekommt.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (09.12.2013, 07:17)


7

09.12.2013, 07:42

Von dem abgesehen, was unser Kobold sagt, solltest du auch in die MSDN schauen: (Hervorhebung von mir)

Best Practice:
Getting the value of IsTrialMode on Windows Phone is a synchronous (blocking) operation that can take 60ms or more to complete when your game is in trial mode.
To prevent significant delays in your game's framerate, don't place this call in your game's Draw or Update methods
"Theory is when you know something, but it doesn’t work. Practice is when something works, but you don’t know why. Programmers combine theory and practice: Nothing works and they don’t know why." - Anon

8

09.12.2013, 10:28

Ich zitiere nochmal Deinen Code. Da steht eindeutig, dass es nicht im TrialMode startet:

C#-Quelltext

1
2
bool TrialmodeActive = false; 
bool TrialmodeDeactivateItNow = false;

Diesen Teil des Codes habe ich bereits rausgeschmissen(siehe meinen letzten Beitrag).


Guide.SimulateTrialMode ist automatisch false beim Start, wenn Du ihm nichts anderes zuweist.
Wie soll der Code da jemals in dieses IF reinspringen?

C#-Quelltext

1
2
3
4
if (Guide.SimulateTrialMode == true)
          {
              //starte Trialmode
          }

Das habe ich verstanden. Ich habe einen Test gemacht in dem ich Guide.SimulateTrialMode beim Spielstart auf true gesetzt habe. Daraufhin werde ich in den Windows Phone Store(zu meiner App) weitergeleitet wenn ich folgende Zeile ausführe:

C#-Quelltext

1
  Guide.ShowMarketplace(PlayerIndex.One);

Bis dahin funktioniert es also.

Wenn ich aber Guide.SimulateTrialMode durch Guide.IsTrialMode ersetze(was man ja machen muss wenn man die App in den Store zum Verkauf stellen möchte), dann kann ich Guide.IsTrialMode keinen Wert zuweisen(Visual Studio zeigt Fehlermeldung an). Da ich keinen Wert zuweisen kann bin ich so vorgegangen wie in meinem letzten Beitrag beschrieben. Außerdem macht es ja keinen Sinn Guide.IsTrialMode beim Spielstart auf true zu setzen, sonst befindet sich das Spiel ja immer(egal ob gekauft oder nicht) im Trialmode.
Was ist denn falsch an dem Code in meinem letzten Beitrag?

Von dem abgesehen, was unser Kobold sagt, solltest du auch in die MSDN schauen: (Hervorhebung von mir)

Best Practice:
Getting the value of IsTrialMode on Windows Phone is a synchronous (blocking) operation that can take 60ms or more to complete when your game is in trial mode.
To prevent significant delays in your game's framerate, don't place this call in your game's Draw or Update methods

Wie soll ich das denn am besten machen?
Soll ich diesen Block:

C#-Quelltext

1
2
3
4
 if (Guide.IsTrialMode == true)
                spriteBatch.Draw(TrialSprite, new Vector2(400, 100), Color.White);
            else
                spriteBatch.Draw(PurchasedSprite, new Vector2(400, 100), Color.White);

durch folgenden ersetzen?

C#-Quelltext

1
2
3
4
5
6
//beim Spielstart wird geprüft ob man sich im Trialmodus befindet, falls ja wird die Variable TrialmodeZeichnen auf true gesetzt.
//in der Draw Methode:
if (TrialmodeZeichnen == true)
                spriteBatch.Draw(TrialSprite, new Vector2(400, 100), Color.White);
            else
                spriteBatch.Draw(PurchasedSprite, new Vector2(400, 100), Color.White);

In der Update Methode würde ich dann genauso vorgehen, also nicht Guide.IsTrialMode abfragen sondern eine Variable die den gleichen Wert enthält.

Werbeanzeige