Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pomoc za pygame igru

[es] :: Python :: Pomoc za pygame igru

[ Pregleda: 3789 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

StefanJer91
Stefan Jeremic
Beograd

Član broj: 121923
Poruke: 160
*.kalik.info.



Profil

icon Pomoc za pygame igru18.07.2007. u 14:20 - pre 203 meseci
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.
The earth teaches us more about ourselves than all the books. Because it resists us. Man discovers himself when he measures himself against the obstacle.
 
Odgovor na temu

Radoyitza
Zagreb

Član broj: 57962
Poruke: 17
*.dsl.iskon.hr.



Profil

icon Re: Pomoc za pygame igru25.07.2007. u 13:57 - pre 203 meseci
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.
Tumbling down the rabbit hole...
 
Odgovor na temu

StefanJer91
Stefan Jeremic
Beograd

Član broj: 121923
Poruke: 160
*.kalik.info.



Profil

icon Re: Pomoc za pygame igru23.08.2007. u 21:19 - pre 202 meseci
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)???
The earth teaches us more about ourselves than all the books. Because it resists us. Man discovers himself when he measures himself against the obstacle.
 
Odgovor na temu

alex
Aleksandar Radulovic
Senior Software Engineer, Spotify
Stockholm, Sweden

Član broj: 71
Poruke: 2194
*.siminn.is.

Jabber: alex@a13x.info
ICQ: -1
Sajt: www.a13x.info


+1 Profil

icon Re: Pomoc za pygame igru24.08.2007. u 10:15 - pre 202 meseci
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.


Alex: My favorite site is http://localhost/
R.J. Oppenheimer: "I am become death, destroyer of worlds" (1945 AD)
tweet.13x ||
linkedin.13x
 
Odgovor na temu

StefanJer91
Stefan Jeremic
Beograd

Član broj: 121923
Poruke: 160
*.kalik.info.



Profil

icon Re: Pomoc za pygame igru24.08.2007. u 11:20 - pre 202 meseci
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
The earth teaches us more about ourselves than all the books. Because it resists us. Man discovers himself when he measures himself against the obstacle.
 
Odgovor na temu

mr.marvin

Član broj: 137276
Poruke: 111
*.crnagora.net.



Profil

icon Re: Pomoc za pygame igru25.08.2007. u 16:46 - pre 202 meseci
Zanimljiva igra :) Uz igru dolazi i kod... nema nista interesantno u vezi sa frame rate-om...?
 
Odgovor na temu

StefanJer91
Stefan Jeremic
Beograd

Član broj: 121923
Poruke: 160
*.mainstream.co.yu.



Profil

icon Re: Pomoc za pygame igru25.08.2007. u 19:17 - pre 202 meseci
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 :)
The earth teaches us more about ourselves than all the books. Because it resists us. Man discovers himself when he measures himself against the obstacle.
 
Odgovor na temu

mr.marvin

Član broj: 137276
Poruke: 111
*.crnagora.net.



Profil

icon Re: Pomoc za pygame igru25.08.2007. u 23:07 - pre 202 meseci
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.
 
Odgovor na temu

Radoyitza
Zagreb

Član broj: 57962
Poruke: 17
*.dsl.iskon.hr.



Profil

icon Re: Pomoc za pygame igru11.09.2007. u 19:20 - pre 202 meseci
@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]
Tumbling down the rabbit hole...
 
Odgovor na temu

StefanJer91
Stefan Jeremic
Beograd

Član broj: 121923
Poruke: 160
*.kalik.info.



Profil

icon Re: Pomoc za pygame igru03.01.2008. u 10:22 - pre 198 meseci
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




The earth teaches us more about ourselves than all the books. Because it resists us. Man discovers himself when he measures himself against the obstacle.
 
Odgovor na temu

[es] :: Python :: Pomoc za pygame igru

[ Pregleda: 3789 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.