Я новичок в 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()