2016-12-09 10 views
0

Ich versuche, eine Kollision in einem Läufer Spiel Prototyp zu simulieren. Das Problem ist mein logisches, um die Bewegung des Charakters zu stoppen und mit dem Objekt zu interagieren.Pygame Kollision Interaktion logisch

Ich habe so viele Dinge ausprobiert, aber nichts.

hier ist mein Code: das Problem am Ende ist

import pygame 
import os 

pygame.init() 
screen = pygame.display.set_mode((400,300)) 
pygame.display.set_caption("shield hacking") 
JogoAtivo = True 
GAME_BEGIN = False 
run =True 
jumping =True; 
# Speed in pixels per frame 
speedX = 0 
speedY = 0 
cordX = 10; 
cordY = 150; 
groundX=0; 
groundY=200; 
verify = open('verify_continue.txt' , "r"); 
sound_trigger=False 



def loadCoords(): 
    f1 = open("coords.txt", "r") 
    text=f1.read() 
    num_list=text.split() 
    print (num_list) 
    cordX=num_list[0] 
    print(cordX) 
    cordY=num_list[1] 
    f1.close() 
    return cordX,cordY 


def copiaArquivo(cordX, cordY): 
    x=str(cordX); 
    y=" "+str(cordY); 
    f1 = open('coords.txt', "w") 
    f1.write(x); 
    f2 = open('coords.txt', "w") 
    f2.seek(2) 
    f2.write(y); 
    f1.close() 
    f2.close() 


def draw(): 
    screen.fill((0, 0, 0)) 
    ground = pygame.draw.rect(screen, (0, 255, 0), (groundX, groundY,400, 10)) 
    square = pygame.draw.rect(screen, (255, 0, 0), (cordX, cordY ,50, 50)) 
    enemy = pygame.draw.rect(screen, (255, 0, 155), (200, 150 ,50, 50)); 
    pygame.display.flip(); 


""" SCREEN(press START) """ 
font = pygame.font.SysFont(None, 55); 
text = font.render("Press A to Start", 1, (255, 0, 0)); 
screen.blit(text,(50,20)); 
pygame.display.update(); 


while JogoAtivo: 
    for evento in pygame.event.get(): 
     print(evento) 

    #verifica se o evento que veio eh para fechar a janela 
     if evento.type == pygame.QUIT: 
       JogoAtivo = False 
       copiaArquivo(cordX, cordY); 
       pygame.quit(); 
     if evento.type == pygame.KEYDOWN: 
      if evento.key == pygame.K_a: 
        print('GAME BEGIN') 
        GAME_BEGIN = True 
        sound_trigger = False 
        if verify.read()=="S": 
         cordX,cordY=loadCoords(); 
         cordX = float(cordX); 
         cordY = float(cordY); 
        pygame.mixer.init(); 
        if sound_trigger == True: 
         sound1 = pygame.mixer.Sound('GunsNRoses_ParadiseRemix_xD.wav'); 
         chan1 = pygame.mixer.find_channel() 
         chan1.queue(sound1); 
      if evento.key == pygame.K_LEFT: 
        speedX=-0.025 
        run= True; 
      if evento.key == pygame.K_RIGHT: 
        speedX=0.025 
        run= True; 
      if evento.key == pygame.K_SPACE: 
        print("x ", cordX) 
        print("y " ,cordY) 
        speedY=-0.3 
        jumping= True; 
        if sound_trigger == True: 
         sound2 = pygame.mixer.Sound('MMX2_SE_00019.wav'); 
         chan2 = pygame.mixer.find_channel(); 
         chan2.queue(sound2); 
     if evento.type == pygame.KEYUP: 
      if evento.key == pygame.K_SPACE: 
        speedY=+0.2 




    if GAME_BEGIN: 
     draw(); 
     if run == True: 
      cordX+=speedX 
     if jumping == True: 
      cordY+=speedY 

    """square = pygame.draw.rect(screen, (255, 0, 0), (cordX, cordY ,50, 50)) 
    enemy = pygame.draw.rect(screen, (255, 0, 155), (200, 150 ,50, 50));""" 


    """ground detection""" 
    if cordY +50>= groundY: 
      speedY=0 

#PROBLEM HERE: 
      """i think to use colliderRect() method could be easier""" 

    if cordX+50 <=200 or cordX >=250: #200 and 250 == object X coords 
     cordY+=speedY; 
     cordX+=speedX; 
    elif cordX + 50 >=200 and cordX <=250 and cordY >=150: 
      speedX=0; 

    elif cordX + 50 >=200 and cordX <=250 and cordY + 50 >=150: 
      speedY=0; 

    """if cordX + 50 >=200 and cordX +50 <=250 and cordY >= 100: 
      speedY=0;""" 
+0

Verwendung 'pygame.Rect()' zu halten Position und Größe des Objekts. Und dann können Sie 'rect.x',' rect.y', 'rect.right' (=' rect.x + rect.width'), 'rect.left',' rect.top', rect.bottom verwenden (= 'rect.y + rect.height') usw. und' rect.colliderect (other_rect) ',' rect.collidepoint (mouse_position) 'und' pygame.draw.rect (screen, (255,0,0), rect) '. Übrigens: Sie müssen 'pygame.draw.rect()' nicht der Variablen zuweisen, wenn Sie diese Variable später nicht verwenden. – furas

+0

BTW: Python braucht nicht ';' – furas

+0

warum öffnest du die gleiche Datei zweimal, um zwei Elemente zu schreiben - öffne einmal und benutze 'write()' zwei mal. – furas

Antwort

0

Beantwortet:

import pygame 
import os 

pygame.init() 
screen = pygame.display.set_mode((400,300)) 
pygame.display.set_caption("shield hacking") 
JogoAtivo = True 
GAME_BEGIN = False 
run =True 
jumping =True; 
# Speed in pixels per frame 
speedX = 0 
speedY = 0 
cordX = 10; 
cordY = 150; 
groundX=0; 
groundY=200; 
verify = open('verify_continue.txt' , "r"); 


def loadCoords(): 
    f1 = open("coords.txt", "r") 
    text=f1.read() 
    num_list=text.split() 
    print (num_list) 
    cordX=num_list[0] 
    print(cordX) 
    cordY=num_list[1] 
    f1.close() 
    return cordX,cordY 


def copiaArquivo(cordX, cordY): 
    x=str(cordX); 
    y=" "+str(cordY); 
    f1 = open('coords.txt', "w") 
    f1.write(x); 
    f2 = open('coords.txt', "w") 
    f2.seek(2) 
    f2.write(y); 
    f1.close() 
    f2.close() 


def draw(): 
    screen.fill((0, 0, 0)) 
    ground = pygame.draw.rect(screen, (0, 255, 0), (groundX, groundY,400, 10)) 
    square = pygame.draw.rect(screen, (255, 0, 0), (cordX, cordY ,50, 50)) 
    enemy = pygame.draw.rect(screen, (255, 0, 155), (200, 150 ,50, 50)); 
    pygame.display.flip(); 


""" SCREEN(press START) """ 
font = pygame.font.SysFont(None, 55); 
text = font.render("Press A to Start", 1, (255, 0, 0)); 
screen.blit(text,(50,20)); 
pygame.display.update(); 


while JogoAtivo: 
    for evento in pygame.event.get(): 
     print(evento) 

    #verifica se o evento que veio eh para fechar a janela 
     if evento.type == pygame.QUIT: 
       JogoAtivo = False 
       copiaArquivo(cordX, cordY); 
       pygame.quit(); 
     if evento.type == pygame.KEYDOWN: 
      if evento.key == pygame.K_a: 
        print('GAME BEGIN') 
        GAME_BEGIN = True 
        if verify.read()=="S": 
         cordX,cordY=loadCoords(); 
         cordX = float(cordX); 
         cordY = float(cordY); 
        pygame.mixer.init(); 
        sound1 = pygame.mixer.Sound('GunsNRoses_ParadiseRemix_xD.wav'); 
        chan1 = pygame.mixer.find_channel() 
        chan1.queue(sound1); 
      if evento.key == pygame.K_LEFT: 
        speedX=-0.006 
        run= True; 
      if evento.key == pygame.K_RIGHT: 
        speedX=0.006 
        run= True; 
      if evento.key == pygame.K_SPACE: 
        print("x ", cordX) 
        print("y " ,cordY) 
        speedY=-0.3 
        jumping= True; 
        sound2 = pygame.mixer.Sound('MMX2_SE_00019.wav'); 
        chan2 = pygame.mixer.find_channel(); 
        chan2.queue(sound2); 
     if evento.type == pygame.KEYUP: 
      if evento.key == pygame.K_SPACE: 
        speedY=+0.2 




    if GAME_BEGIN: 
     draw(); 
     if run == True: 
      cordX+=speedX 
     if jumping == True: 
      cordY+=speedY 

    """square = pygame.draw.rect(screen, (255, 0, 0), (cordX, cordY ,50, 50)) 
    enemy = pygame.draw.rect(screen, (255, 0, 155), (200, 150 ,50, 50));""" 


    """ground detection""" 
    if cordY +50>= groundY: 
      speedY=0 

    if cordX + 50 >=200 and cordX +50 <=250 and cordY < 100: 
      speedX=0; 

    if cordX + 50 >=200 and cordX +50 <=250 and cordY >= 100: 
      speedY=0;