Pokaż wiadomości

Ta sekcja pozwala Ci zobaczyć wszystkie wiadomości wysłane przez tego użytkownika. Zwróć uwagę, że możesz widzieć tylko wiadomości wysłane w działach do których masz aktualnie dostęp.


Wiadomości - cybergod

Strony: [1] 2 3 4 5 6
1
Szkółka / Odp: [Box2D] EdgeShape - problem z definicją/kolizją
« dnia: Lipiec 03, 2018, 17:32:31 »
Dzięki za odpowiedź, ale właśnie udało mi się rozwiązać problem.

Więc, rzecz była w tym, że w Box2D współrzędne wierzchołków działają w następujący sposób:
-jeśli kształt (b2PolygonShape, b2EdgeShape, etc.) nie jest dołączony do ciała, to współrzędne traktowane są jako współrzędne świata (globalne)
-jeśli kształt jest dołączony do ciała, to współrzędne wierzchołków traktowane są jako współrzędne lokalne, względem pozycji środka ciała

Wykorzystując powyższe informacje, zmieniłem definicję wierzchołków EdgeShape na następującą (reszta kodu bez zmian):
b2Vec2 v1 = b2Vec2(-size.x/2/32.f, -size.y/2/32.f),
v2 = b2Vec2(size.x/2/32.f, -size.y/2/32.f),
v0 = b2Vec2(-size.x/32.f, -size.y/2/32.f),
v3 = b2Vec2(size.x/32.f, -size.y/2/32.f);

I teraz wszystko działa tak, jak trzeba.

2
Szkółka / [Box2D] EdgeShape - problem z definicją/kolizją
« dnia: Lipiec 03, 2018, 10:45:13 »
Uczę się właśnie biblioteki Box2D i mam pewien problem. Chcę sobie napisać platformówkę. Udało mi się zrobić ruch gracza po platformach, no ale platformy zdefiniowane jako PolygonShape doprowadzają do tzw. ghost collision, więc powinienem je zdefiniować jako EdgeShape. I tu jest problem: gracz w ogóle nie koliduje z platformą zdefiniowaną jako EdgeShape, ale wyświetla się tam, gdzie ma być. W obu przypadkach platforma ma ustawiony typ b2_staticBody, a pozycję i rozmiar podaję w pikselach i zamieniam później na metry. Nie mam pojęcia co robię nie tak. Do rysowania używam SFML.

Tutaj kod definujący paltformę jako EdgeShape:
void Object::InitAsEdgeBody(b2World *world, sf::FloatRect rect,
b2BodyType type, void *userData, bool originBasedPosition, float friction,
float restitution, bool isSensor)
{
        //parametr rect to pozycja i rozmiar obiektu w pikselach

size = sf::Vector2f(rect.width, 1.f); //rozmiar obiektu w pikselach

b2BodyDef bodyDef;

b2Vec2 bodyPosition;
if (!originBasedPosition) //pozycja liczy się od lewego górnego rogu obiektu
{
bodyPosition.x = (rect.left + size.x / 2) / 32.f; //pixels to meters
bodyPosition.y = (rect.top + size.y / 2) / 32.f; //pixels to meters
}
else //pozycja liczy się od środka obiektu
{
bodyPosition.x = rect.left / 32.f; //pixels to meters
bodyPosition.y = rect.top / 32.f; //pixels to meters
}

bodyDef.position = bodyPosition;
bodyDef.type = type;
body = world->CreateBody(&bodyDef);

b2EdgeShape bodyShape;
b2Vec2 v1 = bodyPosition;
b2Vec2 v2 = b2Vec2((bodyPosition.x*32.f + size.x) / 32.f, bodyPosition.y);

b2Vec2 v0 = b2Vec2((bodyPosition.x*32.f - size.x) / 32.f, bodyPosition.y);
b2Vec2 v3 = b2Vec2((bodyPosition.x*32.f + size.x) / 32.f, bodyPosition.y);

bodyShape.Set(v1, v2);
bodyShape.m_vertex0 = v0;
bodyShape.m_vertex3 = v3;
bodyShape.m_hasVertex0 = true;
bodyShape.m_hasVertex3 = true;

b2FixtureDef fixtureDef;
fixtureDef.friction = friction;
fixtureDef.restitution = restitution;
fixtureDef.isSensor = isSensor;
fixtureDef.userData = userData;
fixtureDef.shape = &bodyShape;
body->CreateFixture(&fixtureDef);
}

Dla porównania kod definiujący działającą platformę jako PolygonShape:
void Object::InitAsRectangularBody(b2World *world, sf::FloatRect rect,
b2BodyType type, void *userData, bool originBasedPosition, float friction,
float restitution, bool isSensor)
{
size = sf::Vector2f(rect.width, rect.height);
b2BodyDef bodyDef;

b2Vec2 bodyPosition;

if (!originBasedPosition)
{
bodyPosition.x = (rect.left + size.x / 2) / 32.f; //pixels to meters
bodyPosition.y = (rect.top + size.y / 2) / 32.f; //pixels to meters
}
else
{
bodyPosition.x = rect.left / 32.f; //pixels to meters
bodyPosition.y = rect.top / 32.f; //pixels to meters
}

bodyDef.position = bodyPosition;
bodyDef.type = type;
body = world->CreateBody(&bodyDef);

b2PolygonShape bodyShape;
bodyShape.SetAsBox(rect.width / 2 / 32.f, rect.height / 2 / 32.f); //pixels to meters

b2FixtureDef fixtureDef;
fixtureDef.friction = friction;
fixtureDef.restitution = restitution;
fixtureDef.isSensor = isSensor;
fixtureDef.userData = userData;
fixtureDef.shape = &bodyShape;
body->CreateFixture(&fixtureDef);
}

3
Warsztat Summer of Code 2013 / Odp: Warsztat Summer of Code 2013
« dnia: Październik 08, 2013, 19:05:29 »
Do wszystkich grających w moją grę (Zombie Onslaught): w grze dostępne są inne rodzaje broni. Zmieniamy broń klawiszami [1], [2], [3], [4]. Nie wspomniałem o tym w sterowaniu, Przepraszam za to niedopatrzenie (tak to jest, jak wysyła się grę w ostatniej chwili :/).

4
Warsztat Summer of Code 2013 / Odp: Zombie Onslaught
« dnia: Październik 01, 2013, 20:54:23 »
Dostępna jest nowa wersja gry. Dodałem w niej walkę z bossem (gdzie występuje też nowy typ zombie), zmniejszyłem liczbę wypadających magazynków, dodałem kolor tła w menu i ekranie śmierci. Niestety, zabrakło mi czasu, aby bardziej dopieścić grę, aczkolwiek jest grywalna. Link ten sam, co w pierwszym poście, czyli: https://dl.dropboxusercontent.com/u/18801631/Zombie%20Onslaught.zip

Hej!

Przecież można się bardziej postarać!

Jest tu strasznie nieintuicyjne zbieranie amunicji. Wchodzę w ikonkę i zaczynam się zastanawiać co tak naprawdę zebrałem, tracąc czas na wybieranie broni.

Nie mówię już o paintowej grafice której poprawienie to 2 godziny roboty :P Do roboty!!

Dzięki za krytykę. W następnej wersji poprawię te rzeczy. Staram się jak mogę, ale grafik ze mnie beznadziejny (grafikę robiłem w programie GraphicsGale FreeEdition, nie w Paincie). Co do zbierania amunicji, to faktycznie może niezbyt intuicyjne, ale po paru razach można się w tym zorientować.

5
Programowanie grafiki / Odp: [SFML 2.0] Okno a klasy
« dnia: Wrzesień 03, 2013, 20:45:05 »
Pierwszy sposób:
Spraw, aby klasa Map dziedziczyła po sf::Drawable
class Map: public sf::Drawablei potem dajesz w klasie:
private:
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const;
i w implementacji tej funkcji dajesz np.
target.draw(sprite); //jeżeli w klasie jest zmienna sprite typu sf::Spritea potem w pętli głównej
window.draw(mapa); //gdzie mapa to instancja klasy Map
Drugi sposób:
W klasie tworzysz funkcję np.
void Draw(sf::RenderTarget &target);w tej funkcji podobnie jak w poprzednim punkcie dajesz np.
target.draw(sprite);i tą funkcję wywołujesz w pętli. W argumencie podajesz zmienną typu sf::RenderWindow.

6
Warsztat Summer of Code 2013 / Odp: Zombie Onslaught
« dnia: Sierpień 31, 2013, 13:02:50 »
Dobra, gra już działa jak trzeba. Zapraszam do pobierania (link z pierwszego posta), testowania i opiniowania.

7
Dzięki za pomoc i opinie. Wymyślę jakiś sposób na zmniejszenie liczby pojawiających się magazynków i dodam bossów.

8
Kurde, taki głupi błąd. U mnie zawsze działało, więc nie zwracałem uwagi na to, czy funkcja ma końcowy return. Widocznie w systemach 32-bitowych zawsze zwraca false a w 64-bitowych true. Teraz mam nauczkę :) Dzięki za pomoc. Już to poprawiłem (dałem na końcu funkcji return true). Sprawdźcie, czy teraz działa: https://www.dropbox.com/s/w0pgnp4a3w1a9ct/Zombie%20Onslaught.zip

9
Dobra, daję link do projektu, bo sam chyba już nic nie wymyślę i nie mam Windowsa 64-bit:https://www.dropbox.com/s/6momczc509jk5e9/Zombie%20Onslaught%20src.zip
Z góry dzięki za pomoc.

10
No to ja już na prawdę nie wiem o co chodzi. Po wczytywaniu dalej jest taki kod:
tileset.setTexture(tileset_tex);
menu_logo.setTexture(ml_tex);
menu_logo.setPosition(91,22);

weapon_info.setFont(font);
weapon_info.setPosition(0,0);
weapon_info.setCharacterSize(20);

death_text.setFont(font);
death_text.setPosition(190,180);
death_text.setCharacterSize(25);

wave_info.setFont(font);
wave_info.setPosition(350,0);
wave_info.setCharacterSize(20);

countdown_text.setFont(font);
countdown_text.setCharacterSize(40);
countdown_text.setColor(sf::Color::Red);
countdown_text.setPosition(380,280);

pause_text.setFont(font);
pause_text.setCharacterSize(30);
pause_text.setPosition(220,160);
pause_text.setString(sf::String(L"             PAUZA\n\n[ESC] Graj dalej\n[ENTER] Wyjdź do menu"));

countdown_num = COUNTDOWN_SEC;
countdown = true;
pause = false;

crosshair.setTexture(crosshair_texture);

btnNewGame = Button(sf::Vector2f(350,175+40),sf::Vector2f(100,40),"Graj",font,sf::Color::Color(46,139,87),sf::Color::White,25);
btnExit = Button(sf::Vector2f(350,250+40),sf::Vector2f(100,40),L"Wyjście",font,sf::Color::Color(46,139,87),sf::Color::White,25);

game_state = GS_MENU;
game_mode = GM_SURVIVAL;

    while (window.isOpen())
    {
        while (window.pollEvent(event))
        {
if(game_state == GS_MENU)
{
Menu_Events();
}
else if(game_state == GS_PLAYING)
{
Game_Events(GM_SURVIVAL);
}
else if(game_state == GS_DEATH)
{
Death_Events();
}

if (event.type == sf::Event::Closed)
                window.close();

if(event.type == sf::Event::MouseMoved)
{
crosshair.setPosition(event.mouseMove.x - 8,event.mouseMove.y - 8);
}
        }

if(game_state == GS_MENU)
{
Menu_Logic();
}
else if(game_state == GS_PLAYING)
{
Game_Logic(GM_SURVIVAL);
}
else if(game_state == GS_DEATH)
{
Death_Logic();
}

        window.clear();
if(game_state == GS_MENU)
{
Menu_Drawing();
}
else if(game_state == GS_PLAYING)
{
Game_Drawing(GM_SURVIVAL);
}
else if(game_state == GS_DEATH)
{
Death_Drawing();
}

        window.display();
    }
    return 0;

I funkcje Menu, Game, itd.:
void Menu_Drawing()
{
window.draw(menu_logo);
window.draw(btnNewGame);
window.draw(btnExit);
window.draw(crosshair);
}

void Menu_Logic()
{
btnNewGame.Logic(event);
btnExit.Logic(event);
if(btnExit.Clicked(event))
{
window.close();
}
if(btnNewGame.Clicked(event))
{
game_state = GS_PLAYING;
game_mode = GM_SURVIVAL;
}
}

void Menu_Events()
{
        //wykomentowałem to, bo zmieniłem sposób sprawdzania kliknięcia, poprzedni nie działał jak trzeba

/*btnNewGame.HandleEvents(event);
btnExit.HandleEvents(event);*/       
}

void Game_Logic(GAME_MODE gm)
{
if(countdown)
{
static sf::Clock c;
std::stringstream s;
s<<countdown_num;
countdown_text.setString(sf::String(s.str()));

if(c.getElapsedTime().asSeconds() >= 1)
{
countdown_num -= 1;
c.restart();
}

if(countdown_num <= 0)
{
countdown = false;
}
}
else if(pause == false)
{
if(gm == GM_SURVIVAL)
{
zombie_spawner.Logic(player);
player.Logic();
wave_info.setString(zombie_spawner.GetWaveInfo());
weapon_info.setString(player.WeaponInfo());

for(int z = 0; z < zombie_spawner.GetZombiesCount(); z++)
{
for(int b = 0; b < player.GetWeaponBulletCount(); b++)
{
if(zombie_spawner.GetConcreteZombieRect(z).intersects(player.GetConcrBulletBox(b)))
{
player.SetWeaponConcrBulletCanDestroy(b);
zombie_spawner.HurtConcrZombie(z,player.GetWeaponDamage());
}
}
}

if(player.GetHP() <= 0)
game_state = GS_DEATH;
}
else if(gm == GM_TESTING)
{
//kod;
}
}
}

void Game_Drawing(GAME_MODE gm)
{
if(countdown)
{
window.draw(countdown_text);
}
else if(pause)
{
window.draw(pause_text);
}
else
{
if(gm == GM_SURVIVAL)
{
tileset.setTextureRect(sf::IntRect(0,0,32,32));

for(int i = 0; i < 25; i++)
{
for(int j = 0; j < 19; j++)
{
tileset.setPosition(i*32,j*32);
window.draw(tileset);
}
}
window.draw(zombie_spawner);
window.draw(player);
window.draw(crosshair);
window.draw(weapon_info);
window.draw(wave_info);
}
else if(gm == GM_TESTING)
{
//kod;
}
}
}

void Game_Events(GAME_MODE gm)
{
if(!countdown)
{
if(gm == GM_SURVIVAL)
{
zombie_spawner.HandleEvents(event);
player.HandleInput(event);
}
else if(gm == GM_TESTING)
{
//kod;
}

if(event.type == sf::Event::KeyPressed)
{
if(event.key.code == sf::Keyboard::Escape)
pause = !pause;

else if(event.key.code == sf::Keyboard::Return)
{
zombie_spawner.Reset();
player.Reset();
countdown = true;
pause = false;
countdown_num = COUNTDOWN_SEC + 1;
game_state = GS_MENU;
}
}
}
}

void Death_Logic()
{
std::stringstream ss;
sf::String s;
int wn = zombie_spawner.GetWaveNumber() - 1;
int wn1 = wn % 10;
s += "                      KONIEC GRY\n\n";

ss << wn;

s += L"      Przeżyłeś ";
s += ss.str();

if( wn1 == 1)
s += L" falę";
else if( wn1 < 5 && wn1 != 0 )
s += " fale";
else if( wn1 >= 5 || wn1 == 0)
s += " fal";

ss.str("");
ss << zombie_spawner.GetKilledZombiesNum();
s += L" i zabiłeś ";
s += ss.str();
s += " zombie.";
s += L"\n\nNaciśnij ENTER, aby powrócić do menu...";

death_text.setString(s);
}

void Death_Drawing()
{
window.draw(death_text);
}

void Death_Events()
{
if(event.type == sf::Event::KeyPressed)
{
if(event.key.code == sf::Keyboard::Return)
{
zombie_spawner.Reset();
player.Reset();
countdown = true;
pause = false;
countdown_num = COUNTDOWN_SEC + 1;
game_state = GS_MENU;
}
}
}

11
Dobra, może teraz będzie w porządku. Zrobiłem static build i wczytywanie plików z uwzględnieniem Working Directory (za pomocą funkcji _getcwd()). Link do pobrania ten sam, co w pierwszym poście tematu o grze, czyli https://www.dropbox.com/s/w0pgnp4a3w1a9ct/Zombie%20Onslaught.zip

12
Zdecydowanie, Twój problem leży w innym miejscu. Co się konkretnie źle dzieje, gdy odpalasz swoją grę na systemie 64-bit?
Gra nie może wczytać pliku czcionki (times.ttf) i log się nie tworzy albo w zupełnie innym miejscu(log tworzę tak: std::ofstream log("log.txt"); i później jeżeli !log.good() to zamykam program).

Daj asserty i wyslij komuś debuga
Nie wiem, jak używać assertów, więc mógłbyś mnie poinstruować?

13
Szkółka / Kompilacja wersji 64-bit na systemie 32-bit - czy możliwa?
« dnia: Sierpień 26, 2013, 21:12:10 »
Otóż mam problem ze swoją grą. Nie działa prawidłowo na systemie 64-bitowym. Jest pisana w SFML 2.0. Obecnie korzystam z wersji 32-bitowej biblioteki. Na stronie SFML w dziale download zauważyłem taką informację:
Cytuj
On Windows, choosing 32 or 64 bits libraries should be based on which platform you want to compile for, not which OS you have. Indeed, you can perfectly compile and run a 32 bits program on a 64 bits Windows. So you'll most likely want to target 32 bits platforms, to have the largest possible audience. Choose 64 bits packages only if you have good reasons.
Czy w związku z tym mogę na systemie Windows 7 32-bitowym w Visual C++ 2010 Express skompilować grę w wersji 64-bitowej? Jeśli tak, to jak skonfigurować do tego projekt? Czy może wystarczy, że podmienię zainstalowane obecnie pliki LIB, DLL i includy na wersję 64-bitową? Mój procesor jest 64-bitowy.

14
Warsztat Summer of Code 2013 / Odp: Zombie Onslaught
« dnia: Sierpień 26, 2013, 20:35:56 »
Wygląda na to, że moja gra chyba nie lubi 64-bitowego Windowsa ;) Postaram się to naprawić, chociaż nie wiem co może być przyczyną. Może spróbuję skompilować w Code::Blocks z MinGW.

15
Warsztat Summer of Code 2013 / Odp: Zombie Onslaught
« dnia: Sierpień 26, 2013, 12:47:02 »
Pobierz grę jeszcze raz (z linku z pierwszego posta). Dodałem zapisywanie błędów w pliku tekstowym, gdy gra nie może wczytać obrazka. Grę kompiluję na 32-bitowym Windowsie, więc może to w tym problem. Spróbuj też uruchomić w trybie administratora, bo może gra nie ma dostępu do plików. Jeżeli twój antywirus ma Piaskownicę, to dodaj grę do zaufanych aplikacji, bo być może Piaskownica blokuje dostęp do plików.
BTW, ktoś jeszcze pobierał grę i mu nie działa?

Strony: [1] 2 3 4 5 6