Erstes Spiel bzw. erste Grafikanwendung



  • Hi zusammen,

    hab da mal beine Frage ezüglich der Grafik- bzw. Spieleprogrammierung. Habe bis jetzt nur in C++ programmiert und denke das ich damit schon sehr gut zurecht komme. Jetzt wollte ich mich mal an die Grafikprogrammierung wagen. Mir Schwebt da sowas vor wie Tetris für den Anfang. kann mir da mal jemand nen tip geben wie ich bei so etwas anfange bzw. wie ich solche recht einfachen Spiele programmiere? Ein Toturial oder ähnliches wäre da sehr hilfreich. Bin da aber völliger anfänger. Es sollte aber nicht auf Konsolenebene basieren, sondern schon eine Windows anwenundung werden, welche am besten auf c++ basiert.

    Danke schonmal
    Gruß



  • Willst du die GDI von Windows nutzen oder vielleicht lieber ein Multimediaframework wie SDL oder SFML? (Die würden dir einen Großteil an Verwaltungsarbeit abnehmen, die nichts mit dem Spiel an sich zu tun hätte)

    Für Tetris würde ich dir vorschlagen, dass du einfach mal den Ablauf skizzierst. Dabei überlegst du dir, wie du deine Klassen dazu gestaltest, z.B. Stein (SteinA : Stein, SteinB : Stein,...), Feld, Punktestand, Steingenerator (mit 1-Element Warteschlange).

    Alternativ könnte ich dir Pong vorschlagen, ist (ohne KI, sozusagen für 2 Spieler) noch simpler.



  • dann würde ich mich natürlich lieber auf die sdl oder sfml stürzen. nur leider hab ich ja wie gesagt noch keine ahnung wie ich überhaupt nen fenster hinbekommen indem zum beispiel nen strich gezeichnet wird oder sowas. mit sowas sollte ich vlt anfangen. soll ja erst später auf tetris oder ähnliches hinauslaufen . bräuchte da einfach mal tipps oder toturials wie ich da anfangen kann

    gruß



  • Dann würde ich dir einfach mal die Tutorials von SFML empfehlen:
    http://www.sfml-dev.org/tutorials/1.3/

    Da sollte alles drinstehen, um einen guten Start mit SFML zu schaffen.
    Viel Erfolg! 😉



  • sieht schon mal ganz gut aus, würde sowas abver lieber in deutsch haben wenn es das gibt



  • Du wirst dich daran gewöhnen müssen, dass es fast nur Infos in englischer Sprache gibt.



  • Wenn es dir erstmal nur um die GrafikGrundlagen geht, kannst du ja auch mit der GDI anfangen. Da gibt' auch Sachen in Deutsch. Dann faellt es dir vielleicht leichter, mit anderen Dingen weiter zu machen (mit der GDI kann man aber auch einfache Spiele machen)
    Wenn dir Englisch (noch) nicht so liegt, bringt es nicht viel, sich mit dieser Sprache in etwas zu stuerzen, was man noch gar nicht kennt.



  • Naja, mit dict.leo.org und google.de bewaffnet sollten die Tutorials für jeden machbar sein, der in der Schule mehr als 2 Jahre Englisch hatte.

    Außerdem lernt man die Sprache nie, wenn man sich nicht damit beschäftigt.



  • so habe mich da mal ein bisschen reingelesen und acuh schon bisschen mit threads und dem mutex befehlen rumgespielt.

    jetzt wollte ich gerade mal ein windows fenster starten, nur leider kann ich dieses nicht kompilieren .

    er meldet immer folgende fehler :

    1>sfml6.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: void __thiscall sf::Window::Display(void)" (?Display@Window@sf@@QAEXXZ)".
    1>sfml6.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: virtual __thiscall sf::Window::~Window(void)" (??1Window@sf@@UAE@XZ)".
    1>sfml6.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: __thiscall sf::Window::Window(class sf::VideoMode,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,unsigned long,struct sf::WindowSettings const &)" (??0Window@sf@@QAE@VVideoMode@1@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KABUWindowSettings@1@@Z)".
    1>sfml6.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""public: __thiscall sf::VideoMode::VideoMode(unsigned int,unsigned int,unsigned int)" (??0VideoMode@sf@@QAE@III@Z)".
    1>MSVCRT.lib(crtexew.obj) : error LNK2001: Nicht aufgelöstes externes Symbol "_WinMain@16".
    1>C:\Users\Heiner\Desktop\Programmieren\sfml6\Release\sfml6.exe : fatal error LNK1120: 5 nicht aufgelöste externe Verweise.
    

    muss ich beim anlegen des projektes irgendwas anderes auswählen ?bis lang habe ich immer eine Win32-Konsolenanwendung estellt und dann bei den Anwendungsbeispielen auch konselenanwendung ausgewählt und das ganze als leeres projekt gestartet. kann mir da jemand weiter helfen ?

    gruß



  • Oder nimm doch einfach ne Grafikbibliothek.

    - Ich hab in C++ mit Allegro angefangen (ist zwar ne C Lib aber macht ja nix ^^)

    - Die Irrlicht Engine könntest du auch nehmen (hat aber meiner Meinung nach zu wenig 2D Funktionen, kann keinen richtige Kreis oder Ellipse zeichnen)

    - Oder du nimmst eine relativ junge Engine, z.B. meine ^^
    Die "SoftPixel Engine" bietet vor allem für 2D GrafikAnwendungen eine sehr komfortable Schnittstelle und ist sehr leicht zu nutzen (siehe hier: http://softpixelengine.sourceforge.net/)
    Da gibt's auch ein 2D Tutorial: http://softpixelengine.sourceforge.net/sp_tutorial_1.html

    Gruß Lukas



  • @Lukas:
    Gut, dass SFML eine Grafikbibliothek ist. :p
    Und für 2D Irrlicht zu empfehlen ist nah dran an grobem Unfug!

    @jontef:
    Du solltest natürlich die benötigten Libs einbinden. Wenn du Visual Studio nutzest (die Fehlermeldung lässt das erschließen), solltest sie du in den Projekteinstellungen unter Linker->Input->Additional Dependencies einbinden. Für die Tutorials wären das also sfml-window.lib, sfml-graphics.lib und sfml-system.lib.

    Siehe auch http://www.sfml-dev.org/tutorials/1.3/start-vc.php

    sfml-main.lib solltest du auch reinbringen, wenn du lieber mit "int main().." als mit "int WinMain(..)" starten willst. Siehe Fehlermeldung Zeile 5.



  • die dateien hab ich alle soweit auch eingebunden. habe es jetzt auch hinbekommen ohne fehler zu kompilieren, jetzt fehlt ihm aber beim starten die sfml-window.dll obwohl diese im visual studio ordner liegt. muss ich die noch wo anders hin kopieren ?



  • Wenn du aus dem Studio heraus startest, sollte sie im Projektverzeichnis liegen, d.h. neben dem Code, der Solution und den vcproj-Dateien.

    Wenn du aus dem Explorer heraus starten willst, dann halt im gleichen Verzeichnis wie die EXE.

    Gerüchten zufolge kann man VS auch beibringen, noch an anderen Punkten zu suchen, das habe ich aber auch noch nicht geschafft.



  • ich starte es aus vc heraus , die dll datei habe ich von hand darein kopiert aber der fehler besteht immer noch .

    kann das irgendwie im zusammenhang mit vista64 stehen ? hoffe ja doch nicht denn bis lang hat immer alles geklappt



  • Hm, mit Vista64 habe ich nun gar keine Erfahrungen. Alternativ kopier die Dinger zur EXE und starte die per Explorer.

    Werde mich aber mal informieren, das interessiert mich.



  • so das mit den fenster habe ich jetzt auch unter vista64 hinbekommen. hatte irgendwas zu tun mit den libarys die ich eingebunden hatte. musste die alle mit -s einbinden wie z.b. sfml-system-s.lib . wozu ist das "s" bzw "d" oder beides denn da? hab den sinn noch nicht so ganz verstanden.

    desweiteren würde mich interessieren, warum ich die programme die ich geschriben habe, nicht auf anderen rechnern zum laufen bekomme wenn ich die "exe-datei" rüber kopiere. hat das nen grund? muss ich noch irgendwas umstellen ?

    Gruß und vielen dank schonmal



  • Also, bei SFML ist es so, dass sämtliche Libs, die mit -s enden, statisch sind, d.h. deren Inhalt in die Exe mitreingelinkt wird. Die mit -d enthalten Debug-Informationen.

    Was kommt auf anderen Rechnern für eine Fehlermeldung?



  • Wenn du wirklich Erfahrung in C++ hättest, würdest du nicht Tetris zu
    Anfang schreiben wollen, dass ist ne ganz schöne Granate die de da vor
    hast...



  • way schrieb:

    Wenn du wirklich Erfahrung in C++ hättest, würdest du nicht Tetris zu
    Anfang schreiben wollen, dass ist ne ganz schöne Granate die de da vor
    hast...

    Was ist denn an tetris bitte schön so schwer?



  • mad_martin schrieb:

    Also, bei SFML ist es so, dass sämtliche Libs, die mit -s enden, statisch sind, d.h. deren Inhalt in die Exe mitreingelinkt wird. Die mit -d enthalten Debug-Informationen.

    Was kommt auf anderen Rechnern für eine Fehlermeldung?

    also als fehlermeldung kommt z.b. "Der Prozedureinsprung "_ftol2" wurde in der DLL "msvcrt.dll" nicht gefunden". Manchmal stürzt das Programm auch einfach ab oder der Bildschirm bleibt schwarz.
    desweiteren frag ich mich, wie ich das konsolenfenster, welches immer im hintergrund läuft, schließen kann?

    poste mal den Quellcode hier aber daran kann es ja eigentlich nicht liegen. Denke eher das es an der Libary liegt.

    #include <SFML/Graphics.hpp>
    #include <iostream>
    
    int main()
    {
    
        sf::RenderWindow App(sf::VideoMode(800, 600), "SFML Shapes");
    	sf::Shape Kreis1 = sf::Shape::Circle(150, 150, 40, sf::Color::White, 10, sf::Color::Blue);
    
    	sf::Shape linielinks = sf::Shape::Line(130,200,130,250,2,sf::Color::White,2,sf::Color::White);
    
    	sf::Shape Rechteck = sf::Shape::Rectangle(100,100,700,500,sf::Color::Black,5,sf::Color::White);
    
    	sf::String Text;
    	Text.SetPosition(10,10);
    	Text.SetText("Test");
    	Text.SetColor(sf::Color::White);
    	Text.SetFont(sf::Font::GetDefaultFont());
    	float posx=150.0f;
    	float posy=150.0f;
    	float posxx=0.25f;
    	float posyy=0.25f;
    
        while (App.IsOpened())
        {
            sf::Event Event;
            while (App.GetEvent(Event))
            {            
                if (Event.Type == sf::Event::Closed)
                    App.Close();
    			if(Event.Type == sf::Event::KeyPressed)
    			{
    				if (Event.Key.Code == sf::Key::F1)
    				{
    					sf::Image Screen = App.Capture();
    					Screen.SaveToFile("screenshot.jpg");
    				}
    				if (Event.Key.Code == sf::Key::Add)
    				{
    					if(posxx>0)
    						posxx=posxx+0.05f;
    					if(posyy<0)
    						posxx=posxx-0.05f;
    					if(posyy>0)
    						posyy=posyy+0.05f;
    					if(posyy<0)
    						posyy=posyy-0.05f;
    				}
    				if (Event.Key.Code == sf::Key::Subtract)
    				{
    					if(posxx>0)
    						posxx=posxx-0.05f;
    					if(posxx<0)
    						posxx=posxx+0.05f;
    					if(posyy>0)
    						posyy=posyy-0.05f;
    					if(posyy<0)
    						posyy=posyy+0.05f;
    				}
    			}
            }
    
    		App.Draw(Text);
    
    			Kreis1.Move(posxx,posyy);
    			posx=posx+posxx;
    			posy=posy+posyy;
    		if(posx>=650.0)
    			posxx=posxx*(-1.0f);
    		if(posx<=150.0)
    			posxx=posxx*(-1.0f);
    		if(posy>=450.0)
    			posyy=posyy*(-1.0f);
    		if(posy<=150.0)
    			posyy=posyy*(-1.0f);
    		App.Draw(Rechteck);
    		App.Draw(Kreis1);
    		App.Draw(linielinks);
            App.Display();
        }
    
        return EXIT_SUCCESS;
    }
    

    way schrieb:

    Wenn du wirklich Erfahrung in C++ hättest, würdest du nicht Tetris zu
    Anfang schreiben wollen, dass ist ne ganz schöne Granate die de da vor
    hast...

    Zu Tetris: Das ist ja auch nur ein Gedanke das es da mal drauf hinaus laufen soll und nicht das ich damit direkt anfangen will. steht da oben auch drin. Aber was du so schwer dran sein soll verstehe ich auch nicht. Aber gut, war ja auch nicht so die hilfreiche antwort



  • Also ich kann da nur SDL empfehlen für nen leichten / einfachen Einstieg ... Wenn ich hier seh das du 2 Seiten lang nur mit Fehlermeldungen zu kämpfen hast 👎 Kannst dir ja mal hier SDL Tutorials anschauen wenn du magst: http://www.robsite.de/tutorials.php?tut=sdl die von Marius Andra sind sehr gut erklärt.

    Hatt mein 2Player Pong damit an einem WE geschafft 🕶


Anmelden zum Antworten