当我按向上箭头时,如何准确地添加所有粒子的速度

时间:2017-12-25 06:30:36

标签: python-2.7 pygame

我正在进行理想气体理论模拟项目,我想问一下当我向上箭头时,如何准确地添加所有粒子的速度。因为在我的代码中,它不起作用。

我尝试在初始进程和循环中添加速度但没有任何效果。

你可以马上看到我正在做的事情。

编辑以获得更多理解

对不起,如果我没有把英语

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

pygame.init()

#colour
white = [255,255,255]
black = [0,0,0]
red = [255,0,0]
green = [0,255,0]
blue = [0,0,255]

#setup window
(width,height)=(800,600)
window=pygame.display.set_mode((width,height))
pygame.display.set_caption('ideal gas')


#setup fps window
FPS=30
clock=pygame.time.Clock()

def bounceparticle(p1,p2):
   dx=p1.x-p2.x
   dy=p1.y-p2.y

   distance=math.hypot(dx,dy)
   if distance<p1.size+p2.size:
      tangent=math.atan2(dy,dx)
      angle=0.5*math.pi+tangent

      angle1=2*tangent-p1.angle
      angle2=2*tangent-p2.angle
      speed1=p2.speed+p2.fire #so that every bounce increases speed
      speed2=p1.speed+p1.fire #so that every bounce increases speed

      (p1.angle, p1.speed) = (angle1, speed1)
      (p2.angle, p2.speed) = (angle2, speed2)

      p1.x += math.sin(angle)
      p1.y -= math.cos(angle)
      p2.x -= math.sin(angle)
      p2.y += math.cos(angle)

#partikel
class Partikel:
   def __init__(self,(x,y)):
      self.x = x
      self.y = y
      self.size = 4
      self.speed = 0
      self.angle = 0
      self.colour = blue #it need a recursion function to define changing particle's colour
      self.fire = 0

   def partikel_on_windows(self):
      pygame.draw.circle(window,self.colour,[int(self.x),int(self.y)],self.size)

   def move(self):
      self.x += math.sin(self.angle) * self.speed
      self.y -= math.cos(self.angle) * self.speed
      #self.speed += self.fire #it can increase the speed but it takes 100 times pressed arrow up keyboard

   def bounce(self):
      if self.x>=width-self.size:
         self.x=2*(width-self.size)-self.x
         self.angle=-self.angle
         self.speed += self.fire

      elif self.x<=self.size:
         self.x=2*self.size-self.x
         self.angle=-self.angle
         self.speed += self.fire

      if self.y>=height-50-self.size:
         self.y=2*(height-50-self.size)-self.y
         self.angle=math.pi-self.angle
         self.speed += self.fire

      elif self.y<=self.size:
         self.y=2*self.size-self.y
         self.angle=math.pi-self.angle
         self.speed += self.fire

number_of_particles = 200
myparticle = []

for n in range(number_of_particles):
   centralpoint = random.randint(10,50)
   x = random.randint(centralpoint,width-centralpoint)
   y = random.randint(centralpoint,height-centralpoint)

   partikel=Partikel((x,y))
   partikel.angle=random.uniform(0,math.pi*2)
   partikel.speed = 2
   #partikel.fire = 0 #it can increase the speed but it takes 100 times pressed arrow up keyboard
   #partikel.colour= [0,0,[255-partikel.speed]] #can't change the colour

   myparticle.append(partikel)


# main game loop
while True:
   for event in pygame.event.get():
      pygame.key.set_repeat(1,50)
      if event.type == QUIT:
         pygame.quit()
         sys.exit()

      if event.type == pygame.KEYDOWN:
         if event.key == K_UP:
            partikel.fire += 5
         if event.key == K_DOWN:
            partikel.fire -= 5

      """if event.type == pygame.KEYUP:
         if event.key == K_UP:
            partikel.fire = 0
         if event.key == K_DOWN:
            partikel.fire = 0"""

   window.fill(black)
   #partikel.fire = 1 #still can't
   for i in range(len(myparticle)):
      partikel = myparticle[i]
      partikel.move()
      partikel.bounce()
      partikel.partikel_on_windows()
      #partikel.fire = 0 #can't controling from keyboard
      #partikel.colour= [0,0,[255-partikel.speed]]
      for partikel2 in myparticle[i+1:]:
         bounceparticle(partikel,partikel2)



   pygame.display.update()
   clock.tick(FPS)

1 个答案:

答案 0 :(得分:0)

您必须添加到列表中的每个粒子。

我使用变量speed,我使用键进行更改,然后将其添加到循环中的每个粒子中:

for i in range(len(partikel_ku)):
    partikel.cepat += speed

每次点击都会增加/减少速度。

完整代码:

import pygame
import random
import math
import sys

# --- constants ---- (UPPER_CASE_NAMES)

PUTIH = (255, 255, 255)
HITAM = (0, 0, 0)
MERAH = (255, 0, 0)
HIJAU = (0, 255, 0)
BIRU  = (0, 0, 255)

LEBAR  = 800
TINGGI = 600

FPS = 30

# --- classes --- (CamelCaseNames)

class Partikel:

   def __init__(self, pos):
      x, y = pos
      self.x = x
      self.y = y
      self.size = 4
      self.cepat = 0
      self.sudut = 0
      self.warna = BIRU
      self.api = 0

   def partikel_di_layar(self):
       pygame.draw.circle(jendela, self.warna, [int(self.x), int(self.y)], self.size)

   def gerak(self):
       self.x += math.sin(self.sudut) * self.cepat
       self.y -= math.cos(self.sudut) * self.cepat

   def mantul(self):
       if self.x >= LEBAR-self.size:
           self.x = 2 * (LEBAR-self.size) - self.x
           self.sudut = -self.sudut

       elif self.x <= self.size:
           self.x = 2 * self.size - self.x
           self.sudut = -self.sudut

       if self.y >= TINGGI - 50 - self.size:
           self.y = 2 * (TINGGI - 50 - self.size) - self.y
           self.sudut = math.pi - self.sudut

       elif self.y <= self.size:
           self.y = 2 * self.size - self.y
           self.sudut = math.pi - self.sudut

# --- functions --- (lower_case_names)

def pantulan(p1, p2):

   dx = p1.x - p2.x
   dy = p1.y - p2.y

   jarak = math.hypot(dx,dy)

   if jarak < p1.size + p2.size:
      tangen = math.atan2(dy, dx)
      sudut = 0.5 * math.pi + tangen

      sudut1 = 2 * tangen - p1.sudut
      sudut2 = 2 * tangen - p2.sudut
      cepat1 = p2.cepat + p2.api
      cepat2 = p1.cepat + p1.api

      p1.sudut = sudut1
      p1.cepat = cepat1

      p2.sudut = sudut2
      p2.cepat = cepat2

      p1.x += math.sin(sudut)
      p1.y -= math.cos(sudut)
      p2.x -= math.sin(sudut)
      p2.y += math.cos(sudut)

# --- main ---

bnyk_partikel = 100
partikel_ku = []

# - init -

pygame.init()

jendela = pygame.display.set_mode((LEBAR, TINGGI))
pygame.display.set_caption('Animasi Bola')

pygame.key.set_repeat(1, 50)

# - objects - 

for n in range(bnyk_partikel):
    cp = random.randint(10, 50)
    x  = random.randint(cp, LEBAR - cp)
    y  = random.randint(cp, TINGGI - cp)

    partikel = Partikel((x,y))
    partikel.sudut = random.uniform(0, math.pi*2)
    partikel.cepat = 2
    partikel_ku.append(partikel)

speed = 0

# - mainloop -

clock=pygame.time.Clock()

while True:

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_UP:
                speed += 1
            elif event.key == pygame.K_DOWN:
                speed -= 1

        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:
                speed = 0
            elif event.key == pygame.K_DOWN:
                speed = 0

    jendela.fill(HITAM)

    #partikel.api = 1 #masih g bisa
    for i in range(len(partikel_ku)):
        partikel = partikel_ku[i]
        partikel.cepat += speed
        partikel.gerak()
        partikel.mantul()
        partikel.partikel_di_layar()
        partikel.api = 1 #tak bisa dipanggil dari kontrol keyboard
        #partikel.warna= [0,0,[255-partikel.cepat]]
        for partikel2 in partikel_ku[i+1:]:
            pantulan(partikel,partikel2)

    pygame.display.update()
    clock.tick(FPS)

BTW:阅读PEP 8 -- Style Guide for Python Code