Vinnaren i pepparkakshustävlingen!
2010-04-05, 23:23
  #1
Medlem
Qzans avatar
Collision detection med pygame, HUR får jag det att fungera fattar inget :S
testar det lite lätt med 2 st Blit images som krockar och så sätter jag att när den ena är = den andra så ska det "print Krock"

vet ni hur man gör det på ett lite elegant sätt att funka?
Citera
2010-04-05, 23:37
  #2
Medlem
Wobins avatar
Som svaret på alla frågor: Det beror på.

Ett enkelt sätt är att rita ut reklanglar för objektens "boundingboxes", det är när dessa rektanglar skär varandra det är en kollision.

Så, lite psuedokod (eftersom jag inte kan python ordentligt):
Kod:
if Player.BoundingBox.colliderect(Enemy.Boundingbox):
    
Player.Alive false
    
print 'Du koliderade, otur som vanligt' 

Tänk på att du måste utföra denna check varje update samt uppdatera rektanglarnas position varje update.

Här hittar du lite dokumentation om rektanglar i pygame: http://www.pygame.org/docs/ref/rect.html
Citera
2010-04-06, 12:17
  #3
Medlem
Qzans avatar
Jag försökte ta itu med ett program jag gjorde för åratal sen känns det som men iaf.


Kod:
bgimg="bak.jpg"
gubbe="gubb.png"



import pygame as py, sys, random
from pygame.locals import *

py.init()


#skapar skärmen
screen=py.display.set_mode((640,360),0,32)     



#laddar inte bilderna, backgrunden och spelaren
background=py.image.load(bgimg).convert()
player=py.image.load(gubbe).convert_alpha()
player2=py.image.load(gubbe).convert_alpha()



#roterar spelaren så han kan springa
run_left=py.transform.rotate(player,90)
run_right=py.transform.rotate(player,270)
run_up=py.transform.rotate(player,0)
run_down=py.transform.rotate(player,180)

#sätter start position
x,y = 150,150
dx,dy = 0,0


#cirkel

col=(230,170,0)
pos=(400,200)
rad=(60)
rita = 0

#skapar en while slinga för hela spelet
while True:  
    for event in py.event.get():  
        if event.type == QUIT:      #för att kunna stänga av programmet
            py.quit()
            sys.exit()

#Se till så att gubben kan röra på sig när man trycker på knapparna
        if event.type == KEYDOWN:            
            if event.key==K_LEFT:
                dx=-1
                player=run_left   
            elif event.key==K_RIGHT:
                dx=+1
                player=run_right                
            elif event.key==K_UP:
                dy=-1
                player=run_up
            elif event.key==K_DOWN:
                dy=+1
                player=run_down

                

#Se till så att gubben inte fortsätter att röra på sig när man släpper
        if event.type == KEYUP:
            if event.key==K_LEFT:
                dx=0
            elif event.key==K_RIGHT:
                dx=0
            elif event.key==K_UP:
                dy=0
            elif event.key==K_DOWN:
                dy=0
                

        if x>640 or x<0:
            x=0
        if y>360 or y<0:
            y=0

        if pos == x:
            print 'hej'



    x+=dx
    y+=dy

    screen.blit(background, (0,0))
    screen.blit(player,(x,y))
    py.draw.circle(screen, col, pos, rad) 
    screen.blit(player2,(400,300))


    py.display.update()


jag försökte med att den skulle skriva hej när deras positioner var lika, snälla vill bara få det att fungera
Citera
2010-04-06, 14:22
  #4
Medlem
Wobins avatar
Citat:
Ursprungligen postat av Qzan
Jag försökte ta itu med ett program jag gjorde för åratal sen känns det som men iaf.


Kod:
bgimg="bak.jpg"
gubbe="gubb.png"



import pygame as py, sys, random
from pygame.locals import *

py.init()


#skapar skärmen
screen=py.display.set_mode((640,360),0,32)     



#laddar inte bilderna, backgrunden och spelaren
background=py.image.load(bgimg).convert()
player=py.image.load(gubbe).convert_alpha()
player2=py.image.load(gubbe).convert_alpha()



#roterar spelaren så han kan springa
run_left=py.transform.rotate(player,90)
run_right=py.transform.rotate(player,270)
run_up=py.transform.rotate(player,0)
run_down=py.transform.rotate(player,180)

#sätter start position
x,y = 150,150
dx,dy = 0,0


#cirkel

col=(230,170,0)
pos=(400,200)
rad=(60)
rita = 0

#skapar en while slinga för hela spelet
while True:  
    for event in py.event.get():  
        if event.type == QUIT:      #för att kunna stänga av programmet
            py.quit()
            sys.exit()

#Se till så att gubben kan röra på sig när man trycker på knapparna
        if event.type == KEYDOWN:            
            if event.key==K_LEFT:
                dx=-1
                player=run_left   
            elif event.key==K_RIGHT:
                dx=+1
                player=run_right                
            elif event.key==K_UP:
                dy=-1
                player=run_up
            elif event.key==K_DOWN:
                dy=+1
                player=run_down

                

#Se till så att gubben inte fortsätter att röra på sig när man släpper
        if event.type == KEYUP:
            if event.key==K_LEFT:
                dx=0
            elif event.key==K_RIGHT:
                dx=0
            elif event.key==K_UP:
                dy=0
            elif event.key==K_DOWN:
                dy=0
                

        if x>640 or x<0:
            x=0
        if y>360 or y<0:
            y=0

        if pos == x:
            print 'hej'



    x+=dx
    y+=dy

    screen.blit(background, (0,0))
    screen.blit(player,(x,y))
    py.draw.circle(screen, col, pos, rad) 
    screen.blit(player2,(400,300))


    py.display.update()


jag försökte med att den skulle skriva hej när deras positioner var lika, snälla vill bara få det att fungera

När vilka positioner är lika?

Syftar du på?
Kod:
if pos == x:
            print 
'hej' 

Eftersom pos=(400,200)
Så blir den jämförelsen:
Kod:
if (400,200) == x:
            print 
'hej' 

Vilket du kanske kan se själv är helt åt helvete.

Om du istället gör:
Kod:
if pos == (xy):
            print 
'hej' 

Så kan det fungera bättre, dock är jag som sagt inte vass på python så möjligt att det är syntaxfel.
__________________
Senast redigerad av Wobin 2010-04-06 kl. 14:25.
Citera
2010-04-06, 14:51
  #5
Medlem
Qzans avatar
ville bara testa i x-led så man kunde få lite respons o se om det fungerade :S
men som sagt funkar inte
Citera
2010-04-06, 17:53
  #6
Medlem
Wobins avatar
Citat:
Ursprungligen postat av Qzan
ville bara testa i x-led så man kunde få lite respons o se om det fungerade :S
men som sagt funkar inte

Provade du min sistnämnda kodbit? Säger den ifrån på något vis?

Dock ser jag att cirkeln verkar ha en radie på 60 punkter medans kollisionschecken bara är på 1 punkt.
Citera
2010-04-06, 18:01
  #7
Medlem
AquaRegias avatar
Citat:
Ursprungligen postat av Qzan
ville bara testa i x-led så man kunde få lite respons o se om det fungerade :S
men som sagt funkar inte

Det är för att du jämför en lista med ett heltal, det blir sant lika ofta som "Hello World!" == 23.8, dvs aldrig.

Gör något sånt här istället:

Kod:
pos = {'x':150,'y':240}
x = 150

if pos['x'] == x:
    print "It works!"
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback