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

Tician

Frischling

  • »Tician« ist der Autor dieses Themas

Beiträge: 32

Wohnort: Bad Friedrichshall

Beruf: FISI

  • Private Nachricht senden

1

01.07.2017, 18:20

C# variablen in anderer Klasse verändern

Hallo Leute,

Ich bin kein Anwendungsentwickler, aber ich lerne C# in der Berufsschule und wollte mich mal an einem text-Spiel versuchen.
Mir wurde oft gesagt als 1. Projekt wäre das schon zu viel und ich solle mir etwas kleineres raus suchen, aber wie viele andere wollte ich das nicht hören und hartnäckig wie ich bin wollte ich auch wissen wie weit ich trotz der Warnungen komme.
Jetzt bin ich hier und das was ich mir vorgenommen habe funktioniert auch, aber um den Code zu verbessern fehlen mir Beispiele und Ideen, vermutlich auch Wissen.

Mein Projekt ist mit WIndows Forms realisiert worden. Folgendes Hintergrundwissen ist notwendig:

- Ich habe 2 Klassen: Player und Form1 (Form1 als Main-Methode in der auch der Ablauf des SPiels statt findet).
- Wie bei Form-Anwendungen üblich gibt es Labels und ProgressBars die die Statistiken des Spielers visuell zeigen. Die Oberfläche sieht so aus: http://i.imgur.com/hWDvZeO.png
Die Buttons mit denen der Spieler interagieren wird sieht man dort nicht.

FOlgendes Problem besteht:
Um dem Spiele Leben ab zu ziehen sollte (soweit ich weiß) als guter Programmierer in der Player-Klasse eine Methode "TakeDamage" oder so stehen. Jetzt sieht mein (etwas Pseudo-)Code aber so aus:

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
    public partial class Form1 : Form
    {
        private void Damage(int damage)
        {
            _player.curHP = _player.Damage(_player, damage);
            richTextBox1.AppendText("\nYou took " + damage + " damage");
 
            if(_player.curHP == 0)
            {
                PlayerDie();
            }
            lbCurHP.Text = _player.curHP.ToString();
            hpBar.Value = _player.curHP;
        }
    }

    public class Player
    {
        public int Damage(Player player, int damage)
        {
            this.damage = damage;
            if(player.curHP > damage)
            {
                currentHP = player.curHP - damage;
            }
            else
            {
                currentHP = 0;
            }
            return currentHP;
        }
    }


Das ist doppelt gemoppelt, ein Teil ist in der Form1 (weil nur dort habe ich Zugriff auf die Form-Elemente) und ein anderer Teil ist in der Player-Klasse. Eigentlich sollte alles in die Player-Klasse, aber ich weiß nicht wie ich das umsetzen kann.

Es wäre toll wenn mir hier jemand eine Idee geben könnte, mein Wissen ist vermutlich zu begrenzt, es wäre toll wenn ihr mir keine 20 Fachbegriffe um die Ohren schmeißen könntet ;) Falls von Interesse hier ist auch der gesamte Code (die Form-Elemente fehlen): https://pastebin.com/3krETNbs
Ich verstehe noch nicht viel von sauberem Programmieren, aber ich weiß jetzt schon wenn das nicht sauberer wird dann werde ich nicht lange Spaß daran haben, ich möchte es ja irgendwann auch ausbauen und erweitern.

Danke im vor raus

Tician

Wirago

Alter Hase

Beiträge: 1 193

Wohnort: Stockerau

Beruf: CRM Application Manager

  • Private Nachricht senden

2

01.07.2017, 18:32

Normalerweise hast du ein Spieler-Objekt mit dem du arbeitest, und in deinem Fall den Schaden zufügst.

Beispiel:

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
private class Game()
{
    //Spielerfigur erstellen
    Player player = new Player("Horst");
    
    //Spielerfigur nimmt Schaden
    player.TakeDamage(12);
}

public class Player()
{   
    private string name;
    private int health;
    
    //Konstruktor
    public Player(string name)
    {
        this.name = name;
        health = 100;
    }
    
    public void TakeDamage(int dmg)
    {
        health -= dmg;
    }
}

Tician

Frischling

  • »Tician« ist der Autor dieses Themas

Beiträge: 32

Wohnort: Bad Friedrichshall

Beruf: FISI

  • Private Nachricht senden

3

01.07.2017, 18:43

Hi Wirage und danke für deine schnelle Antwort. Deine Lösung ist natürlich gut und lässt mich vermuten das ich mein Problem nicht genau geschildert habe. Der Spieler verliert zwar nun "unsichtbar" Leben, aber was mache ich mit der HP-Bar (braucht int als Rückgabe) und dem Label (braucht string als Rückgabe) die sich verändern müssen damit der Spieler "sichtbar" sehen kann das er Leben verloren hat? Label und Bar sind Teil der Form-Klasse und nicht der Player-Klasse.

Was mich herade darauf bringt... es müsste ja möglich sein der Player-Klasse ein Label und eine Bar zu geben, dann wäre ich das Problem auch los. Macht das Sinn?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

01.07.2017, 18:56

Du fragst natürlich nach dem Zufügen des Schadens das restliche Leben des Spielers ab. Das ist ein Int oder Float. Und das kannst du in einen String umwandeln und hast für die UI alles, was du brauchst. Der Spieler sollte nicht direkt irgendwas an der UI ändern. Schau dir dazu auch gern mal WPF und Value-Binding an. Andersrum sollte auch die UI nicht prüfen, ob der Spieler 0 Leben hat und ihn sterben lassen, sondern die Spieler-Klasse merkt das selbst und stirbt. Die UI fragt nur ab, ob er noch lebt oder nicht und zeigt das an, die sollte keine Logik auf dem Spieler ausführen.
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]

Sylence

Community-Fossil

Beiträge: 1 663

Beruf: Softwareentwickler

  • Private Nachricht senden

5

01.07.2017, 18:57

Nein.
Du willst Daten und deren Darstellung voneinander trennen.

Der Spieler weiß nur, dass er noch 123 Lebenspunkte hat. Wo und wie die angezeigt werden, gehört nicht in die Spieler Klasse, sondern in deinem Fall in die Form.

Tician

Frischling

  • »Tician« ist der Autor dieses Themas

Beiträge: 32

Wohnort: Bad Friedrichshall

Beruf: FISI

  • Private Nachricht senden

6

01.07.2017, 20:05

Das heißt das (bis auf den Umstand das die Abfrage nach dem Tod nicht in die Main gehört) das eigentlich korrekt ist?
WPF wollte ich ehrlich gesagt noch nicht hin, da habe ich Nervenaufreibende Ersterfahrungen gemacht :dash:

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

7

01.07.2017, 20:34

Mehr oder minder korrekt, ja.
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]

Werbeanzeige