Strona: [  << <   1   > >>  ]  z  1     
Autor Temat: VB Gra
mikmas
From Łódź Stadt




Typ: neutral
Postów: 772
Zarejestrowany: Apr 2003
VB Gra

Jak zrobić prostą grę np. strategiczną? Indexowane obrazki odpadają, bo porównanie, czy bohater się z nimi zdeżył za długo trwa. Może ktoś ma pomysł?


_____________________________________________
4C;65;70;69;65;6A;20;62;79;9C;20;73;69;EA;20;
62;61;72;64;7A;69;65;6A;20;73;6B;6F;6E;63;65;
6E;74;72;6F;77;61;B3;20;6E;61;20;6F;64;70;6F;
77;69;65;64;7A;69;2C;20;61;20;6E;69;65;20;6E;
61;20;72;6F;7A;73;7A;79;66;72;6F;77;79;77;61;
6E;69;75;20;3A;50

28-07-2004 20:12
Pokaż profil mikmas  Wyślij email do mikmas   Odwiedź stronę mikmas       3632553
bisiek




Typ: neutral
Postów: 487
Zarejestrowany: Jul 2003

Użyj api BitBlt lub coś w tym rodzaju. Poszukaj w Api-Guide.


_____________________________________________
www.mob.abc.pl - moja strona o VB

28-07-2004 22:03
Pokaż profil bisiek  Wyślij email do bisiek   Odwiedź stronę bisiek       3380672
hicks
raptor user



Typ: moderator
Postów: 279
Zarejestrowany: Apr 2003

DirectX... jedno słowo i wszystko wiadomo (po za kodem )


_____________________________________________
TLHW Clan member

28-07-2004 22:30
Pokaż profil hicks  Wyślij email do hicks   Odwiedź stronę hicks       2511367
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004


Jak zrobić prostą grę np. strategiczną?

Pytanie bardzo rozległe


Indexowane obrazki odpadają, bo porównanie, czy bohater się z nimi zdeżył za długo trwa. Może ktoś ma pomysł?


Rozumiem, że twoje pytanie dotyczy sprawdzania, czy zaszło jakieś zdarzenie. W naszym przypadku tym zdarzeniem będzie zderzenie (nazwijmy je Impact).
Zatem tak:
Jeśli poruszasz się kimś po planszy, to masz jego pozycję. Pozycja jest jakaśtam X i Y. Ponieważ napisałeś o indeksowanych obrazkach - mniemam, że ta gra ma podział na pola. Zatem PRZED wykonaniem ruchu, ale PO naciśnieciu przez gracza klawiszy - sprawdzasz, czy postać może się poruszyć w daną stronę, czyli, czy klocek na który by weszła nie uniemożliwia jej tego. Jeśli nie uniemozliwia - wchodzi. jesli uniemożliwia - wywolujesz sobie dalej odpowiednie procedurki obsługujące Impact. Koniec.

Jeśli chcesz jakiś fragment kodu, to daj znać, napiszę coś.

[Post edytowany dnia 28-07-2004 22:47 przez marcin_an]


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

28-07-2004 22:45
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
mikmas
From Łódź Stadt




Typ: neutral
Postów: 772
Zarejestrowany: Apr 2003

Marcin! Chyba rozumiesz, co mnie boli! Otóz tak! Mam podzieloną planszę na pola (pól jest dość dużo) i chcę posprawdzać, czy może postać iść. Potrafisz coś takiego napisać? Bym był Ci baardzo wdzięczny. Możesz na maila:


_____________________________________________
4C;65;70;69;65;6A;20;62;79;9C;20;73;69;EA;20;
62;61;72;64;7A;69;65;6A;20;73;6B;6F;6E;63;65;
6E;74;72;6F;77;61;B3;20;6E;61;20;6F;64;70;6F;
77;69;65;64;7A;69;2C;20;61;20;6E;69;65;20;6E;
61;20;72;6F;7A;73;7A;79;66;72;6F;77;79;77;61;
6E;69;75;20;3A;50

29-07-2004 00:25
Pokaż profil mikmas  Wyślij email do mikmas   Odwiedź stronę mikmas       3632553
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Odpisze publicznie, żeby wszyscy wiedzieli .

Otóż tak:
Zakładam, że mapę trzymasz w tablicy i w tej tablicy są zapisane właściwości pól (czyli, że postać może wejść itd.).

Po tym założeniu, podaję przykład kodu:

Private Type dane_o_polu
    bWall As Boolean
    'i dalej inne potrzebne elementy
    'bWall = True oznacza ścianę, czyli zatrzymanie gracza
End Type

'To jest tablica z mapą
Private mapa(99,99) As dane_o_polu
'Pozycja gracza (x,y):
Private graczX As Integer
Private graczY As Integer

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyUp then
        If mapa(graczX, graczY - 1).bWall then
            'procedura obsługi zderzenia ze sciana
        Else
            graczY = graczY - 1
        End If
    ElseIf KeyCode = vbKeyDown then
        If mapa(graczX, graczY + 1).bWall then
            'procedura obsługi zderzenia ze sciana
        Else
            graczY = graczY + 1
        End If
    ElseIf KeyCode = vbKeyRight then
        If mapa(graczX + 1, graczY).bWall then
            'procedura obsługi zderzenia ze sciana
        Else
            graczX = graczX + 1
        End If
    ElseIf KeyCode = vbKeyLeft then
        If mapa(graczX - 1, graczY).bWall then
            'procedura obsługi zderzenia ze sciana
        Else
            graczX = graczX - 1
        End If
    End If
End Sub

Oczywiście jest to forma bardzo uproszczona. Na pierwszy rzut oka widać potencjalny błąd, gdy gracz będzie na brzegu planszy i będzie próbował iść dalej. Jeśli to się stanie, to nastąpi próba sprawdzenia komórki tablicy, której przecież nie ma i będziemy mieli "Subscript out of range". Można tego uniknąć albo ustawiając na brzegach ściany (wtedy nie wejdzie na graniczne pola), albo dopisując odpowiednie fragmenty kodu. Jednak tutaj ich nie dopisywałem, zeby nie komplikować zapisu - podałem tylko podstawowe minimum. To można już sobie dalej rozbudowywać o dodatkowe warunki (np. nie tylko zderzenia ze ścianą, ale także z innymi przedmiotami i tym samym inne zdarzenia) jak również inne kierunki (jeśli gracz może poruszać się na skos). Nie musi to też być wcale umieszczane w procedurze _KeyDown. Ale to pozostawiam już twojej pomysłowości.

UWAGA: sam sposób jest skuteczny, ale możliwe, że pisząc to tutaj zrobilem jakąś głupią literówkę - dlatego w przypadku błędów radzę się dobrze przyjrzeć nazwom i składni.. może gdzieś zapomniałem If'a zamknąć itd.

[Post edytowany dnia 29-07-2004 00:51 przez marcin_an]


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

29-07-2004 00:50
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
mikmas
From Łódź Stadt




Typ: neutral
Postów: 772
Zarejestrowany: Apr 2003

Qde. Chyba nie zrozumiałeś o co mi chodzi . Wtedy zrobię grę podobnej do mojej gry "Your Doom" (ftp://protom.one.pl/pub/usr/mm/gry/yourdoom/setup.exe)... Natomiast ja chciałbym się poruszać ludkiem tak jak np. w grze RecWar: http://www.student.kun.nl/willemjanssen/recwar
tam to się "jeździ" po polach, a nie tak jak tu (przynajmniej tak wywnioskowałem) "przeskakuje" z pola na pole

[Post edytowany dnia 29-07-2004 14:36 przez mikmas]


_____________________________________________
4C;65;70;69;65;6A;20;62;79;9C;20;73;69;EA;20;
62;61;72;64;7A;69;65;6A;20;73;6B;6F;6E;63;65;
6E;74;72;6F;77;61;B3;20;6E;61;20;6F;64;70;6F;
77;69;65;64;7A;69;2C;20;61;20;6E;69;65;20;6E;
61;20;72;6F;7A;73;7A;79;66;72;6F;77;79;77;61;
6E;69;75;20;3A;50

29-07-2004 14:34
Pokaż profil mikmas  Wyślij email do mikmas   Odwiedź stronę mikmas       3632553
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Przy założeniu, ze pola mają 32 piksele, a gracz porusza się o 1 piksel:

Private Type Dane_o_polu
    bWall As Boolean
    'Reszta
End Type

Private Mapa(99, 99) As Dane_o_polu
Private GraczX As Integer
Private GraczY As Integer

Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    Dim nNewX As Integer
    Dim nNewY As Integer
   
    If KeyCode = vbKeyUp Then
        nNewX = GraczX
        nNewY = GraczY - 1
    ElseIf KeyCode = vbKeyDown Then
        nNewX = GraczX
        nNewY = GraczY + 1
    ElseIf KeyCode = vbKeyLeft Then
        nNewX = GraczX - 1
        nNewY = GraczY
    ElseIf KeyCode = vbKeyRight Then
        nNewX = GraczX + 1
        nNewY = GraczY
    End If
   
    If Mapa(nNewX  32, nNewY  32).bWall Then
        'Zderzenie ze ścianą
    Else
        GraczX = nNewX
        GraczY = nNewY
    End If
End Sub


Dzielimy przez 32, zeby otrzymać pozycję pola, na które WEJDZIE gracz, jesli wykonałby ruch.

[Post edytowany dnia 29-07-2004 15:32 przez marcin_an]


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

29-07-2004 15:31
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
mikmas
From Łódź Stadt




Typ: neutral
Postów: 772
Zarejestrowany: Apr 2003

Sorki, ale nie za bardzo Cię rozumiem. Mógłbyś wysłać na maila?


_____________________________________________
4C;65;70;69;65;6A;20;62;79;9C;20;73;69;EA;20;
62;61;72;64;7A;69;65;6A;20;73;6B;6F;6E;63;65;
6E;74;72;6F;77;61;B3;20;6E;61;20;6F;64;70;6F;
77;69;65;64;7A;69;2C;20;61;20;6E;69;65;20;6E;
61;20;72;6F;7A;73;7A;79;66;72;6F;77;79;77;61;
6E;69;75;20;3A;50

29-07-2004 18:09
Pokaż profil mikmas  Wyślij email do mikmas   Odwiedź stronę mikmas       3632553
marcin_an
Forumowicz




Typ: neutral
Postów: 1265
Zarejestrowany: Mar 2004

Załóżmy, że poszczególne pola mają wymiary 32x32 piksele (tak jak ikony w świeżym Windowsie).
Pozycja gracza (x, y) jest zapisywana w dwóch zmiennych - GraczX i GraczY. Pozycja ta zapisuje dokładne położenie gracza na mapie. W naszym przypadku mapa ma 100x100 pól, czyli łącznie ma 3200x3200 pikseli i na jednym z tych punktów może stać gracz (to rozumiemy przez pozycję gracza).

Po wciśnięciu klawisza sprawdzamy najpierw, w którą stronę ma się przesunać gracz. W zależności od tego ustawiamy współrzędna na któe się przesunie.

Teraz sprawdzamy, na którym polu leżą współrzędne. W tym celu dzielimy obydwie współrzędne przez 32 (bo tyle wynoszą rozmiary pola).

Więdząc, na którym polu znajdują się nowe współrzędne - sprawdzamy, czy gracz może tam wejść. Jeśli może (bWall = False) - przesuwamy go tam. Jesli nie - zostaje na starym miejscu i zachodzi zderzenie.

To całkowicie wystarcza przy graczu symbolizowanym przez punkt - i tutaj ujawnia się moje pierwsze niedopatrzenie . Zapomniałem ci powiedzieć, że to jest algorytm sprawdzajacy, czy punkt można przesunąć. Ponieważ gracz zwykle nie jest punktem - trzeba wyznaczyć kilka punktów granicznych postaci i sprawdzać je w ten sposób. Ponieważ punkty te będą w stałych relacjach ze sobą (chodzi o położenie), to można sobie potem to poupraszczać.

W podanym kodzie jest błąd - ale nie z mojej winy - forum skasowało znak dzielenia. Ta linia ze skasowanym znakiem wygląda tak:
If Mapa(nNewX  32, nNewY  32).bWall Then
A powinna tak
If Mapa(nNewX \ 32, nNewY \ 32).bWall Then


_____________________________________________
Jedzonko dla Google'a:
Forum na temat Visual Basic, C, C++, Pascal, Programowanie, API, PHP, VBA, VB.NET, QBasic, VBScript, Komputery
Moja strona o wszystkim

29-07-2004 18:22
Pokaż profil marcin_an  Wyślij email do marcin_an   Odwiedź stronę marcin_an  
mikmas
From Łódź Stadt




Typ: neutral
Postów: 772
Zarejestrowany: Apr 2003

Dzięki! Zaraz wypróbuję...


_____________________________________________
4C;65;70;69;65;6A;20;62;79;9C;20;73;69;EA;20;
62;61;72;64;7A;69;65;6A;20;73;6B;6F;6E;63;65;
6E;74;72;6F;77;61;B3;20;6E;61;20;6F;64;70;6F;
77;69;65;64;7A;69;2C;20;61;20;6E;69;65;20;6E;
61;20;72;6F;7A;73;7A;79;66;72;6F;77;79;77;61;
6E;69;75;20;3A;50

29-07-2004 19:12
Pokaż profil mikmas  Wyślij email do mikmas   Odwiedź stronę mikmas       3632553
Wszystkich odpowiedzi: 10 :: Maxymalnie na stronę: 20
Strona: [  << <   1   > >>  ]  z  1