Programiranje u C++-u - pitanja i odgovori
- poruka: 7.285
- |
- čitano: 1.712.409
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
- +/- sve poruke
- ravni prikaz
- starije poruke gore
Platform.loadFromFile("C:\\SFMLGame\\bin\\Debug\\pf.jpeg") (probao sam i sa .jpg).
vidim da si stavio slikovnu datoteku u "\bin\debug\" podfolder, probaj ju staviti u "c:\sfmlgame\" i onda samo napraviti
Platform.loadFromFile("pf.jpg");
I uključi si ekstenzije u windows exploreru, tako da ih možeš vidjeti...
Radi,hvala jos jednom.
E sad ovaj game loop,dali bi se to moglo nekako bolje napravit?
#include <chrono>
#include <thread>
#include <iostream>
#include <SFML/Graphics.hpp>
#include <windows.h>
const int FRAMES_PER_SECOND = 60;
const int SKIP_TICKS = 1000 / FRAMES_PER_SECOND;
DWORD next_game_tick = GetTickCount();
int sleep_time = 0;
int main()
{
sf::VideoMode VMode (800, 600, 32);
sf::RenderWindow Window(VMode, "Game", sf::Style::Default);
sf::Texture Platform;
if(!Platform.loadFromFile("pf.jpg"))
return 1;
sf::Sprite Sprite;
Sprite.setTexture(Platform);
while (Window.isOpen()) // Gameloop
{
next_game_tick += SKIP_TICKS;
sleep_time = next_game_tick - GetTickCount();
if( sleep_time >= 0 ) { Sleep( sleep_time ); }
else
{
sf::Event Event;
while (Window.pollEvent(Event))
{
switch (Event.type)
{
case sf::Event::Closed: Window.close(); break;
default: break;
}
}
Window.clear(sf::Color(0, 255, 255));
Window.draw(Sprite);
Window.display();
}
}
}
Imam jos jedan problem,radim na jednostavnom networkingu ali dobivam errore:
#include <iostream>
#include <SFML/Network.hpp>
using namespace std;
int main()
{
sf::UdpSocket Socket;
char Text[] = "Sent!!";
cin >> Text;
if (Socket.send(Text, sizeof(Text), "192.168.0.3", 4456) != sf::Socket::Done)
{
cout << "Message sending failed";
}
return 0;
}
||=== Server, Debug ===|
obj\Debug\main.o||In function `main':|
C:\Users\David\Dropbox\C++\Server\main.cpp|8|undefined reference to `sf::UdpSocket::UdpSocket()'|
C:\Users\David\Dropbox\C++\Server\main.cpp|15|undefined reference to `sf::IpAddress::IpAddress(char const*)'|
C:\Users\David\Dropbox\C++\Server\main.cpp|15|undefined reference to `sf::UdpSocket::send(void const*, unsigned int, sf::IpAddress const&, unsigned short)'|
obj\Debug\main.o||In function `~UdpSocket':|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\SFML\Network\UdpSocket.hpp|46|undefined reference to `sf::Socket::~Socket()'|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\SFML\Network\UdpSocket.hpp|46|undefined reference to `sf::Socket::~Socket()'|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\SFML\Network\UdpSocket.hpp|46|undefined reference to `sf::Socket::~Socket()'|
c:\program files (x86)\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\SFML\Network\UdpSocket.hpp|46|undefined reference to `sf::Socket::~Socket()'|
||=== Build finished: 7 errors, 0 warnings ===|
petlja izgleda ok, a što se ovog socket dijela tiče, jesi li linkao taj projekt sa libsfml-network bibliotekom?
Hvala :D
Znaci imam ova dva programa:
Client:
#include <SFML/Network.hpp>
using namespace std;
int main()
{
// Create the UDP socket
sf::UdpSocket Socket;
// Bind it (listen) to the port 4567
if (!Socket.bind(4456))
{
//aaaa
}
char Buffer[128];
std::size_t Received;
sf::IpAddress Sender;
unsigned short Port;
if (Socket.receive(Buffer, sizeof(Buffer), Received, Sender, Port) != sf::Socket::Done)
{
return 0;
}
// Show the address / port of the sender
std::cout << Sender << ":" << Port << std::endl;
// Show the message
std::cout << Buffer << std::endl; // "Hi guys !"
system("pause");
return 0;
}
i server:
#include <iostream>
#include <SFML/Network.hpp>
using namespace std;
int main()
{
sf::UdpSocket Socket;
char Text[64] = "Sent!!";
cin >> Text;
if (Socket.send(Text, sizeof(Text), "192.168.0.3", 4456) != sf::Socket::Done)
{
cout << "Message sending failed";
}
system("pause");
return 0;
}
A opet mi ne radi.
Prvo, pogledaj na koju IP adresu šalješ, jesi li siguran da je to dobra adresa? Drugo, program koji očekuje podatke mora biti pokrenut prije onoga koji ih šalje.
Ali nažalost u tome nije problem, problem je u tome što se socket ne uspjeva bindati, probaj ovo:
if (!Socket.bind(4456))
{
//aaaa
}
prepraviti u ovo:
if (!Socket.bind(4456))
{
cout<<"Error";
return 1;
}
Pa ćeš vidjeti. Nemam pojma zašto ne uspjeva, pogledat ću malo.
Pokreni oba programa na istom računalu, a za host postavi 127.0.0.1
Pokreni oba programa na istom računalu, a za host postavi 127.0.0.1
Ne radi, već sam ja izmjenio adresu na localhost, to mi je prvo palo na pamet. Problem je u bindanju socketa na port, tj. Socket.bind() vraća error, pa mi je onda palo na pamet da možda nije pozvana WSAStartup funkcija, ali to bi bio malo blesav propust.
Nije isključeno ni da je do builda, tj da sam ja nešto zabrljao pri kompajliranju SFML-a
Za ovakve stvari treba koristiti bolje biblioteke u kojima su te stvari dorađene i pojednostavljene. Da se to radi u C++ Builderu sve bi bilo riješeno u par linija coda, s time da te (Indy) komponente automatski koriste multi-threading za mrežne konekcije, po potrebi i pooling, antifreez threadova, zaštitu konekcije kroz SSL/TLS (ako treba) itd itd.. Samo se postavi komponente na formu i podese se propertyji.
Razmisljam o tom C++ Builderu,dali je to dobro za pocetnika?
Za ovakve stvari treba koristiti bolje biblioteke u kojima su te stvari dorađene i pojednostavljene.
Pa ironija je u tome što je baš SFML multimedijska biblioteka u kojoj su te stvari "dorađene i pojednostavljene" i to sve sa objektno orjentiranim spinom. Sa sirovim winsockom nemam tih problema :D
Razmisljam o tom C++ Builderu,dali je to dobro za pocetnika?
Vrlo je jednostavno i brzo se nauči.
Za ovakve stvari treba koristiti bolje biblioteke u kojima su te stvari dorađene i pojednostavljene.
Pa ironija je u tome što je baš SFML multimedijska biblioteka u kojoj su te stvari "dorađene i pojednostavljene" i to sve sa objektno orjentiranim spinom. Sa sirovim winsockom nemam tih problema :D
Sad sam bio na njihovom site-u i piše ovo:
Implements a portable layer over TCP and UDP sockets
Easy data transfers through stream-based extensible packets
Classes to use the HTTP and FTP internet protocols
Podrška tek za 4 protokola... bez implementirane multithreaded podrške (sam kreiraj threadove za multi-klijent okruženja).. Daleko je to od dorađenosti .
Podrška u C++ Builderu:
Jel ima free verzija?

Podrška u C++ Builderu:
Ah, nećemo sada uspoređivati C++ Builder koji je na tržištu više od 10 godina, sa ovom bibliotekicom.
To je ipak profesionalni proizvod...
Jel ima free verzija?
Postojala je, ali više nema. Snađi se kao i većina

Podrška u C++ Builderu:
Ah, nećemo sada uspoređivati C++ Builder koji je na tržištu više od 10 godina, sa ovom bibliotekicom.
To je ipak profesionalni proizvod...
Te komponente su dostupne i za C# : link
Jeli dobar Enterprise 6?
Jeli dobar Enterprise 6?
Rad Studio tj. C++ Builder XE2 je zadnji. Za cca 2 mjeseca dolazi XE3 s podrškom za android i ios.
Razmisljam o tom C++ Builderu,dali je to dobro za pocetnika?
Nope, jer skoro pa nitko ne programira u tome. Ako si na linuxu skini Eclipse CDT, ako si na Win skini VS. Imas free VS2012 Release canditate za skinuti, a valjda ce i express dati kada izade full verzija iako se nesto suska da nece. :D
Mislim ako ti se da zafrkavati sa hardcore text editorima nitko ti ne brani. Da ne ispadne da meljem ovako je u FB:
There’s freedom in choosing editors, so the usual suspects –emacs and vim– are quite popular, with some Eclipse and others here and there.
Mozes probati i netbeans(to osobno nisam koristio):
http://stackoverflow.com/questions/89275/best-c-ide-or-editor-for-windows
ako mene pitas VS + Visual Assist je najbolja kombinacija, osim sto naravno VA kosta 250$ godisnje, i jos ga nema za Express verzije ako se ne varam. :D
Eclipse CDT me iritirao dok sam radio na njemu, ali nije tako los.
Razmisljam o tom C++ Builderu,dali je to dobro za pocetnika?
Nope, jer skoro pa nitko ne programira u tome.
Naravno da programira. Samo registriranih developera ima 2.1 milijun (po embarcaderovoj statistici), plus barem tri puta više ih koristi C++ Builder na crno. Još sada kada dođe podrška za android i ios itekako će postati puno popularniji.
I uopće nije loš za početnika. Brz je i jednostavan. No nema ga u besplatnoj verziji i to je svakako mana.
Znaci imam ova dva programa:
Client:
A opet mi ne radi.
Ja sam totalno zabrijao, nakon lutanja po sourceu SFML-a shvatio sam da sam ja nešto krivo shvatio i da onaj tutorijal navodi na krivi trag. Naime status koji UDPSocket::Bind vraća nije samo error, te je pogrešno hvatati greške pomoću:
if (!Socket.bind(4456))
Lik koji je pisao tutorial nije ništa stavio unutar if bloka te se njegov kod i dalje izvršavao nakon "greške", dok je moj izbacivao jer sam tu stavio return.
Ugl. da skratim. Pobrini se da i u klijentu i serveru imaš identičan broj za port, te da je IP adresa ili stvarna lokalna adresa računala na kojem isprobavaš program ili localhost adresa (127.0.0.1). Prvo pokreni server, a nakon toga klijent. Otipkaj nešto u klijentu i pritisni enter i server će primiti paket.
Btw. pogrešno si imenovao programe, server ti je onaj gornji koji čeka paket, a klijent je doljnji koji se spaja na server i šalje mu paket.
A ja si sada idem nabaviti papirnatu vrećicu...
Hvala.
Sad imam jedno pitanje,zelim instalirati VS 2010 Express ali imam ponuđene samo zasebne IDE-e,npr Visual C++,Visual C#,Visual Basic,a nemam ono da instaliram i onda kad pokrenem VS da odaberem jezik(full paket).
Zato što je to Visual Studio Express Edition. Moraš skinuti Proffesional, ako si student ili srednjoškolac. Ali pobogu, zašto će ti puna verzija. Express ti je sasvim dovoljan.
Koji su key kodovi za strelice gore-dolje-ljevo-desno?
Imam problem.
case sf::Keyboard::isKeyPressed(sf::Keyboard::Right): std::cout << "Right button pressed" << std::endl; break;
Na ovoj liniji dobivam errore.
C:\SFMLGame\main.cpp||In function 'int main()':|
C:\SFMLGame\main.cpp|30|error: 'sf::Keyboard::isKeyPressed(sf::Keyboard::Key)' cannot appear in a constant-expression|
C:\SFMLGame\main.cpp|30|error: a function call cannot appear in a constant-expression|
||=== Build finished: 2 errors, 0 warnings ===|
Koji su key kodovi za strelice gore-dolje-ljevo-desno?
Key kodovi variraju ovisno o izvoru odakle ih dobivaš, tako da nema nekakvog standarda. Tebe vjerojatno zanimaju SFML key kodovi, tj kako čitati input sa tipkovnice.
Primjeri kako obraditi različite eventove (uključujući i keyboard event):
http://www.sfml-dev.org/tutorials/2.0/window-events.php
Ovdje su ti imena svih tipki na tipkovnici koje možeš koristiti u SFML-u:
http://www.sfml-dev.org/documentation/2.0/classsf_1_1Keyboard.php
A tu također imaš i objašnjeno kako čitati tipke iz tipkovnice bez event sustava, dakle u bilo kojem trenutku (skrolaj dolje ispod popisa tipki)
A zasto mi neradi ovaj kod?
Imam problem.
case sf::Keyboard::isKeyPressed(sf::Keyboard::Right): std::cout << "Right button pressed" << std::endl; break;
Na ovoj liniji dobivam errore.
Ne, to ne može ići u switch-case
Probaj ovako:
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right))
{
std::cout << "Right arrow pressed\n";
}
Ja sam prije bio napravio ovako:
case sf::Event::KeyPressed: sf::Keyboard::Right; std::cout << "Right button pressed" << std::endl; break;
Ali pozivalo se kad je bilo koji key bio stisnut.
Sad radi,hvala.