2016-03-05 32 views
3

我正在pygame中製作一個簡單的遊戲。它看起來是一個平臺遊戲RPG。但這個問題既不是最終的,也不是相關的。到目前爲止,我在遊戲中的功能很少。如果是這樣,它只是一個骨架。我的問題有兩種:Pygame - 重力法

  • 什麼是最好的(在性能和靈活性方面)的方式來增加重力類pygame?
  • 什麼是一般添加重力的最佳做法?例如,你只是簡單地做一個「如果keyPressed == k_W然後從玩家y中減去2個像素的20個ticks」,或者在向上或負向的y方向上減去2個像素的速度?

我已經看到其他文章在事實之後增加遊戲引力,在最初的開發過程中添加它真的沒有想過。我希望儘早添加它,所以不要將重力加到其他東西上,我可以將其他東西添加到重力中。我將繼續關注這一點,所以如果你更願意指向某些在線資源的方向,那麼我也非常感謝!

回答

0

快速免責聲明:我不知道有多種方法來引入重力,所以我不能說哪個是最好的。但是,如果你正在用Python進行性能戰,那麼你可能正在與錯誤的戰鬥作鬥爭。

對於重力,可以使用矢量系統。假設一個角色從地面跳下,初始速度爲[5,-15](負y因爲y正向下!),你可以通過這個速度每幀移動角色的矩形來模擬移動。爲了把重力放在這裏,你需要加上 9.8到你每秒的速度分量值。所以1秒鐘,速度將是[5,-5]左右。這會讓你的角色慢下來,並開始向下移動。

對於按鍵動作,我建議使用布爾值。一個例子,在按k_U時,一個說你正在向上移動的變量變爲True。然後,如果這個變量是真的,你就移動他,比如[0,-5]。在鍵入時,將變量設置爲false。對北/東/南/西進行此操作,然後在四個方向上有一個移動系統,在您按住此鍵的同時移動您。

0

我用在此代碼的1/2毫克^ 2方程,其具有像效果的雪:

import math, sys, random, time 
import pygame, inputbox 
from pygame.locals import * 

class flake: 

    def __init__(self, xpos, ypos, mass, color, drift): 
     self.xpos = xpos 
     self.ypos = ypos 
     self.mass = mass 
     self.rect = pygame.Rect(xpos, ypos, 2, 2) 
     self.checked = False 
     self.color = color 
     self.drift = drift 

size = width, height = 510, 700 

BLACK = (0,0,0) 
WHITE = (255, 255, 255) 
GREY = (128,128,128) 
DARKGREY = (169,169,169) 
SILVER = (192,192,192) 
LIGHTGREY = (211,211,211) 
LIGHTESTGREY = (220,220,220) 

pygame.init()  

screen = pygame.display.set_mode(size) 
background = pygame.Surface(screen.get_size()) 
background = background.convert() 
background.fill(BLACK) 

def init(): 

    global theSnow, snowColours, clock, startrange 

    theSnow = [] 
    snowColours = [] 

    snowColours.append(WHITE) 
    snowColours.append(GREY) 
    snowColours.append(DARKGREY) 
    snowColours.append(SILVER) 
    snowColours.append(LIGHTGREY) 
    snowColours.append(LIGHTESTGREY) 

    for c in range(2000): 
     mass = 0.0 
     mass = float(random.randint(1,8)/100.0) 
     xpos = random.randint(0,width) 
     ypos = random.randint(0,5) 
     ypos = -ypos 
     drift = ypos/10.0 

     colour = snowColours[random.randint(0,5)] 

     f = flake(xpos, ypos, mass, colour, drift) 
     theSnow.append(f)  
     print "flake x = " + str(f.xpos) + " y = " + str(f.ypos) + " mass = " + str(f.mass)    

    startrange = 200 
    clock = pygame.time.Clock() 

def run(): 

    global theSnow, clock 
    global startrange 

    newrange = 0 

    while True: 
     events = pygame.event.get() 
     for event in events: 
      if event.type == pygame.QUIT: 
       sys.exit() 
     keys=pygame.key.get_pressed() 

     if keys[K_q]: 
      return 

     g = 3 

     for count in range(startrange): 

      yinc = 0.0 
      yuncertainty = float(random.randint(1,5)/10.0) 
      yinc = float(0.5 * theSnow[count].mass * (g*g)) + yuncertainty 
      theSnow[count].ypos += yinc 

      xuncertainty = random.randint(1,10) 
      if xuncertainty > 4: 
       theSnow[count].xpos += theSnow[count].drift 
      else: 
       theSnow[count].xpos -= theSnow[count].drift 

      theSnow[count].rect = pygame.Rect(theSnow[count].xpos, theSnow[count].ypos, 2,2) 

      if not theSnow[count].checked: 
       if theSnow[count].ypos > 30: 
        for c in range(newrange, startrange): 
         print " c= " + str(c) 
         theSnow[c].checked = True 

        if startrange < 2000: 
         startrange += 100 
         newrange = startrange - 100 
         print " newrange = " + str(newrange) 
         print " startrange = " + str(startrange) 

     update() 
     pygame.time.wait(10) 
    #clock.tick(10) 

def update(): 

    global theSnow, startrange 
    background.fill(BLACK) 

    for count in range(startrange): 
     pygame.draw.rect(background, theSnow[count].color, theSnow[count].rect) 

    screen.blit(background, (0, 0)) 
    pygame.display.flip() 


if __name__ == "__main__": 
    init() 
    run()