当我按箭头时,如何添加所有粒子的速度



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

我尝试在初始过程和循环中添加速度,但没有任何可行。

您可以立即看到我要做的事情。

编辑以获取更多理解

对不起,如果我不放英文

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)

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

我使用使用键更改的变量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- python代码的样式指南

最新更新