zakaz ruchu w elementach mapy

0

Witam
Tworzę Symulator Jazdy Samochodem i mam następujący problem:
Wczytuje mapę i rysuje ją w pętli. Są w niej elementy, po których chciałbym żeby nie można było jeździć. Zrobiłem coś takiego:

Mozliwy_ruch : set of Byte = [0 , 3 , 7] ;
Zakaz_ruchu : set of Byte = [1 , 2 , 4 , 5 , 6] ;
Mapa : array[0..14 , 0..14] of byte ;

Teraz trochę słów wyjaśnienia : mapa jest zbudowana z 15x15 kafelkow po 25x25. Kafelki po ktorych mozna sie poruszać mają numerki 0 , 3 , 7, a pozostałe 1 , 2 , 4 , 5 i 6 są zakazanymi kafelkami. To sprawdzania położenia w którym sie znajdujemy kafelku ([x][y]) użyłem czegoś takiego :

if (mapa[cos tam, cos tam] in Mozliwy_ruch) then

i tu jest problem. Nie wiem co wstawic w 'cos tam' i 'cos tam'. Powinna to być cyfra z przedziału 0..7 oczywiście. Nie wiem, jak sprawdzać położenie samochodziku (dodam że jest on po prostu TImage'iem). Jakoś tak próbowałem, ale nic :

Polozenie_x := ImageWozek.Left div 25
Polozenie_y := ImageWozek.Top div 25
ale gucio wyszło, a teoretycznie powinno być dobrze, pomóżcie... Pozdrówka i dzięki za odpowiedzi

0

Hmm... czemu akurat tych kafelków po kórych nie/da się poruszać jest tylko 8 (0-7)? Wychodzi na to, że można sie poruszać tylko na 3/225 kafelkach. Czy te numery oznaczają kolumnę kafelków?
Image jest na formie?

0

a nie lepiej zamiast Image dla samochodu zrobic cos takiego

var
x_pozycji_samochodu, y_pozycji_samochodu:integer;
begin
plansza.canvas.draw(x_pozycji_samochodu * szerkosc_samochodu, y_pozycji_samochodu * wysokosc_samochodu, Image_samochodu.picture.bitmap);
end;
0

Chciałem tak jak ty to napisałeś CyberKid zrobić, ale nie wiem jak zrobić, żeby zmniejszyć rysowany obrazek :-/ Hmmmm, nie, te kafelki po ktorych nie można jeździć mają po prostu cyferki 1 , 2 , 4 , 5 i 6. Cała mapa jest tablicą dwuwymiarową. Spróbuje zrobić tak jak to CyberKid napisał.

Ale zaraz CyberKid, cały czas nie wiem jak zrobić to, żeby nie można było jeździć po zakazanych kafelkach...

0

{...}

Mapa : array[0..14 , 0..14] of byte ;

{...}

if (mapa[cos tam, cos tam] in Mozliwy_ruch) then

{...}

Polozenie_x := ImageWozek.Left div 25
Polozenie_y := ImageWozek.Top div 25

Wydaje mi się, że to powinno działać o ile wcześniej ustawiłeś wartości (numery kafelków) tablicy Mapa. Czyli:
Mapa[0][0] := 0;
Mapa[1][0] := 1;
...itd.

0

Hmmm, spróbowałem ale gucio. Ehh. Mam prośbę do np. Ciebie MatroX, jak Ci się chce to wejdź na www.edysk.pl, zaloguj się jako loczek15 hasło podaj : haselko, weź wybierz 'Dom' i ściągnij ten mój okropny Symulator i zobacz sam, będe bardzo wdzięczny [hurra]

0

Przesuwasz mape, czy samochód, czy może obie rzeczy naraz ?

0

Nie znalazłem tam kodu tylko samego exeka i parę bitmapek.
Zrobiłem taki teścik i u mnie działa. Ustawiałem różnie Image'a, na różnych kafelkach i na tych, na których ma zakaz poruszania się poniższy warunek jest spełniony.

var
  nie : set of Byte = [1 , 2 , 4 , 5 , 6] ;
  mapa:array[0..14, 0..14]of byte;
  idx, idx1, px, py: Integer;

{...}

begin

  // numerowanie kafelków
  for idx:=0 to 14 do
    for idx1:=0 to 14 do
         mapa[idx][idx1]:=(idx*15)+idx1;

  px :=image1.Left div 25;
  py :=image1.Top div 25;

  if mapa[px][py] in nie then
      // nie można się poruszać
{...}
0

mapa[idx][idx1]:=(idx*15)+idx1;

Nie rozumiem tego : (idx*15) + idx1. Dlaczego tak?

0

To jest tylko numerowanie każdego pola mapy. Czyli:
0x0 = 0 ...(015 + 0)
0x1 = 1 ...(0
15 + 1)
0x2 = 2
0x3 = 3
{...}
0x12 = 12
0x13 = 13
0x14 = 14
{...}
1x0 = 15 ...(115 + 0)
1x1 = 16 ...(1
15 + 1)
1x2 = 17 ...(1*15 + 2)
...itd.

Bo tak zrozumiałem, że mają być numerowane, po kolei. Jeśli nie tak, to ja już nie wiem o co ci chodzi :-P

0

Jeżeli zrobisz to moim sposobem, to samochodzik będzie skakał z pola na pole. Możesz mu dać pewną animację, żeby zamiast skakać, jakoś płynniej jeździł.

A jesli chodzi o zablkowanie wjazdu na jakis kafelek to zrob to tak.

pod VK_DOWN

If tablica_z_kafelkami[x_samochodu, y_samochodu + 1] = wartosc_nie_do_przejazdu then
exit
else
przesun_sie_do(x_samochodu, y_samochodu+1];

w tablica_z_kafelkami po prostu umiesc kafelki tak:
tablica[1,1] = 1;
tablica[1,2] := 0;

0 - nieprzejezdzalne
1 - przejezdzalne

chyba rozumiesz o co mi chodzi?

0

Rozumiem CyberKid, zaraz to sprawdzę...

0

Rozwiązałem już problem. Napisze jak, ALE BŁAGAM NIE ŚMIEJCIE SIĘ...otóż pomyliłem pozycję x z pozycją u :p (powinnienem inaczej podstawić... a do sprawdzania uzyłem czegoś takiego :

Pozycja_x := WozekImage.Left div 25 ;
Pozycja_y := WozekImage.Top div 25 ;
if Mapa[pozycja_y , pozycja_x] < 2 then // w tablicy są różne cyferki i jeśli trafi się cyferka większa niż 1 ("zakazany kafelek"  :-8 ) to przestaje jechać wózek.

Dzięki za wszystkie odpowiedzi, pozdrówka. Heh, będe wdzięczny jak nie skomentujecie tego co napisałem [hurra]

0

z pozycja y nie u :-)

0

Ja tylko przypominam panu Loczkowi z Locksley, że w prawym górnym rogu każdego posta jest ikonka, przedstawiająca ołóweczek i karteczkę, a służąca do edycji swoich postów. Jakoś przynajmniej ja nie mam ochoty czytać postów w stylu :

post 1 :
Czekaj, zaraz to sprawdzę...
post 2 :
Sprawdzam....
post 3 :
Zaraz się skompiluje...
Post 4 :
Kompiluje się jeszcze...
Post 5 :
Cholera, nie skompilowało się
Post 6 :
Pomóżcie!!

0

owszem czasami to wkurzajace, ale jezeli ktos poprawi w taki sposob swoj post to temat nie jest zaznaczony znaczkiem oznaczającym dodanie nowego posta, tak więc czasami się przydaje.

0

Dzięki Berl [prosze] . Ołówek [wow] ? Jak to jest ołówek, to Ty jesteś świnką morską[zeby] . Racja, mogłbym nie pisać postów w stylu :

Zaraz sprawdzę.

Nie, jednak nie działa.

Nie będe juz tak pisał, o to się nie martw :-)

P.S. Nie bierz sobie tego o śwince morskiej do serca :-8

[*używaj edycji(user image) zamiast cytowania(user image) jak chcesz coś poprawić //LKS]

0

Chciałem tak jak ty to napisałeś CyberKid zrobić, ale nie wiem jak zrobić, żeby zmniejszyć rysowany obrazek :-/

Canvas.CopyRect

0

Eeee, pomyliłem się :-) Sorka Berl, zwracam honor, to ja jestem świnką morską :p

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