dev.gamez.lv Forum Index dev.gamez.lv
Latvian Game Developers Community
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups 

Jautājumi par isometric tiles.
Goto page 1, 2  Next
 
dev.gamez.lv Forum Index -> Iesācējiem
View previous topic :: View next topic  
Author Message
Vecis



Joined: 01 Jan 2007
Posts: 144

PostPosted: 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
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: 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
View user's profile Send e-mail
Vecis



Joined: 01 Jan 2007
Posts: 144

PostPosted: 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
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: 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
View user's profile Send e-mail
Vecis



Joined: 01 Jan 2007
Posts: 144

PostPosted: 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
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: 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
View user's profile Send e-mail
Vecis



Joined: 01 Jan 2007
Posts: 144

PostPosted: 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
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: 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
View user's profile Send e-mail
Vecis



Joined: 01 Jan 2007
Posts: 144

PostPosted: 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
View user's profile Send e-mail
elvman
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 09 Apr 2003
Posts: 1278
Location: Kuldiga

PostPosted: 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
View user's profile Visit poster's website
Vecis



Joined: 01 Jan 2007
Posts: 144

PostPosted: 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
View user's profile Send e-mail
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: 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
View user's profile Send e-mail
Vecis



Joined: 01 Jan 2007
Posts: 144

PostPosted: Wed Jan 28, 2009 6:46 pm    Post subject:

Jā.
Nu jau dabūju gatavu ar to kodu kas sākumā.
Back to top
View user's profile Send e-mail
EDDY



Joined: 07 Oct 2005
Posts: 1610
Location: Dzimtā zeme, Latvija

PostPosted: 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
View user's profile
bubu
Indago Uzvarētājs
Indago Uzvarētājs


Joined: 23 Mar 2004
Posts: 3223
Location: Riga

PostPosted: 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
View user's profile Send e-mail
Display posts from previous:   
dev.gamez.lv Forum Index -> Iesācējiem All times are GMT + 2 Hours
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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