Pygame пропускает фреймы - PullRequest
       13

Pygame пропускает фреймы

0 голосов
/ 01 августа 2020

Я новичок в pygame и начал делать локальный многопользовательский 2D космический шутер, чтобы попробовать

Я реализовал много вещей, но есть фундаментальная проблема с pygame просто пропускать обновления кадров время от времени

Например, если вы поместите курсор в любом месте и двигаетесь вокруг него, периодически корабль будет просто прыгать

Это НЕ УЖАСНО, но было бы здорово, если бы там было легким исправлением / объяснением

Вот код устранения неполадок:

#Temporary Troubleshoot
##Only movement and aiming from main code

import os
os.environ['PYGAME_HIDE_SUPPORT_PROMPT'] = "hide"
import pygame as pg
import math
from time import sleep, time

pg.init()

pg.display.set_caption("GalactiGun") #Setting up window
crosshairpos = (0, 0)
win = pg.display.set_mode((500, 500))

class Player:
    def __init__(self, screen):
        self.screen = screen
        self.angle = 90
        self.pos = [250, 300]
        self.original_shape = pg.image.load('Sprites/ShipNeutral.png') #Sorry, put any image here
        self.shape = self.original_shape
        self.vel = 3

    def RIGHT(self):
        if self.pos[0] < 490 - self.vel:
            self.pos[0] += self.vel
    def LEFT(self):
        if self.pos[0] > self.vel + 10:
            self.pos[0] -= self.vel
    def UP(self):
        if self.pos[1] > self.vel + 10:
            self.pos[1] -= self.vel
    def DOWN(self):
        if self.pos[1] < 490 - self.vel:
            self.pos[1] += self.vel

    def turn(self, pos):
        a,b = pos
        a -= self.pos[0]
        b -= self.pos[1]
        if a == 0:
            a = 1
        self.angle = ((math.atan(b/a))/(2 * math.pi)) * -360 #Calculates angle in degrees
        if a < 0:
            self.angle += 180 #Out of arctan range

    def draw(self):
        self.shape = pg.transform.rotate(self.original_shape, self.angle)
        w, h = self.shape.get_size()
        self.screen.blit(self.shape, (self.pos[0] - int(w/2), self.pos[1] - int(h/2))) #Makes sure it rotates around it's position instead of top left

class Projectile:
    def __init__(self, screen, angle, pos, ptype):
        global shotcooldown
        global effecttimer
        self.screen = screen
        self.angle = angle
        self.x, self.y = pos
        self.mode = ptype
        if ptype == 0: #Normal
            self.shape = pg.transform.rotate(pg.image.load("Sprites/Beam.png"), angle) #Sorry again, put any image here
            self.vel = 3
            shotcooldown = .5

    def motion(self):
        global selected 
        global shotcooldown
        if self.mode != 2:
        
            self.x += math.cos((self.angle/360) * 2 * math.pi) * self.vel #Calculating movement
            self.y += math.sin((self.angle/360) * 2 * math.pi) * -1 * self.vel

            if (self.x > 550 or self.x < -50) or (self.y > 550 or self.y < -50): #Delete if out of bounds
                for z in projectiles:
                    if z == self:
                        projectiles.pop(projectiles.index(z))

            self.draw()
        else:
            pass

    def draw(self):
        w, h = self.shape.get_size()
        self.screen.blit(self.shape, (self.x - int(w/2), self.y - int(h/2)))

P1 = Player(win)
projectiles = []
shotcooldown = .5
lastshot = 0
selected = 0
effecttimer = 10
lasteffect = 0

def startmenu():
    global lastshot
    global selected
    global lasteffect
    run = True
    while run:
        test = time()
        pg.time.delay(10)
        for event in pg.event.get():
            if event.type == pg.QUIT: #Quit
                run = False

            if event.type == pg.MOUSEMOTION: #Aiming
                crosshairpos = event.pos

            if event.type == pg.MOUSEBUTTONDOWN: #Shooting
                if event.button == 1 and (time() - lastshot > shotcooldown):
                    lastshot = time()
                    x = Projectile(win, P1.angle, P1.pos, selected)
                    if selected == 3:
                        selected = 0
                    projectiles.append(x)

        keys = pg.key.get_pressed() #Movement
        if keys[pg.K_d]:
            P1.RIGHT()
        if keys[pg.K_a]:
            P1.LEFT()
        if keys[pg.K_s]:
            P1.DOWN()
        if keys[pg.K_w]:
            P1.UP()

        win.fill((0, 0, 0))

        for x in projectiles:
            x.motion()

        P1.turn(crosshairpos)
        P1.draw()

        pg.display.update()
                

startmenu()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...