[ StefanJer91 @ 18.07.2007. 14:20 ] @
Nadam se da nisam promasio forum (mislim da je bolje da postavimovde nego u gamedev-u) posto mi je potrebna pomoc oko pygame-a, tacnije platformske igre. Znaci pokusavam da napravim da igrac moze lepo da se krece preko platformi ali mi ne uspeva. Napravio sam skok, kretanje i delimicno kretanje po platformama. Potrebna mi je pomoc da ovo kretanje vise ne bude
deimicno. Evo koda:

Code:

import pygame, os
from pygame.locals import*


def loadimage(name, transparent=0):
    fullname = os.path.join('data', name)
    image = pygame.image.load(fullname)
    if transparent:
        image.set_colorkey(image.get_at((0,0)))
    return image.convert(), image.get_rect()


class Cat(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image, self.rect = loadimage('macka.png',1)
        screen = pygame.display.get_surface()
        area = screen.get_rect()
        self.rect.bottomleft = 0,0
        self.acceleration = 0 
        self.inair = 1    #inair = Cat in air? True or Flase
        self.speed = 9
        self.direction = 0
    def update(self):
        if self.inair:
            self.acceleration +=1
        self.rect.move_ip(self.direction*self.speed, self.acceleration)
        collision = self.rect.collidelistall(florsrect)
        if collision != []:
            #Cheking collision with platforms
            for fi in collision: #fi is flor index
                if florsrect[fi].top < self.rect.bottom:
                    self.rect.bottom = florsrect[fi].top
                    self.inair = 0
                    self.accelearation = 0
        else:
            self.inair = 1
    
            
    def jump(self):
        if not self.inair:
            self.acceleration =-15
            self.inair = 1

class Flor(pygame.sprite.Sprite):
    def __init__(self, pos):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((200,20))
        self.image.fill((0,0,0))
        
        self.rect = self.image.get_rect()
        self.rect.topleft = pos

def main():
    global florsrect
    pygame.init()
    screen = pygame.display.set_mode((640,480))
    #Objects
    clock = pygame.time.Clock()
    c = Cat()
    flors =[
        Flor((0,400)),
        Flor((100,330)),
        Flor((0,240))
            ]
    florsrect = []
    for x in flors:
        florsrect.append(x.rect)
    #Background
    background = pygame.Surface(screen.get_size()).convert()
    background.fill((100,125,0))
    screen.blit(background, (0,0))
    pygame.display.flip()
    #Sprites
    allsprites= [c]
    for x in flors:
        allsprites.append(x)
        
    #MAIN LOOP
    while 1:
        clock.tick(60)       
        #commands
        for event in pygame.event.get():
            if (event.type == KEYDOWN and event.key == K_ESCAPE):
                pygame.quit()
                return
        keystate = pygame.key.get_pressed()
        c.direction = keystate[K_RIGHT] - keystate[K_LEFT]
        if keystate[K_UP]:c.jump()

        #draw everything
        screen.blit(background, (0,0))
        for sprite in allsprites:
            sprite.update()
            screen.blit(sprite.image,sprite.rect)
        pygame.display.flip()
    
            
main()                  

P.S. napravite folder 'data' i u njega stavite neku slicicu za igraca. Dobro bi doslo da ako neko zna neki bolji (optimizovaniji) nacin za ovo sto sam do sada uradio iznese ovde na forum.
[ Radoyitza @ 25.07.2007. 13:57 ] @
moj savjet ti je da proucavas kod dobrih i dobro napravljenih igara...

ja sam učio Pygame (i jos uvijek ucim!) kroz "Solarwolf" od Pete Shinnersa (autor Pygame-a)
igra je prilicno kompleksna tako da mi je otvorila dosta novih vidika sto se tice samog designa koda, kako neke stvari napravit bolje, kako uopce napravit neke stvari, itd.
[ StefanJer91 @ 23.08.2007. 21:19 ] @
Ne znam koliko ljudi ovde poznaje pygame, ali se nadam da cu na moje pitanje dobiti odgovor. Da li neko zna kako da napravim da se spriteovi krecu istom brzinom na svim konfiguracijama ali da ne ogranicavam FPS, to jest da ne koristim clock.tick(framerate)???
[ alex @ 24.08.2007. 10:15 ] @
Koliko sam citao PyGame dokumentaciju, mislim da je to jedini nacin. Pregledao sam gomilu Pygame kôda po netu svojevremeno, i nisam naisao na neki drugi nacin - sem naravno implementacije uz Stackless Python.

[ StefanJer91 @ 24.08.2007. 11:20 ] @
Nije jedini nacin. Da jeste ne bih ni pitao. Video sam dosta igara koje imaju framerate u zavisnosti o jacine masine, ali nikako da izvalim kako se to radi. Pogledaj naprimer igru wichwayisup
[ mr.marvin @ 25.08.2007. 16:46 ] @
Zanimljiva igra :) Uz igru dolazi i kod... nema nista interesantno u vezi sa frame rate-om...?
[ StefanJer91 @ 25.08.2007. 19:17 ] @
Ma ja sam tu igru naveo samo za primer. 90% igara koje skidam sa pygame-ovog site-a nemaju ogranicen framerate. Samo je moja velika mana sto ja ne umem da citam tudje kodove, a nigde da pronadjem tut kako da napravim igru bez ogranicenja framerate-a. Inace, igra jeste zanimljiva zato sam je i pomenuo :)
[ mr.marvin @ 25.08.2007. 23:07 ] @
Ok, sad sljede pocetnicka pitanja, posto nisam dosad pravio igrice mada jesam bacio pogled na pygame :D

Zasto bi uopste ogranicavao framerate? Da igra ide istom brzimom na svim racunarima? Ali, zar nisu dvije razlicite stvari "iscrtavanje" u bufferu i na ekranu (ili sam ja to pobrkao sa DirectX)? To onda znaci da framerate nema veze sa brzinom igre, tj. da je jedna stvar proracun gdje ce se objekat na ekranu pojaviti, a sasvim druga stvar iscrtavanje tog objekta, odnsno frejma?

Dalje, da li je framerate potpuno iscrtavanje ekrana, ili se racuna i osvjezavanje samo jednog dijela?

Nije mi jasno...

Moze dio koda, ako si voljan.
[ Radoyitza @ 11.09.2007. 19:20 ] @
@Stefan
Citat:
Nije jedini nacin.
mislim da je u suštini to ipak jedini način...
a funkcionira tako da se za svaku iteraciju while petlje (u main loop-u) poziva odgovarajuća delay() funkcija koja u zavisnosti od danog framerate-a odgađa izvršavanje slijedeće iteracije (tj. nakratko stopira program)

BTW:
"Which Way is Up?"
game.py, line 379
locals.py, line 25


@mr.marvin
Citat:
Zasto bi uopste ogranicavao framerate? Da igra ide istom brzimom na svim racunarima? Ali, zar nisu dvije razlicite stvari "iscrtavanje" u bufferu i na ekranu (ili sam ja to pobrkao sa DirectX)? To onda znaci da framerate nema veze sa brzinom igre, tj. da je jedna stvar proracun gdje ce se objekat na ekranu pojaviti, a sasvim druga stvar iscrtavanje tog objekta, odnsno frejma?
framerate je brzina igre... (frames per second)

i zašto bi uopće odvajao izračun stanja objekta od njegovog iscrtavanja na ekranu (vremenski)?
za svaki prolaz kroz main loop (tj. za svaki frame) se dešava oboje
a brzina izmjene frame-ova je, ko što sam već rekao, regulirana u toj petlji preko vrijednosti koja govori koliko će petlja imati iteracija u sekundi (a ta vrijednost je sam framerate )

Citat:
Dalje, da li je framerate potpuno iscrtavanje ekrana, ili se racuna i osvjezavanje samo jednog dijela?
ovo uopće nema veze s brzinom igre tj.framerate-om...

[Ovu poruku je menjao Radoyitza dana 12.09.2007. u 00:21 GMT+1]
[ StefanJer91 @ 03.01.2008. 10:22 ] @
Jeste da je zakasnjenje veliko, i da sam problem resio dosta ranije, i da sam sad podigao temu iz mrtvih, ali resenje problema je bilo veoma jednostavno tako da ako nekom zatreba moze da pogleda :)

Code:

last_time  = 0 
while 1:
    dt = pygame.time.get_ticks()-last_time
    last_time=pygame.time.get_ticks()


Gore navedeni primer vazi za svaku igru, tj. simulaciju necega, stim sto ce verovatno biti potrebe da se dt (delay time) mnozi sa odredjenom variblom ( u pygame-u je to 0.1) i to programer moze da odredi odokativno. Dalje je potrebno da svaki objekat koji menja poziciju ili se rotira takodje primeni ovaj dt. Dakle ako imamo objekat s i on ima svoju poziciju i brzinu to bi izgledalo ovako nekako:

Code:


s.x+=s.velocity[0]*dt
s.y+=s.velocity[1]*dt