Erstes Spiel bzw. erste Grafikanwendung
-
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.htmlGruß 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

-
Ich würde Dir auch den SDL empfehlen. Leicht zu programmieren, und man hat schnell Erfolgserlebnisse rund um die Themen Grafik, Animation, Eventhandling etc.
Die Robsite Links haben mir auch geholfen. Imo ist das Wiki-Book sehr hilfreich, da dort auch SDL-TTF (Font-behandlung), SDL-Image und SDL-gfx behandelt werden.
-
[propaganda]
nimm sfml, vergiss sdl1!!!!!!!
[/propaganda]
-
Peppie schrieb:
Wenn ich hier seh das du 2 Seiten lang nur mit Fehlermeldungen zu kämpfen hast

Die Fehlermeldungen liegen nicht an der Bibliothek an sich, sondern an Vista64 + Visual Studio und DLL-Inkompatibilitäten.

Außerdem hat jontef geschrieben, dass er am liebsten C++ verwenden will. SFML ist rein in C++ geschrieben, deshalb eine gute Wahl. Unter dem Gesichtspunkt um Längen besser als SDL, was in C implementiert wurde.
Was den einfachen Einstieg angeht: Ich habe beides ausprobiert und finde SFML geeigneter (gerade, weil ich als C++-Programmierer daran gegangen bin, und nicht als C-Programmierer). Schaut euch mal die Tutorials an und dann sagt mir nochmal, der Einstieg wäre schwer.
@jontef:
So, zurück zu deinem DLL-Problem. Es scheint also, als ob du die vorgefertigten DLLs nicht nutzen könntest. Kann passieren, bei Vista64 sogar wahrscheinlich.Also musst du die DLLs neukompilieren. Ist kein Problem. Geh in deinen SFML-Ordner. Da drin liegt (wenn du das Komplettpaket heruntergeladen hast) ein Ordner "Build". Da drin wählst du den zu deiner Version von VS passenden Ordner aus und öffnest die passende "SFML.sln".
Nun wählst du aus der Menüleiste "Build - Batch Build" aus (keine Ahnung, wie das in der deutschen Version heißt, wahrscheinlich "Erstellen - Batch...". Hacken bei allen Items, die mit "sfml-" anfangen und Abfahrt.
Nach dem Buildvorgang sollten dann - wenn alle Ordnereinstellungen stimmmen, davon gehe ich aus - direkt die neuen DLLs genutzt werden.
Probier das mal aus und berichte von deinen Erfahrungen!
Gib SFML 'ne Chance, du wirst sehen, es lohnt sich!

-
ok habe alles so gemacht wie du es gesagt hast. hat auch alles einwandfrei geklappt. die anwendungen funktionieren jetzt auch so weit bei mir.
nur wie bekomme ich die anwendungen auf anderen rechnern zum laufen ? muss ich da etwas mit dazu kopieren ? reicht es nicht wenn ich debug.exe rüber kopiere und die dort starte ?
desweiteren wird bei mir immer ein dos fenster geöfnet sobald ich ein programm starte, ist es möglich dieses zu umgehen ?gruß und danke schon mal
-
Entweder du lieferst die CRT-DLLs mit oder du linkst die CRT statisch rein.
Letzteres ist relativ einfach zu machen und auch keine schlechte Lösung (es gibt für beide Varianten Vor- und Nachteile).
Eine gute Anleitung gibt's hier:
http://blog.kalmbach-software.de/de/2008/03/05/wie-man-statisch-gegen-die-c-runtime-crt-linkt/Du musst nur beachten, dass du dies auch für SFML machst, also die Libraries von SFML nochmal neu erstellst, mit der gleichen Einstellung, wie du sie auch für dein eigenes Programm gemacht hast.
Dann sollte eigentlich alles laufen

Das ist übrigens kein "Fehler" oder schlechtes Designkonzept von SFML, sondern hängt einzig und allein an dem von Microsoft im VS propagierten Konzept der DLLs...
Achja, kleiner Tip noch:
Die Debugversion deines Programmes ist nur für dich (und evtl. andere Entwickler gedacht). Wenn du das Programm weitergeben willst, solltest du es als Releaseversion erstellen!
-
danke erstmal für die hilfe. bin gerade dabei alles umzustellen. mal sehen ob es funktioniert. werd noch ein feedback geben.
aber wie ist das jetzt mit dem konsolenfenster? kann ich das irgendwie schliessen bzw so einstellen das dieses nicht geöffnet wird? und wie bekommt man bei sfml nen menu oben in die leiste ?
-
eigentlich musst du nur ein Win32 Projekt erstellen und einen WinAPI einsprung machen das wars, so bekommste kein Konsolenfenster
