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

16.11.2013, 16:04

Problem mit Klassen und SFML

Halli Hallo,

ich hab mich jetzt mal notgedrungen hier angemeldet, da ich in meinem ersten Spiel mit SFML und C++ ein mehr oder minder großeses Problem habe.
Ich komme aus einem hobbyistischen Java bzw. C# Hintergrund und bin deswegen gerade dabei meinen Code in Klassen auszulagern, hier stoße ich allerdings auf Probleme.
In meiner main() Funktion habe ich die pollInput() Funktion aus der Input.cpp, ist auch alles über Header eingebunden, diese pollInput() Funktion soll wie der Name schon sagt den Input abfangen und den Spieler bewegen, siehe player.movePlayer(x, y). Die pollInput() Funktion fängt den Imput auch vernünftig ab, dies sagt mir meine Konsolenausgabe, also gehe ich davon aus, dass das Problem bei der Übergabe der Werte liegt.

Hier der Link zu meinem Github des Projektes: Github

Vielen Dank schon mal :thumbsup:

FSA

Community-Fossil

  • Private Nachricht senden

2

16.11.2013, 16:06

Was ist deine Frage?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

3

16.11.2013, 16:07

Was ist deine Frage?
Meine Frage ist, ob ihr einen Fahler seht, warum der Spieler sich nicht bewegt.

FSA

Community-Fossil

  • Private Nachricht senden

4

16.11.2013, 16:35

Du erstellst in der Funktion void Input::pollInput() ein neues Player Objekt. Das ist aber nicht das Objekt, was du renderst.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

5

16.11.2013, 19:53

Okay, so etwas in der Art hab ich mir schon gedacht, jetzt steht ich nur noch vor dem Problem, dass ich das Player Objekt, welches jetzt nur noch in der Player.cpp deklariert wird in der klassenlosen main() nicht aufrufen kann, sobald ich versuche die main() über einen Header in eine Klasse zu packen zickt Visual Studio rum... Da bräuchte ich eventuell noch einen kleinen Denkanstoß :S

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

16.11.2013, 20:13

Die main kann nicht in eine Klasse verpackt werden. Das ist der Programmeinstiegspunkt und der Linker wüsste nicht mehr wo der Punkt sein soll, wenn Du es in eine Klasse packst.
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]

eXpl0it3r

Treue Seele

Beiträge: 386

Wohnort: Schweiz

Beruf: Professional Software Engineer

  • Private Nachricht senden

7

16.11.2013, 20:28

Ich mach das meist so:

main.cpp (klein da keine Klasse)

C-/C++-Quelltext

1
2
3
4
5
6
7
#include "Application.hpp"

int main()
{
    Application app;
    app.run();
}


Application.hpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef APPLICATION_HPP
#define APPLICATION_HPP

class Application
{
public:
    Application();

    void run();

private:
    // Meine Objekte
}
#endif // APPLICATION_HPP


Damit musst du dann auch keine Globalen Variabeln mehr verwenden.

Ein paar weitere Tipps:

  • Verwend nicht #pragma comment um Libraries zu linken. Linken gehört nicht zur Aufgabe des Source Codes sondern zur Aufgabe des Projekts/Build-Script/etc.
  • Wenn du #ifndef verwendest, dann musst du danach auch #define aufrufen (z.B. in Player.h).
  • Ist Geschmackssache und viele machen es anderst, aber ich bevorzuge *.hpp für C++ headers, die Logik ist simpel: C => *.c/*.h; C++ 0> *.cpp/*.hpp
  • Verwende kein #define für Konstanten, dafür gibt es das Keyword const.
  • Klassen haben aus einem Grund einen Konstruktor nämlich um die Klasse zu initialisieren, da braucht es keine "setupXYZ" Funktionen. Auch musst du dort alle Variablen initialisieren, d.h. alle integers, booleans, etc müssen einen Wert zugewisen bekommen ansonsten wirst komische Nebeneffekte erhalten.
  • Du solltest dich entscheiden wie du die Includeguards haben möchtest: entweder #pragma once, oder #ifndef XXX / #define XXX oder beides, aber du musst es konsequent so durchziehen und nicht mal das eine und mal das andere. ;)
Blog: https://dev.my-gate.net/
—————————————————————————
SFML: https://www.sfml-dev.org/
Thor: http://www.bromeon.ch/libraries/thor/
SFGUI: https://github.com/TankOs/SFGUI/

8

16.11.2013, 21:09

Ich mach das meist so:

main.cpp (klein da keine Klasse)

C-/C++-Quelltext

1
2
3
4
5
6
7
#include "Application.hpp"

int main()
{
    Application app;
    app.run();
}


Application.hpp

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#ifndef APPLICATION_HPP
#define APPLICATION_HPP

class Application
{
public:
    Application();

    void run();

private:
    // Meine Objekte
}
#endif // APPLICATION_HPP


Damit musst du dann auch keine Globalen Variabeln mehr verwenden.

Ein paar weitere Tipps:

  • Verwend nicht #pragma comment um Libraries zu linken. Linken gehört nicht zur Aufgabe des Source Codes sondern zur Aufgabe des Projekts/Build-Script/etc.
  • Wenn du #ifndef verwendest, dann musst du danach auch #define aufrufen (z.B. in Player.h).
  • Ist Geschmackssache und viele machen es anderst, aber ich bevorzuge *.hpp für C++ headers, die Logik ist simpel: C => *.c/*.h; C++ 0> *.cpp/*.hpp
  • Verwende kein #define für Konstanten, dafür gibt es das Keyword const.
  • Klassen haben aus einem Grund einen Konstruktor nämlich um die Klasse zu initialisieren, da braucht es keine "setupXYZ" Funktionen. Auch musst du dort alle Variablen initialisieren, d.h. alle integers, booleans, etc müssen einen Wert zugewisen bekommen ansonsten wirst komische Nebeneffekte erhalten.
  • Du solltest dich entscheiden wie du die Includeguards haben möchtest: entweder #pragma once, oder #ifndef XXX / #define XXX oder beides, aber du musst es konsequent so durchziehen und nicht mal das eine und mal das andere. ;)
Danke für die Tipps, das mit dem #pragma comment ist mir bewusst, allerdings benutze ich VS 2013 und es gibt noch keinen offiziellen Build, ohne #pragma comment spuckt dir der compiler errors aus... Werde versuchen die Tipps zu berücksichtigen, danke :)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

16.11.2013, 21:34

Ähm... Statt pragma comment solltest Du in den Linker-Einstellungen die Lib eintragen. Das war gemeint.
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]

10

16.11.2013, 21:55

Leider hab ich immer noch Probleme mit dem drawen des Players bzw. damit, dass sich die Position updated.... Neue Version ist zum Github gepusht :pinch:

Werbeanzeige