0
我想模擬跑步遊戲原型中的碰撞。問題是我的邏輯是停止角色移動並與對象進行交互。Pygame碰撞交互邏輯
我嘗試了很多東西,但沒有。
這裏是我的代碼:問題到底
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;"""
使用'pygame.Rect()'保持位置和對象的大小。然後你可以使用'rect.x','rect.y','rect.right'(='rect.x + rect.width'),'rect.left','rect.top',rect.bottom (='rect.y + rect.height')等和'rect.colliderect(other_rect)','rect.collidepoint(mouse_position)'和'pygame.draw.rect(screen,(255,0,0), RECT)'。順便說一句:如果稍後不使用此變量,則不必將'pygame.draw.rect()'分配給變量。 – furas
BTW:Python不需要';' – furas
爲什麼你打開同一個文件兩次來編寫兩個元素 - 打開一次並使用'write()'兩次。 – furas