2015-02-16 2 views
-2

Привет, в названии сказано, что это основное ... Чтобы описать это немного больше: это 2D случайный фрагмент, на котором вы можете переместить игрока, и он может добывать уголь. Проблема заключается в том, что если он стоит на угле и сжимает пространство более одного раза, уголь добавляется больше, чем один раз к его инвентарю, И это проблема. Он может добывать больше угля, даже больше нет. Я искал google, но единственное, что я узнал, это то, что я должен использовать флаг, некоторые логические значения ... но КАК?Pygame keypress должен вызывать функцию только один раз

Я знаю, что код написан был грязный, некрасивый и т.д ... может быть оптимизировано ...

import random 
import pygame 
import Images_raw 
from colors import * 
from timeit import default_timer as timer 


pygame.init() 
#---------------------------------------------------------------------------------------------------------------------- 
#pygame Display settings 
display_width=704; display_height=512 
gameDisplay=pygame.display.set_mode((display_width,display_height)) 
pygame.display.set_caption('2D Coal miner') 

# Misc 
clock = pygame.time.Clock() 
font = pygame.font.SysFont(None, 25) 
mouseX=int; mouseY=int 

class Map: 
    def __init__(self): 
     global mapp,mapSize,mappSurfaces,QD_array,inventory,ammount,minedCoal 
     mapSize=100 
     ammount=0 
     mapp=[[random.randint(0,1) for i in range(mapSize)] for i in range(mapSize)] 
     mappSurfaces=mapp 
     QD_array=[[random.randint(0,1) for i in range(mapSize)] for i in range(mapSize)] 
     inventory=[[{'item':ammount} for i in range(5)] for i in range(5)] 
     minedCoal=[] 

    def createMap(self): 
     global tileImage,recti,coalRect_list,chacheList 
     tileImage=pygame.Surface 
     coalRect=pygame.Surface 
     coalRect_list=[] 
     chacheList=[] 

     for i in range(mapSize): 
      for j in range(mapSize): 
       randNum=random.randint(0,11) 
       randNum2=random.randint(0,1) 

       if randNum == 0 and randNum2==1: 
        tileImage= Images_raw.coal_img 
        QD_array[i][j]=0 

       elif randNum== 2 and randNum2<= 9: 
        tileImage= Images_raw.water_img 
        QD_array[i][j]=1 

       elif randNum>= 3 or randNum2>= 12: 
        tileImage= Images_raw.grass_img 
        QD_array[i][j]=2 

       elif randNum== 5 or randNum2== 5: 
        tileImage= Images_raw.stone_img 
        QD_array[i][j]=3 
       else: 
        tileImage= Images_raw.dirt_img 
        QD_array[i][j]=4 

       mappSurfaces[i][j]=tileImage 

     for k in range(mapSize): 
      for l in range(mapSize): 
       if QD_array[k][l]==0: 
        coalRect=pygame.Rect(k*32,l*32,32,32) 
        coalRect_list.append(coalRect) 
       else: 
        pass 

    def mineCoalAt(self,noCoal): 

     for i in range(mapSize): 
      for j in range(mapSize): 
       if QD_array[i][j]==0: 
        chacheList.append((i,j)) 

     x=chacheList[noCoal][0] 
     y=chacheList[noCoal][1] 

     QD_array[x][y]=10 

     inventory[0][0]['item']+=1 

    def update(self,x_dif,y_dif): 
     for i in range(mapSize): 
      for j in range(mapSize): 
       if QD_array[i][j] == 0: 
        tileImage= Images_raw.coal_img 

       elif QD_array[i][j]== 1: 
        tileImage= Images_raw.water_img 

       elif QD_array[i][j]== 2: 
        tileImage= Images_raw.grass_img 

       elif QD_array[i][j]== 3: 
        tileImage= Images_raw.stone_img 

       elif QD_array[i][j]== 10: 
        tileImage= Images_raw.coalUsed_img 
       else: 
        tileImage= Images_raw.dirt_img 

       mappSurfaces[i][j]=tileImage 
       gameDisplay.blit(mappSurfaces[i][j],(x_dif+(i*32),y_dif+(j*32)),None,0) 


#---------------------------------------------------------------------------------------------------------------------- 

# Main game function 
#---------------------------------------------------------------------------------------------------------------------- 
def gameLoop(): 
    gameExit=False; outRight=False 
    player_X=11; player_Y=8 
    allowMovement=False 
    moveRight,moveLeft,moveUp,moveDown=False,False,False,False 
    Space,sSpace=False,False 
    x_difference,y_difference=0,0 
    mapO=Map() 
    mapO.createMap() 
    counter=0 
    allowMovement=True 


    while not gameExit: 
#-----------event loop--------------------------------------------------------- 
     for event in pygame.event.get(): 

      if event.type == pygame.QUIT: 
       gameExit = True 

      elif event.type == pygame.KEYDOWN: 
       if (event.key == pygame.K_DOWN): 
        moveDown=True 
       elif(event.key == pygame.K_UP): 
        moveUp=True 
       elif(event.key == pygame.K_LEFT): 
        moveLeft=True 
       elif(event.key == pygame.K_RIGHT): 
        moveRight=True 
       elif(event.key == pygame.K_p): 
        print(player_X*32,player_Y*32) 
       elif(event.key == pygame.K_SPACE): 
        Space=True 
       elif(event.key == pygame.K_i): 
        print(inventory) 

      elif event.type == pygame.KEYUP: 
       if (event.key == pygame.K_DOWN): 
        moveDown=False 
       elif(event.key == pygame.K_UP): 
        moveUp=False 
       elif(event.key == pygame.K_LEFT): 
        moveLeft=False 
       elif(event.key == pygame.K_RIGHT): 
        moveRight=False 
       elif(event.key == pygame.K_SPACE): 
        Space=False 


#-----------event loop END----------------------------------------------------- 
     a=len(coalRect_list) 

     #Logical/Main part 

     if allowMovement==True: 
      if moveRight==True: 
       player_X+=1 
       x_difference-=32 
       for i in range(a): 
        coalRect_list[i].x-=32 

      elif moveLeft==True: 
       player_X-=1 
       x_difference+=32 
       for i in range(a): 
        coalRect_list[i].x+=32 

      elif moveDown==True: 
       player_Y+=1 
       y_difference-=32 
       for i in range(a): 
        coalRect_list[i].y-=32 

      elif moveUp==True: 
       player_Y-=1 
       y_difference+=32 
       for i in range(a): 
        coalRect_list[i].y+=32 

      else: 
       player_X+=0;player_Y+=0 
       y_difference+=0;x_difference+=0 

      if Space==True: 
       sSpace=True 
      else: 
       sSpace=False 
     else: 
      pass 

     #Drawing objects to screen part 
     gameDisplay.fill(white) #Backgroundcolor 

     mapO.update(x_difference,y_difference) 
     playerRect=gameDisplay.blit(Images_raw.man_img,(player_X*0+352,player_Y*0+256),None,0) 

     aba=playerRect.collidelist(coalRect_list) 



     ''' 
     if aba!=-1 and sSpace==True: 
      counter+=1 


      if counter==1: 
       minedCoal.append(aba) 
       mapO.mineCoalAt(aba) 
       inventory[0][0]['item']+=1 
      elif counter==2: 
       counter=0 

      else: 
       pass 
     ''' 

     if aba!=1: 
      if sSpace==True: 
       minedCoal.append(aba) 
       mapO.mineCoalAt(aba) 

      else: 
       pass 

     #Update everything and set FPS-timer 
     pygame.display.update() 
     clock.tick(20) 

    #Needed so that the program gets closed properly 
    pygame.quit() 
    quit() 
#---------------------------------------------------------------------------------------------------------------------- 
#End of the Main game function 
#---Normal coding goes on 

#call the gameLoop 
gameLoop() 

ответ

2

Есть много проблем с кодом, но давайте сосредоточимся на ваш вопрос:

aba=playerRect.collidelist(coalRect_list) 

aba теперь содержит индекс первого Rect в coalRect_list, которая сталкивается с playerRect или -1.

if aba!=1: 
    if sSpace==True: 
     minedCoal.append(aba) 
     mapO.mineCoalAt(aba) 
    else: 
     pass 

Я предполагаю, что вы хотели, чтобы проверить aba != -1 здесь, так как -1 указывает, что столкновения не случилось:

if aba != -1 and sSpace: 
    ... 

Что теперь происходит до вас, но я предполагаю, что вы хотите удалить уголь карту, так что вы можете просто удалить Rect из coalRect_list

if aba != -1 and sSpace: 
    minedCoal.append(aba) 
    mapO.mineCoalAt(aba) 
    del coalRect_list[aba] 

Поскольку вы используете только coalRect_list к сп Если добывать уголь, этого должно быть достаточно.

+0

Это не работает, потому что тогда все остальные coalRect перемещаются в неправильный positon. Моя точка была в том, что если эта статута «if aba! = -1 И sSpace:» истинна в функции minedCoal.append (aba), инвентарь [0] [0] ['item'] + = 1 -declaration обновляется только один раз, а не каждый раз, когда я нажимаю пробел. Таким образом, только один уголь добавляется в инвентарь ..... –

+0

* все остальные coalRect перемещаются в неправильный positon * Как? Я ничего не вижу в вашем коде, что могло бы вызвать это. – sloth

+0

Я попробовал ваше предложение, но тогда вы больше не смогли бы добыть мой уголь ... –

Смежные вопросы