Mechanizmus pohybu potvor – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Mechanizmus pohybu potvor – Python – Fórum – Programujte.comMechanizmus pohybu potvor – Python – Fórum – Programujte.com

 

Jakub Vojáček
~ Moderátor
0
Grafoman
7. 8. 2006   #1
-
0
-

právě dělým na hře, kde budete hrát za postavu a zabíjet potvory. Mechanizmus pohybu postavy mám hotový, ale pohyb potvory mi nejde:((
tady to je úryvek kodu:



from Tkinter import *

zakazane_objekty=[]
souradnice_x=150
souradnice_y=150
x=200
y=400

okno = Tk()
scrollbarx=Scrollbar(okno,orient=HORIZONTAL)
scrollbarx.pack(fill=X,side=BOTTOM)
scrollbary=Scrollbar(okno,orient=VERTICAL)
scrollbary.pack(fill=Y,side=RIGHT)
platno=Canvas(xscrollcommand=scrollbarx.set,width=600,height=600
,yscrollcommand=scrollbary.set
,scrollregion=(-1000000, -1000000, 1000000, 1000000),bg='black')
platno.pack()
scrollbarx.config(command=platno.xview)
scrollbary.config(command=platno.yview)
posun_x=platno.xview()[0]
posun_y=platno.yview()[0]
postava=platno.create_rectangle(souradnice_x,souradnice_y,souradnice_x+10,souradnice_y+10,fill='red')

def vykresleni(x,y,x1,y1,fill=None):
obrazek=platno.create_rectangle(x,y,x1,y1,fill=fill,outline="green")
zakazane_objekty.append(obrazek)
def priblizuj():
global x,y
x,y,k,l=platno.coords(prisera)
if x > souradnice_x-10 :
platno.move(prisera,-30,0)
if y > souradnice_y-10 :
platno.move(prisera,0,-30)
if x < souradnice_x:
platno.move(prisera,30,0)
if y < souradnice_y-10:
platno.move(prisera,0,30)
def kontrola():
x,y,x1,y1=platno.coords(postava)
ctverec=platno.find_overlapping(x-300,y-300,x+300,y+300)
for prvek in ctverec:
if prvek == prisera:
priblizuj()
opakuj()
def opakuj():
okno.after(500,kontrola)
opakuj()
def pohyb(event):
global souradnice_x,souradnice_y,posun_x,posun_y,postava
if event.keysym == 'Left':souradnice_x=souradnice_x-30;posun_x=posun_x-0.000015;platno.xview(MOVETO,posun_x)
elif event.keysym == 'Right':souradnice_x=souradnice_x+30;posun_x=posun_x+0.000015;platno.xview(MOVETO,posun_x)
elif event.keysym == 'Up':souradnice_y=souradnice_y-30;posun_y=posun_y-0.000015;platno.yview(MOVETO,posun_y)
elif event.keysym == 'Down':souradnice_y=souradnice_y+30;posun_y=posun_y+0.000015;platno.yview(MOVETO,posun_y)
print souradnice_x,souradnice_y
platno.coords(postava,souradnice_x,souradnice_y,souradnice_x+10,souradnice_y+10)

#mapa -
vykresleni(58.0-20,361.0-20,58.0+20,361.0+20,fill="green")
vykresleni(95.0-20,360.0-20,95.0+20,360.0+20,fill="green")
vykresleni(138.0-20,361.0-20,138.0+20,361.0+20,fill="green")
vykresleni(173.0-20,361.0-20,173.0+20,361.0+20,fill="green")
vykresleni(116.0-20,359.0-20,116.0+20,359.0+20,fill="green")
vykresleni(201.0-20,357.0-20,201.0+20,357.0+20,fill="green")
vykresleni(231.0-20,356.0-20,231.0+20,356.0+20,fill="green")
vykresleni(272.0-20,356.0-20,272.0+20,356.0+20,fill="green")
vykresleni(257.0-20,356.0-20,257.0+20,356.0+20,fill="green")
vykresleni(282.0-20,382.0-20,282.0+20,382.0+20,fill="green")
vykresleni(291.0-20,405.0-20,291.0+20,405.0+20,fill="green")
vykresleni(290.0-20,441.0-20,290.0+20,441.0+20,fill="green")
vykresleni(290.0-20,472.0-20,290.0+20,472.0+20,fill="green")
vykresleni(287.0-20,503.0-20,287.0+20,503.0+20,fill="green")
vykresleni(49.0-20,382.0-20,49.0+20,382.0+20,fill="green")
vykresleni(48.0-20,421.0-20,48.0+20,421.0+20,fill="green")
vykresleni(49.0-20,460.0-20,49.0+20,460.0+20,fill="green")
vykresleni(48.0-20,493.0-20,48.0+20,493.0+20,fill="green")
vykresleni(45.0-20,520.0-20,45.0+20,520.0+20,fill="green")

okno.bind('<Left>',pohyb)
okno.bind('<Right>',pohyb)
okno.bind('<Up>',pohyb)
okno.bind('<Down>',pohyb)

#prisera
prisera=platno.create_rectangle(x,y,x+10,y+10,fill='blue')

mainloop()


Je to jenom ilustrační příklad, normální kód načítá mapu z textového souboru, ale tady to bylo skoro zbytečné tak jsem to dal do samotného kódu.

Cerveny ctverec je vaše postava
Modrý čtverec je potvora
Zelené čtverce jsou zdi

Jakmile se potvora dostane na obrazovku začne se k vám přibližovat, ale projde i zdí, což by sanozřejmě neměla. Mě nenapadl žádný způsob jak napsat ten mechanizmus chození. Prostě ta potvora se musí k vám dostat ale nemůže projít zdí a mělo by to fungovat i kdyby se změnil tvar zdi...

Děkuju za všechny nápady

PS:Všechny věci kterými neprojde potvora jsou v seznamu zakazane_objekty

Nahlásit jako SPAM
IP: ...–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
geon0
Grafoman
Nahlásit jako SPAM
IP: ...–
geon. volume doprava.
Jakub Vojáček
~ Moderátor
0
Grafoman
7. 8. 2006   #3
-
0
-

Ne, tu ovelapping dokonce používám v kódu. Myslím to, že potvora se vždy ve funkci přibližuj pohybuje tak aby se co nejvíc přiblížila postavě, ale v tom by ji měla zabránit zeď. Tudíž by to mělo v tom



if x < souradnice_x:
platno.move(prisera,30,0)

kontrolovat jestli na tom místě není nějaký obrázek, který by byl v seznamu zakazane_objekty a kdyby byl tak by potvora přišla na jinou cestu, ketra by ji přiblížila k postave, ale zároveň aby neprošla zdí

Nahlásit jako SPAM
IP: ...–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
geon0
Grafoman
7. 8. 2006   #4
-
0
-

No jasně, potvora se tam přesune a pak, následně se zjistí, v cyklu procházeje všechny zakázané objekty, jestli náhodnou není overlapping s nimi. A pokud ano, tak šup zpět na původní místo. Možná to jde i jinak, efektivněji, ale mně toto fungovalo a vcelku i svižně.

Nahlásit jako SPAM
IP: ...–
geon. volume doprava.
Jakub Vojáček
~ Moderátor
0
Grafoman
7. 8. 2006   #5
-
0
-

nj, to by fungovalo, ale co by se stalo potom co by zjistila, ?e na tom m?st? kam se pohnula se nach?z? n?co ze zak?zan?ch objekt? a vr?tila, co pak? Ta potvora se mus? pohnout n?jak?m sm?rem. Nap?, kdyby postava byla na 200,200 a potvora 200,500 a mezi nima zed ve tvaru obd?ln?ku 150,300,300,400 tak by se potvora pohnula krat?? cestou...

Nahlásit jako SPAM
IP: ...–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
geon0
Grafoman
8. 8. 2006   #6
-
0
-

jo tak to je jin?, to je t??. Nic mne nenapad?. Snad jen nechat na n?hod?, aby se rozhodl, jestli vlevo nebo vpravo. No jo, ale to m??e b?t je?t? i nahoru nebo dolu ...

Nahlásit jako SPAM
IP: ...–
geon. volume doprava.
Jakub Vojáček
~ Moderátor
0
Grafoman
8. 8. 2006   #7
-
0
-

mě napadlo jenom, že bych před každým pohybem potvory získal jakoby mapu obrazovky be tvaru:



zzpzz
zzvzz
cvvzz

z=ze?
p=potvora
c=clovek
v=volno

a potom bych nejak ziskal nejkratsi spojnici po volnu(v) a tou cestou se pak potvora vydala
bohužel jenom to získání mapky trvá asi 3 vteřiny, takže to je nepoužitelný způsob:((

Nahlásit jako SPAM
IP: ...–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
Petr H.0
Newbie
8. 8. 2006   #8
-
0
-

Podobny program jsem kdysi delal, ale ne v Pythonu. Resil jsem to tak, ze jsem si obrazovku rozdelil na useky (moc jsem tvuj program necetl, trvalo by mi to dlouho, ale myslim ze to mas rozdeleno na useky 30x30 pixelu, no proste nejmensi velikost zdi), a potom jsem definoval pole P [rozliseni_x/sirka_useku, rozliseni_y/vyska_useku]. Kdyz se pak mela postava/potvora pohnout, tak se overilo jestli P[cilova_souradnice_x, cilova_souradnice_y]==1 (jako zed) nebo ==0 (jako volno). Dalsi vyhoda je, ze se daji vytvorit "dvere na klic" P[neco, neco]==2 atd. Bohuzel v Pythonu zacinam, takze dost dobre nevim jak tu funguje pole, jestli ma vubec Python pole, pripadne jak to pole nahradit jestli nema.

Edit : Jeste jsem zapomnel - pokud chces aby ti ta potvora nasla cestu z jednoho mista na druhe kolem zdi a dalsich prekazek, tak budes muset naprogramovat nejaky pathfinding, a to je dost tezke, protoze se musi najit kompromis mezi presnosti a vypocetnim casem. Lze vytvorit pathfinding ktery najde absolutne nejkratsi trasu, ale bude mu to trvat dlouho.

Nahlásit jako SPAM
IP: ...–
Jakub Vojáček
~ Moderátor
0
Grafoman
8. 8. 2006   #9
-
0
-

to rozd?len? na useky je dobrej n?pad bohu?el to je ?asov? moc n?ro?n?. Hrac? plocha m? rozm?ry:600x500 a t?m p?dem bych m?l okolo 350 ctvercu 30x30 kterz bych musel zkontrolovat jestli tam nen? n?kter? objekt ze zakazanych_objektu a to trva...ale jeste se nad tim zamyslim.
ka?dop?dn? d?k za snahu.

Nahlásit jako SPAM
IP: ...–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
Petr H.0
Newbie
8. 8. 2006   #10
-
0
-

Ted nevim jak to myslis, kontrolovat se muze jen ten cilovy ctverec pohybu, ne vsech 350.

A kdyz uz jsem u toho, tak bych se rad zeptal nekoho, kdo dobre rozumi Pythonu (nejlepe Geon), jak se to resi s temi poli, ja jenom vim o tech seznamech
X[a, b, c] ale pole to neni. Ja osobne pole pouzivam dost casto, takze bych to potreboval vedet.

Nahlásit jako SPAM
IP: ...–
Jakub Vojáček
~ Moderátor
0
Grafoman
8. 8. 2006   #11
-
0
-
Nahlásit jako SPAM
IP: ...–
Navštivte server Matematika pro každého
Najdete zde články zabývající se matematikou základních a středních škol a databázi hlavolamů.
Pro vyzkoušení Vaš
geon0
Grafoman
8. 8. 2006   #12
-
0
-

Aldaris napsal:
A kdyz uz jsem u toho, tak bych se rad zeptal nekoho, kdo dobre rozumi Pythonu (nejlepe Geon), jak se to resi s temi poli, ja jenom vim o tech seznamech
X[a, b, c] ale pole to neni. Ja osobne pole pouzivam dost casto, takze bych to potreboval vedet.


seznam je pole. Python zvolil jen jin?, snad p?il?hav?j?? n?zev pro absolutn? lamy, jinak je to stejn?, dokonce lep??. Indexace za??n? na 0 a pokra?uje d?le. Ur?it? tady v kurzu (3. lekce?) najde? v?ce ;-)

Nahlásit jako SPAM
IP: ...–
geon. volume doprava.
Petr H.0
Newbie
8. 8. 2006   #13
-
0
-

Ja jsem ty lekce cetl, ovsem stale nevim jak vytvorit dvojrozmerne pole, matici (angl. matrix :) ). Vysvetlim ten problem spis na prikladu :
Mam matici s X sloupky a Y radky, v jinem prog. jazyce by to bylo pole P[1 az X, 0 az Y]
Napr. X=5, Y=2 :
0 0 0 0 0
0 0 0 0 0
A ted potrebuji napr. k cislu na 2. radku, 3. sloupci pricist cislo 1
Opet v jinem prog. jazyce : P[3, 2] = P[3, 2] + 1
Vysledek :
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
Doufam ze se mi podarilo vysvetlit o co mi jde ... jestli tu uz podobny dotaz byl, nebo je to vysvetleno v lekcich a ja to prehledl tak se omlouvam.

Nahlásit jako SPAM
IP: ...–
geon0
Grafoman
8. 8. 2006   #14
-
0
-

jj. V?e je stejn?, a? na adresaci. v pythonu to je p[3][2] (pozor ?e prvn? prvek je nult?!):

    

def tiskPole(pole):
print pole
# for radek in pole:
# print radek
print

def vytvorPole(radku, sloupcu):
return [[0]*sloupcu for i in range(radku) ]

pole=vytvorPole(3,5)
tiskPole(pole)
pole[2][1]=1
tiskPole(pole)


Nahlásit jako SPAM
IP: ...–
geon. volume doprava.
Sharptan0
Newbie
8. 8. 2006   #15
-
0
-

Pojednání o hledání je zde:
http://pathlib.hildebrand.cz/doc/Referat/pathref.html#_Toc493068725

Starší dílo nějakého vb-čkáře na pcsvětě, není příliš efektivní, ale na druhou stranu je to česky popsané a je v tom i nějaký základ úvahy jak řešit :):
http://www.pcsvet.cz/art/article.php?id=3726&search=z%E1klad+um%ECl%E9+inteligence

No a po prostudování 1. odkazu zjistíš, že hledáš "A*" --> google

Nesnadnější cestou zřejmě pro tebe bude sehnat si knihovnu, kde je A* implementován, algoritmus není zrovna nejsnadnější...jak je na tom python s knihovnami netuším, python nepoužívám, pokud chceš dělat hry vyplatí se sáhnout po kompilovaném jazyce (c,c++,c#,(VB 5,6)-je to takovej hybrid, ale od verze 5.0 je lepší kompilace,ikdyž na hry je stále lepší volba C(++),... ). Interpretované jazyky jsou vždy pomalejší (python,java,...), výhodou je snadnější práce s dynamickou pamětí.
No snad ti to pomůže, nejlepší bude sehnat si knihovnu napsanou v C, pokud ti to python dovolí, iterpretovat.

Nahlásit jako SPAM
IP: ...–
Petr H.0
Newbie
8. 8. 2006   #16
-
0
-

geon napsal:
jj. Vše je stejný, až na adresaci. v pythonu to je p[3][2] (pozor že první prvek je nultý!):
...


Diky, uz jsem si to vyzkousel a chapu to, jde jen o zvyk, hlavne me pletlo ze se to pise p[y][x] misto p[x,y]. Jo a sry za mensi OT v tomto tematu :) No, snad to pomuze i ostatnim ...

Nahlásit jako SPAM
IP: ...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

Podobná vlákna

Plošné rozmístění potvor — založil Matěj Andrle

[C#] WebCamera zachytenie pohybu — založil p-r-e-d-a-t-o-r

Simulace pohybu molekul — založil LuciusT

Změna pohybu myši — založil Majlow

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý