![dev.gamez.lv Forum Index](templates/subSilver/images/logo_phpBB.gif) |
dev.gamez.lv Latvian Game Developers Community
|
View previous topic :: View next topic |
Author |
Message |
Vecis
Joined: 01 Jan 2007 Posts: 144
|
Posted: Sun Jan 25, 2009 3:58 pm Post subject: Jautājumi par isometric tiles. |
|
Nu tā, uz PyS60 (Python for S60) sāku veidot nelielu spēli ar isometric tiles,
bet ir dažas problēmas/nepilnības:
1. Kā zīmēt visu mapi (ti daudz tiles) neizmantojot lielu daudzumu koda?
Pagaidām zinu tikai ka varu katru tailu zīmēt atsevišķi
(canvas.blit(tile1,(x,y)); canvas.blit(tile2,(x,y))...)
Bet tur sanāktu ļoti daudz koda, bija doma nolasīt koordinātas un visu pārējo katram tailam no teksta faila un tad kkā tā:
canvas.blit(visi_taili, (visi_x,visi_y))
Tā tas būtu īsi un atvieglotu visu, kā arī kodu būtu pārskatāmāks.
Māku nolasīt no teksta faila, bet joprojām nezinu kas jādara lai kodu padarītu tik īsu (nu lai nav katram tailam jāraksa canvas.blit() pa jaunu).
2. Ja aiz sienas aiziet kāds objekts , tam vajadzētu parādīties aiz sienas, nevis pirms tās, te jau atkal sanāk diezgan daudz lieka koda, lai salīdzinātu sienas un spēlētāja koordinātas (atkal - katram sienas tailam jāraksta kods lai salīdzinātu to atrašanās vietu)
Ir kāds veids kā to izdarīt ātrāk?
3. Šis gan nav par tailiem.
Kāds nezin kā lai ar PyS60 parāda attēla animāciju?
Teiksim ja ir bilde (200x10) un katrs animācijas kadrs ir 10x10 no bildes.
canvas.blit(attēls, (0,0), target=(x,y))
^(0,0) ir augšējais kreisais stūris, no kura sāk zīmēt bildi, bet neesmu manījis tādu parametru size vai ko tādu lai noteiktu labo apakšējo stūri, citādi nekāda sakarīga animācija nesanāk.
Edit: nr. 3. atrisināju pats, vienkārši pie source (tas kur ir (0,0)), var likt klāt vēl arī w, h - (0,0,w,h) |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
bubu Indago Uzvarētājs
![Indago Uzvarētājs Indago Uzvarētājs](https://forums.gamedev.lv/images/ranks/cup1.gif)
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sun Jan 25, 2009 4:47 pm Post subject: |
|
1. em.. cikli?
Vispirms saliec visus tailus divu dimensiju masīvā (pitonā lists no listiem), un tad:
Code: | for x in xrange(w):
for y in xrange(h):
canvas.blit(tiles[offetX+x][offsetY+y], (x,y)) |
2. Tie paši cikli ar "z buferi" - katram tailam piešķir z koordināti, un zimējot vispirms izskrien visiem zīmējamiem tailiem cauri, atrodot katrai koordinātei to, kuram ir max z koordināte, un pēc tam otrajā ciklā uzzīmē tos:
Code: | zBuffer = [[None]*w for t in xrange(h)]
for tile in zīmējamie_taili:
if zBuffer[tile.x][tile.y] is None or tile.z > zBuffer[tile.x][tile.y].z:
zBuffer[tile.x][tile.y] = tile
for x in xrange(w):
for y in xrange(h):
if zBuffer[x][y] is not None:
canvas.blit(zBuffer[x][y], (x,y)) |
Ja tev tomēr ir jāzīmē arī aizmugurē esošie taili (priekšā esoši ir caurspīdīgi), tad tā vietā, lai atcerētos tikai vienu tailu tajā zBuferī, atceries vairākus (liec tos listā). Un tad pie zīmēšanas, pirms zīmēt konkrētās koordinātes tailus uz ekrāna, sakārto to listu pēc z koordinātes (sort funkcija), un tikai tad blito lista elementus uz ekrāna.
3. Nezinu. Var mēģināt to lielo bildi sagriezt mazākās pie ielādes, ja nu nekas cits tur nav iespējams. |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Vecis
Joined: 01 Jan 2007 Posts: 144
|
Posted: Sun Jan 25, 2009 7:02 pm Post subject: |
|
Paldies!
Bet romēr gadījās prblēma ar faila nolasīšanu, kods:
Code: |
mapfile = file(u"E:\\map1.txt", "r+")
mapfile.seek(0)
for line in mapfile:
print line
#print line nolasa katru rindiņu Python script shell'ā
tilename, x, y = line.split(",")
#line split sadala teksta failu rindiņas 3 daļās
print x
print y
#print x un print y Python shell'ā uzrāda tikai pēdējās rindiņas x un y
|
Teksta fails izskatās šādi:
Code: |
tile1,50,50
tile2,52,52
tile3,100,4
|
|
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
bubu Indago Uzvarētājs
![Indago Uzvarētājs Indago Uzvarētājs](https://forums.gamedev.lv/images/ranks/cup1.gif)
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Sun Jan 25, 2009 7:41 pm Post subject: |
|
Nu protams, ka uzrāda tikai pēdējās rindas saturu. Jo line mainīgais pēc for cikla beigām saturēs pēdējās faila rindas saturu. Pitonā ir svarīgas atkāpes no rindas sākuma. Tās norāda, kur sākas un beidzas konkrētais bloks (for/if/while/def/...)
Code: | for line in file(ur"E:\map1.txt"):
print line
tilename, x, y = line.split(",")
print x
print y
print "Hello" # šis vairs neūs iekš for cikla, jo nav atkāpes |
|
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Vecis
Joined: 01 Jan 2007 Posts: 144
|
Posted: Mon Jan 26, 2009 6:00 pm Post subject: |
|
Tailu koordinaatas ielaadeeju bez probleemaam, bet nesanaak noraadiit uz atteela nosaukumu.
Code: |
#atteela objekts
tileImage=graphics.Image.open("E:\\tile.png")
#saraksts ar tailu nosaukumiem kuru atteela objektus ielaadeet
tileList=[u"tileImage", ...]
#sheit rodas probleema...
#ja kaa atteela objektu izmantoju tileList[0], tad Python shell saka "error, image object expected"
#bet ja tur liek tileImage (bildes objektu pa taisno), tad viss darbojaas.
#Laikam vaina ir pie taa, ka tur kur ir tileList[0]
#arii ir jaanoraada "image object" pa tiesho, t.i. tileImage
#citaadi Python to pashu tileLista elementu [0] saprot kaa atteela objektu
#Ko lai dara lai kods straadaatu?
canvas.blit(tileList[0], target=(x,y))
|
|
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
bubu Indago Uzvarētājs
![Indago Uzvarētājs Indago Uzvarētājs](https://forums.gamedev.lv/images/ranks/cup1.gif)
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Mon Jan 26, 2009 6:02 pm Post subject: |
|
Raksti lūdzams tekstu ārpus [ code ] bbtaga. Vienplatuma fonts nelabi lasās ;)
tileList tev ir lists no stringiem.
tileImage - kautkāds Image objekts.
Visai loģiski, ka nevar lietot stringu vietā, kur vajadzīgs Image. Ielādē tās bildes pēc nosaukumiem no tileList saraksta ar tādu pašu veidu kā tu ielādēji to tileImage - graphics.Image.open un tad visam vajadzētu būt ok. |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Vecis
Joined: 01 Jan 2007 Posts: 144
|
Posted: Mon Jan 26, 2009 6:10 pm Post subject: |
|
Kas taads jau bija ienaacis praataa, bet vai tad buutu pareizi ja teiksim ir 10 vienaadas tiles un katru ielaadeet pa jaunu? Vismaz man liekas tas taa darbojas. Bet nu, pameegjinaashu.
Edit: nedarbojas, taads pats error. |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
bubu Indago Uzvarētājs
![Indago Uzvarētājs Indago Uzvarētājs](https://forums.gamedev.lv/images/ranks/cup1.gif)
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Mon Jan 26, 2009 7:50 pm Post subject: |
|
Nē, lādē tikai vienu reizi.
Tam eksistē tāda lieta kā dictionary. Tur tu varētu asociēt stringu ar taila bildi. un tad attiecīgi lookapout pēc stringa (taila nosaukuma) vajadzīgo bildi (Image objektu). |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Vecis
Joined: 01 Jan 2007 Posts: 144
|
Posted: Tue Jan 27, 2009 9:27 pm Post subject: |
|
Viss straadaa labi, bet klaat naak jauna probleema.
Code: |
tilenames=[tailu nosaukumi...]
listx=[visas x koordinaatas]
listy=[visas y koordinaatas]
tilesN = 12
tile_num = 0
dictTiles = {"grasst": grasst, "sandt": sandt, "tile2": tile2}
while running:
img.blit(dictTiles[tilenames[tile_num]], target=(listx[tile_num], listy[tile_num]), mask = tilem)
if tilesN > 0:
tile_num = tile_num + 1
tilesN = tilesN - 1
img.blit(player, target=(playerx, playery), mask = tilem)
handle_redraw(())
e32.ao_yield()
if keyboard.is_down(EScancodeLeftArrow):
playerx = playerx - 1
#paareejaa kustiiba...
|
Koda peedeejaa dalja kustina objektu player, probleema ir taada ka shis player pie kustiibas 'dubleejas'.
Zinu ka tas ir taadeelj ka cikla while running saakumaa nenotiiru visu no ieprieksheeja cikla - ar img.clear().
Bet ja es ievietoju img.clear() tad netiek ziimeeti visi taili, jo katru reizi kad programma skrien cauri shim ciklam, taa pieskaita 1 pie tile_num (katru reizi ziimee naakamo tailu). Kaa lai to labo? Biju meegjinaajis taadu kodu - izmanto img.clear() katru reizi tikai peec tam kad programma jau izskreejusi caur visiem tailiem. Rezultaats - taili un player objekts 'mirgo' (flickering). |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
elvman Indago Uzvarētājs
![Indago Uzvarētājs Indago Uzvarētājs](https://forums.gamedev.lv/images/ranks/cup1.gif)
Joined: 09 Apr 2003 Posts: 1278 Location: Kuldiga
|
Posted: Tue Jan 27, 2009 10:04 pm Post subject: |
|
Vienaa while ciklaa ziimee visus tailus, nevis tikai vienu. Un lai izbeegtu no flickering, droshi vien buus jaalieto kaut kaads double-buffering (iisti nezinu, kaa tas ir pitonam). _________________ long time; /* know C */ |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Vecis
Joined: 01 Jan 2007 Posts: 144
|
Posted: Wed Jan 28, 2009 6:27 pm Post subject: |
|
Double buffering jau ir kādu laiku atpakaļ.
Problēma jau ir tāda ka nesanāk zīmēt visus tailus ciklā uzreiz:
Code: |
listx=[...]
listy=[...]
for x in listx:
print x
for y in listx:
print y
while running:
#...
img.blit(tilename, target=(x, y))
#...
|
Tas uzzīmē tikai pirmo tailu, tālāk ne. |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
bubu Indago Uzvarētājs
![Indago Uzvarētājs Indago Uzvarētājs](https://forums.gamedev.lv/images/ranks/cup1.gif)
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Wed Jan 28, 2009 6:42 pm Post subject: |
|
Vai tu python'am saproti atšķirību starp:
Code: | for a in A:
print a
for b in B:
print b
doSomething() |
un
Code: | for a in A:
print a
for b in B:
print b
doSomething() |
? |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
Vecis
Joined: 01 Jan 2007 Posts: 144
|
Posted: Wed Jan 28, 2009 6:46 pm Post subject: |
|
Jā.
Nu jau dabūju gatavu ar to kodu kas sākumā. |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
EDDY
Joined: 07 Oct 2005 Posts: 1610 Location: Dzimtā zeme, Latvija
|
Posted: Thu Jan 29, 2009 9:36 am Post subject: |
|
bubu wrote: | Vai tu python'am saproti atšķirību starp:
Code: | for a in A:
print a
for b in B:
print b
doSomething() |
un
Code: | for a in A:
print a
for b in B:
print b
doSomething() |
? |
Call me stupid & paint me red, bet vienīgā atšķirība ir izkārtojumā pēc kreisās malas. Vai tiešām python-am tas ir svarīgi? _________________ Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
bubu Indago Uzvarētājs
![Indago Uzvarētājs Indago Uzvarētājs](https://forums.gamedev.lv/images/ranks/cup1.gif)
Joined: 23 Mar 2004 Posts: 3223 Location: Riga
|
Posted: Thu Jan 29, 2009 10:51 am Post subject: |
|
Jā, Python'am rindu identācija nosaka, kur sākas un beidzas konkrētais bloks (if/for/while).
C++'ā iepriekšējie kodi (izņemot a in A sintaksi) izskatītos kā:
Code: | for (a in A)
{
std::cout << a << std::endl;
}
for (b in B)
{
std::cout << b << std::endl;
}
doSomething();
| vs Code: |
for (a in A)
{
std::cout << a << std::endl;
for (b in B)
{
std::cout << b << std::endl;
doSomething();
}
} |
Var redzēt, cik daudz lieka C/C++ prasa rakstīt atšķirībā no pitona minimālisma. |
|
Back to top |
|
![](templates/subSilver/images/spacer.gif) |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|