[C++/WinAPI] Problem Z Armata

0

Bawię się już trochę w WinAPI , (wiem że nie nadaje się do gier) i wpadłem na pomysł stworzenia gry w której za pomocą kul wystrzeliwanych z armaty niszczyłbym obiekty :) , problem dotyczy w rysowaniu armaty:
tzn.

                MoveToEx(hdc,560,560,NULL);
                LineTo(hdc,dirX,dirY);//Brak pomysłu

Za nic w świecie nie umiem skrócić armatę do stałej wielkości np. (do X60,Y60)

Kolejny problem dotyczy tworzenia kul, widziałem już sporo kodów źródłowych , ale w każdym był limit,
do 60,80 pocisków, a wszystko wykonywane było w pętli, pytanie , jak zbudować system wystrzału w którym nie ma limitu,
wątki tu się nie przydadzą (spojrzałem już na popularne gry i ilość wątków to 30-160)

Z resztą sobie poradzę :)

0

ilość wątków w grach to 30-160 O_o?

Mi się zawsze wydawało że gra to jedna wielka pętla = jeden wątek, chyba że sieciowa, ale to pewnie też da się w jednym.

Jeśli chodzi Ci o system wystrzału to najbardziej intuicyjnie było by stworzyć obiekty typu Ball np.

w głownej pętli gry, w danym określonym momencie dodajesz obiekty do naszej sceny, wyliczając dla nich trase ruchu. (tutaj już zależnie czy poruszają się po łuku czy po linii prostej)
Jeśli po linii prostej to korzystasz z prostych działąń ktore mają na celu wyliczenie jednostki przesunięcia. Tą jednostkę dodajesz w kolejnych iteracjach pętli gry, do położenia kuli X/Y.

Obiekt Kuli wyglądał by przykladowo
Ball
{
double X_position;
double Y_position;

double przesuniecie_x;
double przesuniecie_y;

public void UpdateBall()
{
//tylko przykladowo
X_position+=przesuniecie_x;
Y_position+=przesuniecie_y;
}
//
//
//
}
muszą być double ponieważ dodając kolejne jednostki przesunięcia, jeśli beda one ułamkiem, zostaną pominięte.
Rysując kule rzutujesz oczywiście X/Y na inta

wpierw posiedz, pomysl nad strukturą gry.

0

z tego co napisałeś kojarzy mi się tylko taka funkcja :D array() i dodawanie elementow do niej :)
ale w C++ NIE MA czegoś takiego no chyba że podpiąć Lua pod projekt :)

tworząc obiekt musiałbym go gdzieś zapisać np. do tablicy :D ball[60] no i mamy limit :P

Co do wątków , sam winamp ma 36 :D i po co mu tyle :D?

a co do 1 problemu z poruszaniem się aramty :D to rozwiązałem to w 50%

                while(dirX<520){
                    dirX++;
                }
                while(dirY<520){
                    dirY++;
                }

:D widać że wydajnie :D 50% mocy procesora :D
no i na dodatek robi się ograniczenie kwadratowe :D
a dzielenie dirX i dirY nic nie daje :P

nie wpada mi żadny pomysł by to zoptymalizować , ale wiem że trzeba użyć sin() albo cos() :D bo to do kątów służy :D tylko jak nie wiem :D

Ekran gry(600,600)

Jak źle zrozumiałem to sry :P ,ale ja szybko przeskoczyłem z C++ :D bo miałem dość konsoli :P
</i>

0

Proszę, proszę, nie wstawiaj tyle emotek...

Większość gier jest jednowątkowych, chcesz się przekonać? Włącz np diablo2 na kilkurdzeniowcu i zobacz ile rdzeni zużywa... Jeden.

Po drugie to jeżeli nie ma rzeczywistej potrzeby to robienie z pętli głównej gry czegoś wielowątkowego to samobójstwo, trzeba dbać wtedy o synchronizacje, czyli jedno czeka na drugie i praktycznie i tak nic nie zyskujemy...
Napisałem dosyć prosty engine do gry 2d na wzór BaldursGate i troszkę o tym wiem.

Dalej. Funkcja array?
Jakoś zawsze zydawało mi się że w c++ są tablice.
A jeżeli tak nie chcesz być ograniczonym przez wielkość tablicy to stworz sobie liste na wskaźnikach, żaden kłopot. Dokładasz ile chcesz elementów.
Aczkolwiek sądzę że ograniczenie ilości kul do liczby np 70 było by ok. Wystrzelisz więcej naraz?


                while(dirX<520){
                    dirX++;
                }
                while(dirY<520){
                    dirY++;
                }

Przecież to bez sensu jest... Czy przeczytałeś ze zrozumiemiem co napisałem?

zakadając że armata jest w lewym dolnym rogu, tak domyslam sie po tych whileach (?).
masz punkt P0 oznaczający postument armaty, jest nieruchomy, taki początek lufy.
Dalej masz punkt P1 ktory oznacza punkt końcowy lufy. w ten sposob mamy prostą w układzie współrzędnych.

przykladowo jest tak:

y
| p1*
|
|p0*
|_________________x

obliczasz odległość x-owa i y-owa

double x_way = Abs(p0.x-p1.x)
double y_way = Abs(p0.y-p1.y)

dalej te wartosci dzielisz przez odległość w układzie współrzędnych
double way_xy = Sqrt((x_wayx_way)+(y_wayy_way));

double x_way_mod = x_way/way_xy;
double y_way_mod = x_way/way_xy;

potem w pętli głównej gry, gdy nastepuje moment przesuniecia odpowiednio dodajesz przesuniecia do położenia kuli. Przesuniecia mozesz mnozyc aby byly wieksze = kula szybciej leciałą.

pozdrawiam.

:D

0

co do poruszania armata , nic z tego zrobiłem tak jak pisałeś
i kreska(armata) tylko przedziela ekran na 2 części :D

0

Co?
ja tutaj nie poruszam armatą. Tylko wliczam jak ma kula lecieć. Wcześniej wspomniałeś że przesuwanie 50% zabiera, a gra chodzi na pętli czasu rzeczywistego? Zapewne nie.

zresztą, po chorobe ja się produkuje skoro wiesz lepiej

0

lot kuli to ja wiem mi potrzeba ruch armaty
a dziś źle myślę więc nie miej do mnie pretensji :D

a co do ruchu to jednak dzielenie działa ale tylko od x0 y0

MoveToEx(hdc,0,0,NULL);
LineTo(hdc,dirX/10,dirY/10);

Jednak tak sobie myślę to dzielenie nic mi nie pomoże :P bo nie trzyma się stałych wielkości :(
nie masz jakiegoś pomysłu , przecież dla was to pestka , obracanie wokół okręgu znając punkt w który celujemy

0

Hah, nie zrozumialem Cie dobrze ;P
Pisałeś że masz problem z kulami. I ja o tych kulach się produkuje.

Więc co do armaty.

obracanie wokół punktu
pseudokod
r=100;
{
y:=round(rsin(kat));
x:=round(r
cos(kat));

putpixel(x+100,y+100,1);
kat:=kat+0.1;
}
puszczając to w pętli otrzymasz okrąg o srodku w punkcie 100,100

więc przykladowo:
x,y czubkiem armaty.
strzałkami zmieniasz wartość kąta, +/-
r- długość armaty
łączysz dwa punkty( stały, piedestał armaty z wyliczonym x,y

O to chodzi?

0

z tego co napisałeś to tak, mi nie działa ale pewnie to moja wina :D spróbuje jutro jeszcze,
że tak trudno znaleźć w google prosty obrót albo skracanie odcinków wszystko ale nie podstawy
to jest jakiś skandal :D

dziś też jeszcze popróbuje , ale wątpię czy mi jeszcze coś wyjdzie , jakbym szedł do szkoły to bym się nauczycieli spytał bo od tego są i za to im płacą :D ale tak to święta i nie ma kto pomóc

0

samo "nie działa" nic nie mówi ;P
konkrety.
W jakim punkcie masz 'podstawę' armaty?

0

armatę chce umieścić w punkcie 540 / 540 :)

wiem

destX=540+katX;
destY=540+katY;

:D

0

Co Ci nie działa? Przecież napisał, że to pseudokod.

Najlepiej pokaż kod tej gry.

0

to nawet gra nie można nazwać :)
idea jest , a zazwyczaj zaczynam od tego czego nie wiem by później kodu nie szpecić :P
więc nie wiem po co ci kod? :D jak to szablonem można nazwać

0

No to po pierwsze WinAPI w zasanie nie nadaje się do gier. Naucz się DirectXa, OpelGLa lub SDLa.

0

z moich doświadczeń SDL , jest do d... , może fajnie się pisze ale po pewnym czasie same nerwy bo brak funkcji :) , co do OpenGL znam już go trochę ale nie na tyle by brać się za gry 3D, DirectX nigdy nie próbowałem ale będę bo uważam że ma lepsze możliwości od OpenGL widząc po recenzjach OpenGL 3.0 :)

Irrlich , Ogre , itp. itd. to nie dla mnie , lubie robic w podstawkach
a czemu robie w WinAPI? tak sobie , ucze się tu podstaw , no i chcę wykuć wszelkie dostępne możliwości z winapi , sporo już się wyuczyłem , ale jest tego więcej :)

http://darkcult.gamedev.pl/index.html
http://darkcult.org/

stąd przykuwam , tak na marginesie
dlatego robie gierki w WinAPI, chociaż krew zalewa z obsługą kursorów :D
no to by było chyba na tyle w opisie dlaczego robie w WinAPI
(tak jak pisalem znam ale nie pisze w OPENGL ) pozdr :)

0

armata jest w pkt(540,540), czyli tak na dole ekranu u Ciebie.

pseudokod

mainloop
zmienne
kat,x,y,r;
while (costam)
{
    KeyBEventOccured
    {
        :left_arrow   zmiany kąta
        :right_arrow  zmiany kąta
                 {
                    y=round(r*sin(kat))+540;
                    x:=round(r*cos(kat))+540;
                  }
    }else
         
       {

            Clear();
            DrawLine(540,540,x,y);            //armata rendering ;P
            //inne
        }
}
0

tak już zrobiłem :)
dodając limit na kat by ktoś kto by w to grał nie za bardzo poluzował śrubkę :P

a co do ilości tych kól (z listą wskaźników)
to czy mógłbyś zapodać linka do jakiegoś kursu :)

PS.wcześniej pisałeś że 70 kul wystarczy , popatrz na gry dużych firm :D oni się nie napasą
limitem to ja też nie chce :D hehe
a na przyszłość do jakiejś strategii mogę to wykorzystać :)

0

jeśli limit jest sensownie uargumentowany to jak najbardziej. W tym konkretnym przypadku, to wątpie aby na ekranie było renderowanych aż tyle na raz. to zależy jeszcze jaki delay zaprogramujesz pomiędzy strzałami.

na stronie http://darkcult.gamedev.pl/index.html jest, algorytmy/kolejka

0

chce zrobić małą "rzeźnię" więc wole nie mieć narzuconego limitu :)
a tak na marginesie jaki jest najwydajniejszy sposób na wykrywanie kolizji ?
znam tą najprostszą , czytałem też
http://www.metanetsoftware.com/technique/tutorialA.html
ale najszybsze wykrywanie kolizji nigdy nie znalazłem :)
może tobie coś się o głowę obiło skoro już mamy temacik
(pisze 1 na rok :D więc wiesz)

0
Kompletne Z-Ero napisał(a)

a co do ilości tych kól (z listą wskaźników)
to czy mógłbyś zapodać linka do jakiegoś kursu :)

Poczytaj sobie o kontenerach, w standardowej bibliotece znajdują się implementacje list, map i vector'ów. Napisanie samemu prostej listy też nie powinno zabrać wiele czasu. Skoro nie chcesz być ograniczony przez ilość tych obiektów to musisz je tworzyć dynamicznie.
pozdrawiam :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1