Autor Beitrag
Lihlu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Do 07.08.14 10:46 
Hallo zusammen,

Ich hoffe, ich darf hier fragen zu XNA stellen und bin richtig! (Sonst bitte verschieben :p)

ich werde langsam Wahnsinnig! Ich habe in XNA die Start klasse: game1 und eine weitere namens SteinDrops.

in SteinDrops habe ich ein:
ausblenden C#-Quelltext
1:
public int SteinKollision =0;					


während des Spielverlaufs ändert sich SteinKollision auf SteinDrops auf 1.

game1 soll nun unten in Update oder Draw abfragen ob SteinKollision auf SteinDrops 0 oder 1 ist.

Somit initialisiere ich erst mal ganz oben die Stein Drops klasse mit:
ausblenden C#-Quelltext
1:
SteinDrops Werte = new SteinDrops();					


und frage unten in "protected override void Update(GameTime gameTime)"
ausblenden C#-Quelltext
1:
2:
3:
4:
if (Werte.SteinKollision ==1)
{
// Bla
}

Nur leider bekommt game1 es einfach nicht mit wenn sichSteinKollision auf SteinDrops zu 1 ändert.
Der Wert bleibt immer 0. :(

Aber auf SteinDrops ist der Wert auf 1.

Wieso übernimmt er den Wert nicht ?

Wenn ich es anders rum probiere: auf SteinDrops die game1 initialisiere mit:
ausblenden C#-Quelltext
1:
game1 Game = new game1();					

und den public int SteinKollision auf game1 lege,

dann startet das ganze Spiel nicht mehr.

Ich bin echt schon seit stunden dran (6 oder mehr) und finde keine Lösung.
Ich hab noch 1000 andere Sachen probiert die noch weniger funktioniert haben.

Ich finde einfach keine Lösung da ich mit meinem Anfänger Wissen am Ende bin.

Ich brauche unbedingt diesen Wert von SteinKollision auf game1 -.-

Ich hoffe ihr versteht mein Problem und könnt mir eine simple Lösung nennen.

Rettet mich !
Gruß
Lihlu


Moderiert von user profile iconChristian S.: Topic aus WinForms verschoben am Do 07.08.2014 um 11:20
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4063
Erhaltene Danke: 843

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Do 07.08.14 11:43 
Hallo Lihlu,

bist du sicher, daß du immer die gleiche SteinDrops-Instanz ansprichst (oder hast du verschiedene Objekte)?
Wo änderst du denn die SteinKollision-Eigenschaft?

Dein erster Ansatz ist auf jeden Fall richtig(er) - auf keinen Fall ein neues Game-Objekt anlegen!

PS. Der Klassenname sollte Game lauten und die Variable game (nicht umgekehrt ;-)).

Für diesen Beitrag haben gedankt: Lihlu
Lihlu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Do 07.08.14 12:05 
Hey! Vielen dank für die Antwort,

Ja ich spreche immer über oben definiert: Werte die SteinKollision an.

Habe:
ausblenden C#-Quelltext
1:
SteinDrops Werte = new SteinDrops();					

in
ausblenden C#-Quelltext
1:
SteinDrops SteinWerte = new SteinDrops();					

geändert um sicher zugehen das Werte nirgends anders benutzt wird.

Die SteinKollision Eigenschaft ? Meinst du damit wann sich SteinKollision auf 1 ändert ?
Das passier quasi wenn man gegen einen Stein läuft. Ich lasse das ganze auch mit lesen und SteinKollision ändert sich auch wirklich auf 1. Nur Game1 bekommt das nicht mit.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4063
Erhaltene Danke: 843

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Do 07.08.14 13:20 
Dann zeige mal den Code, wo du SteinKollision auf 1 änderst? In welche Klasse führst du das durch - auch in der Game-Klasse?

Für diesen Beitrag haben gedankt: Lihlu
Lihlu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Do 07.08.14 14:12 
Das könnte jetzt ein wenig "viel" werden.
ausblenden volle Höhe 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:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
namespace OpenWorld
{
    class SteinDrops
    {
        public List<Satz> Sätze = new List<Satz>();
        public List<Möglichkeit> Möglichkeiten = new List<Möglichkeit>();
        Steine.Arten Art = new Steine.Arten();
     


        public int SteinKollision = 0;

        public struct Satz
        {
            public string Text;
            public bool VonSpieler;
            public Satz(string text, bool vonSpieler)
            {
                Text = text;
                VonSpieler = vonSpieler;

            }
        }
        public struct Möglichkeit
        {
            public string Text;
            public string Buchstabe;
            public Möglichkeit(string text, string buchstabe)
            {
                Text = text;
                Buchstabe = buchstabe;
            }
        }
        public string Verlauf;
        public void Spreche(string Möglichkeit, ref Player Spieler)
        {
            Verlauf += Möglichkeit;
            foreach (Möglichkeit MöglichkeitAktuell in Möglichkeiten)
            {
                if (MöglichkeitAktuell.Buchstabe == Möglichkeit)
                {
                    Sätze.Add(new Satz(MöglichkeitAktuell.Text, true));
                }
            }
            Möglichkeiten.Clear();

            #region Steine Arten
            switch (Art)
            {
                case Steine.Arten.Rock1:
                    switch (Verlauf)
                    {
                        case "":
                            Sätze.Add(new Satz("Ich bin Stein 1 =)"false));  
                      
                            // HIER WIRD AUF 1 GEÄNDERT
                            SteinKollision =1;

                            break;
                           

                    }
                    break;
                case Steine.Arten.Rock2:
                    switch (Verlauf)
                    {
                        case "":
                            Sätze.Add(new Satz("Ich bin Stein 2 =)"false));
                            break;

                    }
                    break;
            #endregion



            }
        }

        public void NeuerDrop(Steine.Arten Art)
        {
            Sätze.Clear();
            Möglichkeiten.Clear();
            this.Art = Art;
            Verlauf = "";

        }

        
                
        }
    }
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4063
Erhaltene Danke: 843

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Do 07.08.14 14:27 
Hast du denn schon mit dem Debugger überprüft, ob der Code auch wirklich in die switch-case - Anweisungen reinspringt, um den Wert zu ändern?
Falls du noch wenig Erfahrung damit hast, s. [Artikel] Debugger: Wie verwende ich den von Visual Studio? (ins. Stichworte: Haltepunkt und Variablen-Überwachung).

Für diesen Beitrag haben gedankt: Lihlu
Lihlu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Do 07.08.14 14:35 
Mit dem Debugger ist klar - denke du meinst F9 Taste etc.

Mein Spiel hat auch einen Chat. Dort wird auch angeben: Ich bin Stein 1 oder 2 , wenn ich gegen einen laufe. Im Chat steht auch das SteinKollision den wert 1 an nimmt.

Ich habe mit F9 Zeile 62 markiert und wenn ich gegen einen Stein laufe springt er genau zur Zeile 62 in meinem Code.

(Vielen Dank nochmal das du mir so fleißig hilfst :P)
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4063
Erhaltene Danke: 843

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Do 07.08.14 15:18 
OK. Sobald das Programm in Zeile 62 gehalten hat, setze dann mal einen Haltepunkt auf die Zeile
ausblenden C#-Quelltext
1:
if (Werte.SteinKollision == 1)					

in der Game-Klasse und lasse das Programm weiterlaufen (F5).
Dann überprüfe mal - sobald das Programm dort wieder anhält, ob Werte jetzt wirklich die richtigen Daten beinhaltet (oder ob du nicht evtl. eine andere Instanz beschreibst bzw. ausliest).

Für diesen Beitrag haben gedankt: Lihlu
Lihlu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Do 07.08.14 15:35 
Wenn ich F9 auf:

ausblenden C#-Quelltext
1:
2:
3:
if (SteinWerte.SteinKollision == 1)
{
}


ausführe passiert nichts - also das Programm stoppt nicht. Das heist der Code wird garnicht bearbeiter.

Wenn ich aber ein:
ausblenden C#-Quelltext
1:
2:
3:
4:
else
{
    Level = 500; (F9 Markierung)
}

ausführe wird auch nicht angehalten aber die Level anzeige springt auf 500.

Ich bin ein wenig verwirrt o:

(Wenn du magst kann ich das ganze Projekt hier mal anhängen :p - Ist aber ein ziemliches Caos :-D Hab´s nicht so mit Code Ordnung)

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Einloggen, um Attachments anzusehen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4063
Erhaltene Danke: 843

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Do 07.08.14 16:36 
Warum jetzt nicht beim Haltepunkt gestoppt wird, kann ich nicht sagen!?

Ich habe zwar kein XNA bei mir installiert, habe mir aber deinen gesamten Source angesehen - puh...

Und wie ich vermutet habe, verwendest du mehrere verschiedene SteinDrops-Instanzen:
ausblenden C#-Quelltext
1:
Spieler.SteinDrops.Spreche(""ref Spieler);					

Hier rufst du die Methode auf, welche die Eigenschaft SteinKollision von Spieler.SteinDrops (!) auf 1 setzt, aber abfragen tust du die SteinKollision-Instanz der Klasse Game1!

Du muß also
ausblenden C#-Quelltext
1:
if (Player.SteinDrops.Kollision == 1)					

abfragen (und kannst die Variable Werte aus der Klasse Game1 löschen)!

Du mußt dir über jede Instanz (Objekt) in deinem Programm klarwerden, welche Bedeutung sie hat und in welcher Objekt-Hierarchie sie eingebunden ist.

Dein ganzes Programm ist noch verbesserungsfähig, insb. da deine Game-Klasse jetzt schon mit 1150 Zeilen schon recht groß ist. Wenn du Verbesserungvorschläge wünscht, kann ich dir ein paar Hinweise geben.
Positiv ist aber, daß du zumindestens schon mal für die Datenstrukturen eigene Klassen (in eigenen Dateien) angelegt hast, du solltest aber versuchen noch mehr Logik aus der Game-Klasse auszulagern.

Für diesen Beitrag haben gedankt: Lihlu
Lihlu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Do 07.08.14 16:49 
Erst einmal vielen vielen Dank!

Das ist mein erstes "Ordentliches" Projekt in XNA vorher hatte ich nur ein wenig mit Forms gemacht. Ich wurschtel mir alles immer irgendwie zsm Hauptsache es funktioniert :-D
Deswegen sitze ich leider an simplen Aufgaben manchmal einen ganzen Tag ._. (Wie heute)

Ich versuche deine Antwort grad noch ein wenig zu verstehen.

Wenn ich Player.SteinDrops.Kollision ==1 verwende -> verweise ich nicht dann auf die Player.cs ?

Oder willst du mir sagen das in der Player.cs eig mein Wert aus SteinDrops abgespeichert ist und ich deswegen am falschen Ort abfrage ?


Gruß
Lihlu

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Lihlu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Do 07.08.14 16:55 
Ich habs - hatte nur einen kleinen Fehler gemacht!

ausblenden C#-Quelltext
1:
2:
3:
4:
            if (Spieler.SteinDrops.SteinKollision == 1)
            {
                Level = 999;
            }


Ohne deine Hilfe hätte ich es nie raus gefunden :p!

Ich hänge jetzt schon so viele Tage über dem Code und trotzdem hab ich manchmal Sachen programmiert die ich selber nicht verstehe o: Deswegen vielen vielen dank :-D

Gruß
Lihlu
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4063
Erhaltene Danke: 843

Win7
C++, C# (VS 2015/17)
BeitragVerfasst: Do 07.08.14 17:49 
Sorry, wollte dich nicht verwirren. Die Variable heißt bei dir ja Spieler (und die Klasse Player). Deswegen wird im professionellen Code meistens einheitlich nur englisch benutzt (evtl. dann die Kommentare auf deutsch, aber selbst das ist nicht so häufig).

Lihlu hat folgendes geschrieben:
Oder willst du mir sagen das in der Player.cs eig mein Wert aus SteinDrops abgespeichert ist und ich deswegen am falschen Ort abfrage?

Genau, das wollte ich damit sagen - jede Player-Instanz hat ihr eigenes SteinDrops-Objekt.