Я продолжаю встречать людей, которые отвечают на замедление персонажей, но не могу найти способ применить это к мячу.
Я попробовал просто вычесть величину из шаров x и y. vel, но один из них достигал нуля раньше другого, заставляя мяч просто перемещаться по одной из осей, и это выглядело странно. Как мне сделать так, чтобы и x, и y vel достигли нуля одновременно?
Я попробовал взять начальные x и y vel с момента запуска мяча и деления его на число, которое будет количеством тиков до того, как я хотел, чтобы он остановился, я использовал 300, 5 секунд, потому что я установил код на 60 кадров в секунду, и у меня было то же самое проблема, но это случалось чаще, чем когда я просто использовал заданное число для замедления, на секунду она даже шла по прямой линии, а затем в некоторых случаях возвращалась к диагонали, а затем снова возвращалась к прямой линии, когда один из vels достигает 0, а другой все еще движется
Вот код, который я использую для определения замедления, необходимого для полной остановки за 5 секунд, и как я вычитал его из vel
import pygame
import sys
import math
import os
import random
pygame.init()
#Set Up Screen
W,H = 600 , 600
WIN = pygame.display.set_mode((W,H))
display = pygame.Surface((W//2,H//2))
pygame.display.set_caption('engine')
pygame.mouse.set_visible(True)
#FPS
FPS = 60
#Varibles
vel = 3
bvel = [0,0]
left = False
right = False
up = False
down = False
angle = 0
dirc = False
s = False
ball_pos = False
#Rects
playerrect = pygame.Rect(W//4 - 16//4,H//4 - 16//4,20,20)
ballrect = pygame.Rect(W//4 + 100//2, H//4 - 50//2,16,16)
#barriers
rects = [pygame.Rect(0,-50//2,W//2,50//2),pygame.Rect(-50//2, 0, 50//2, H//2),pygame.Rect(0,H//2,W//2,50//2),pygame.Rect(W//2, 0, 50//2, H//2)]
#Images
def loadify(imgname):
return pygame.image.load(os.path.join('Game',imgname)).convert_alpha()
#Colors
#Map Render
def load_map(path):
f = open(path + '.txt','r')
data = f.read()
f.close()
data = data.split('\n')
game_map = []
for row in data:
game_map.append(list(row))
return game_map
#Pixel Font
def clip(surf,x,y,x_size,y_size):
handle_surf = surf.copy()
clipR = pygame.Rect(x,y,x_size,y_size)
handle_surf.set_clip(clipR)
image = surf.subsurface(handle_surf.get_clip())
return image.copy()
class Font():
def __init__(self, path):
self.spacing = 1
self.character_order = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','.','-',',',':','+','\'','!','?','0','1','2','3','4','5','6','7','8','9','(',')','/','_','=','\\','[',']','*','"','',';']
font_img = loadify(path).convert()
current_char_width = 0
self.characters = {}
character_count = 0
for x in range(font_img.get_width()):
c = font_img.get_at((x, 0))
if c[0] == 127:
char_img = clip(font_img, x - current_char_width, 0, current_char_width, font_img.get_height())
self.characters[self.character_order[character_count]] = char_img.copy()
character_count += 1
current_char_width = 0
else:
current_char_width += 1
self.space_width = self.characters['A'].get_width()
def render(self, surf, text, loc):
x_offset = 0
for char in text:
if char != ' ':
surf.blit(self.characters[char], (loc[0] + x_offset, loc[1]))
x_offset += self.characters[char].get_width() + self.spacing
else:
x_offset += self.space_width + self.spacing
my_big_font = Font('large_font.png')
#Animation
def animate(frames,frame_duration):
amo_of_frames = len(frames)
animation = []
for i in range(amo_of_frames):
for u in range(frame_duration):
animation.append(frames)
return animation
#Pixel Finder
def pix_finder(character):
mx,my = pygame.mouse.get_pos()
text1 = 'X - ' + str(mx)
text2 = 'Y - ' + str(my)
text3 = 'PX - ' + str(character.x * 2)
text4 = 'PY - ' + str(character.y * 2)
text5 = 'Cx - ' + str(character.center[0] * 2) + ', Cy - ' + str(character.center[1] * 2)
my_big_font.render(WIN,text1,(W - 60,10))
my_big_font.render(WIN,text2,(W - 60,36))
my_big_font.render(WIN,text3,(W - 60,62))
my_big_font.render(WIN,text4,(W - 60,88))
my_big_font.render(WIN,text5,(W - 200,106))
#Collisions
def collision_test(rect,tiles):
collisions = []
for tile in tiles:
if rect.colliderect(tile):
collisions.append(tile)
return collisions
def move(rect,movement,tiles):
rect.x += movement[0]
collisions = collision_test(rect,tiles)
for tile in collisions:
if movement[0] > 0:
rect.right = tile.left
collision_types['right'] = True
elif movement[0] < 0:
rect.left = tile.right
collision_types['left'] = True
rect.y += movement[1]
collisions = collision_test(rect,tiles)
for tile in collisions:
if movement[1] > 0:
rect.bottom = tile.top
collision_types['bottom'] = True
elif movement[1] < 0:
rect.top = tile.bottom
collision_types['top'] = True
return rect, collision_types
bdec = [0, 0]
def bmove(rect,movement,tiles):
rect.x += movement[0]
if movement[0] > 0:
bvel[0] -= bdec[0]
elif movement[0] < 0:
bvel[1] += bdec[0]
collisions = collision_test(rect,tiles)
for tile in collisions:
if movement[0] > 0:
rect.right = tile.left
movement[0] *= -1
collision_types['right'] = True
elif movement[0] < 0:
rect.left = tile.right
movement[0] *= -1
collision_types['left'] = True
rect.y += movement[1]
if movement[1] > 0:
bvel[1] -= bdec[1]
elif movement[1] < 0:
bvel[1] += bdec[1]
collisions = collision_test(rect,tiles)
for tile in collisions:
if movement[1] > 0:
rect.bottom = tile.top
movement[1] *= -1
collision_types['bottom'] = True
elif movement[1] < 0:
rect.top = tile.bottom
movement[1] *= -1
collision_types['top'] = True
return rect, collision_types
#Game Loop
clock = pygame.time.Clock()
run = True
while run:
display.fill((0,0,0))
collision_types = {'top': False, 'bottom': False, 'right': False, 'left': False}
movement = [0,0]
if left:
movement[0] -= vel
if right:
movement[0] += vel
if up:
movement[1] -= vel
if down:
movement[1] += vel
playerrect, collisions = move(playerrect,movement,rects)
ballrect, collisions = bmove(ballrect,bvel,rects)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
pygame.quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_w or event.key == pygame.K_UP:
up = True
if event.key == pygame.K_s or event.key == pygame.K_DOWN:
down = True
if event.key == pygame.K_a or event.key == pygame.K_LEFT:
left = True
if event.key == pygame.K_d or event.key == pygame.K_RIGHT:
right = True
if event.key == pygame.K_q and ball_pos:
if dirc:
bvel[0] = (ballrect.centerx - playerrect.centerx) * .25
bvel[1] = (ballrect.centery - playerrect.centery) * .25
bdec[0] = abs(round(((ballrect.centerx - playerrect.centerx) * .25) / 300,3))
bdec[1] = abs(round(((ballrect.centery - playerrect.centery) * .25) / 300,3))
print(bvel[0],bvel[1],bdec[0],bdec[1])
ball_pos = False
dirc = False
else:
dirc = True
if event.type == pygame.KEYUP:
if event.key == pygame.K_w or event.key == pygame.K_UP:
up = False
if event.key == pygame.K_s or event.key == pygame.K_DOWN:
down = False
if event.key == pygame.K_a or event.key == pygame.K_LEFT:
left = False
if event.key == pygame.K_d or event.key == pygame.K_RIGHT:
right = False
if playerrect.colliderect(ballrect):
ball_pos = True
if ball_pos:
up = False
down = False
left = False
right = False
bvel[0] = 0
bvel[1] = 0
if dirc == False:
ballrect.centerx = (playerrect.width + 6) * math.cos(angle) + playerrect.centerx
ballrect.centery = (playerrect.width + 6) * math.sin(angle) + playerrect.centery
angle += 0.05
pygame.draw.rect(display, (255,255,255), playerrect)
pygame.draw.rect(WIN,(255,0,0),ballrect)
pygame.draw.circle(display,(255,255,255),(ballrect.centerx,ballrect.centery),8)
pygame.draw.circle(WIN,(255,0,0),(playerrect.centerx,playerrect.centery),playerrect.width + 6, 2)
WIN.blit(pygame.transform.scale(display,(W,H)),(0,0))
pix_finder(ballrect)
pygame.display.update()
clock.tick(FPS)
Подробнее здесь: https://stackoverflow.com/questions/793 ... hon-pygame
Как заставить мяч замедлиться в Python/pygame? [дубликат] ⇐ Python
Программы на Python
-
Anonymous
1737663365
Anonymous
Я продолжаю встречать людей, которые отвечают на замедление персонажей, но не могу найти способ применить это к мячу.
Я попробовал просто вычесть величину из шаров x и y. vel, но один из них достигал нуля раньше другого, заставляя мяч просто перемещаться по одной из осей, и это выглядело странно. Как мне сделать так, чтобы и x, и y vel достигли нуля одновременно?
Я попробовал взять начальные x и y vel с момента запуска мяча и деления его на число, которое будет количеством тиков до того, как я хотел, чтобы он остановился, я использовал 300, 5 секунд, потому что я установил код на 60 кадров в секунду, и у меня было то же самое проблема, но это случалось чаще, чем когда я просто использовал заданное число для замедления, на секунду она даже шла по прямой линии, а затем в некоторых случаях возвращалась к диагонали, а затем снова возвращалась к прямой линии, когда один из vels достигает 0, а другой все еще движется
Вот код, который я использую для определения замедления, необходимого для полной остановки за 5 секунд, и как я вычитал его из vel
import pygame
import sys
import math
import os
import random
pygame.init()
#Set Up Screen
W,H = 600 , 600
WIN = pygame.display.set_mode((W,H))
display = pygame.Surface((W//2,H//2))
pygame.display.set_caption('engine')
pygame.mouse.set_visible(True)
#FPS
FPS = 60
#Varibles
vel = 3
bvel = [0,0]
left = False
right = False
up = False
down = False
angle = 0
dirc = False
s = False
ball_pos = False
#Rects
playerrect = pygame.Rect(W//4 - 16//4,H//4 - 16//4,20,20)
ballrect = pygame.Rect(W//4 + 100//2, H//4 - 50//2,16,16)
#barriers
rects = [pygame.Rect(0,-50//2,W//2,50//2),pygame.Rect(-50//2, 0, 50//2, H//2),pygame.Rect(0,H//2,W//2,50//2),pygame.Rect(W//2, 0, 50//2, H//2)]
#Images
def loadify(imgname):
return pygame.image.load(os.path.join('Game',imgname)).convert_alpha()
#Colors
#Map Render
def load_map(path):
f = open(path + '.txt','r')
data = f.read()
f.close()
data = data.split('\n')
game_map = []
for row in data:
game_map.append(list(row))
return game_map
#Pixel Font
def clip(surf,x,y,x_size,y_size):
handle_surf = surf.copy()
clipR = pygame.Rect(x,y,x_size,y_size)
handle_surf.set_clip(clipR)
image = surf.subsurface(handle_surf.get_clip())
return image.copy()
class Font():
def __init__(self, path):
self.spacing = 1
self.character_order = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','.','-',',',':','+','\'','!','?','0','1','2','3','4','5','6','7','8','9','(',')','/','_','=','\\','[',']','*','"','',';']
font_img = loadify(path).convert()
current_char_width = 0
self.characters = {}
character_count = 0
for x in range(font_img.get_width()):
c = font_img.get_at((x, 0))
if c[0] == 127:
char_img = clip(font_img, x - current_char_width, 0, current_char_width, font_img.get_height())
self.characters[self.character_order[character_count]] = char_img.copy()
character_count += 1
current_char_width = 0
else:
current_char_width += 1
self.space_width = self.characters['A'].get_width()
def render(self, surf, text, loc):
x_offset = 0
for char in text:
if char != ' ':
surf.blit(self.characters[char], (loc[0] + x_offset, loc[1]))
x_offset += self.characters[char].get_width() + self.spacing
else:
x_offset += self.space_width + self.spacing
my_big_font = Font('large_font.png')
#Animation
def animate(frames,frame_duration):
amo_of_frames = len(frames)
animation = []
for i in range(amo_of_frames):
for u in range(frame_duration):
animation.append(frames[i])
return animation
#Pixel Finder
def pix_finder(character):
mx,my = pygame.mouse.get_pos()
text1 = 'X - ' + str(mx)
text2 = 'Y - ' + str(my)
text3 = 'PX - ' + str(character.x * 2)
text4 = 'PY - ' + str(character.y * 2)
text5 = 'Cx - ' + str(character.center[0] * 2) + ', Cy - ' + str(character.center[1] * 2)
my_big_font.render(WIN,text1,(W - 60,10))
my_big_font.render(WIN,text2,(W - 60,36))
my_big_font.render(WIN,text3,(W - 60,62))
my_big_font.render(WIN,text4,(W - 60,88))
my_big_font.render(WIN,text5,(W - 200,106))
#Collisions
def collision_test(rect,tiles):
collisions = []
for tile in tiles:
if rect.colliderect(tile):
collisions.append(tile)
return collisions
def move(rect,movement,tiles):
rect.x += movement[0]
collisions = collision_test(rect,tiles)
for tile in collisions:
if movement[0] > 0:
rect.right = tile.left
collision_types['right'] = True
elif movement[0] < 0:
rect.left = tile.right
collision_types['left'] = True
rect.y += movement[1]
collisions = collision_test(rect,tiles)
for tile in collisions:
if movement[1] > 0:
rect.bottom = tile.top
collision_types['bottom'] = True
elif movement[1] < 0:
rect.top = tile.bottom
collision_types['top'] = True
return rect, collision_types
bdec = [0, 0]
def bmove(rect,movement,tiles):
rect.x += movement[0]
if movement[0] > 0:
bvel[0] -= bdec[0]
elif movement[0] < 0:
bvel[1] += bdec[0]
collisions = collision_test(rect,tiles)
for tile in collisions:
if movement[0] > 0:
rect.right = tile.left
movement[0] *= -1
collision_types['right'] = True
elif movement[0] < 0:
rect.left = tile.right
movement[0] *= -1
collision_types['left'] = True
rect.y += movement[1]
if movement[1] > 0:
bvel[1] -= bdec[1]
elif movement[1] < 0:
bvel[1] += bdec[1]
collisions = collision_test(rect,tiles)
for tile in collisions:
if movement[1] > 0:
rect.bottom = tile.top
movement[1] *= -1
collision_types['bottom'] = True
elif movement[1] < 0:
rect.top = tile.bottom
movement[1] *= -1
collision_types['top'] = True
return rect, collision_types
#Game Loop
clock = pygame.time.Clock()
run = True
while run:
display.fill((0,0,0))
collision_types = {'top': False, 'bottom': False, 'right': False, 'left': False}
movement = [0,0]
if left:
movement[0] -= vel
if right:
movement[0] += vel
if up:
movement[1] -= vel
if down:
movement[1] += vel
playerrect, collisions = move(playerrect,movement,rects)
ballrect, collisions = bmove(ballrect,bvel,rects)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
pygame.quit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_w or event.key == pygame.K_UP:
up = True
if event.key == pygame.K_s or event.key == pygame.K_DOWN:
down = True
if event.key == pygame.K_a or event.key == pygame.K_LEFT:
left = True
if event.key == pygame.K_d or event.key == pygame.K_RIGHT:
right = True
if event.key == pygame.K_q and ball_pos:
if dirc:
bvel[0] = (ballrect.centerx - playerrect.centerx) * .25
bvel[1] = (ballrect.centery - playerrect.centery) * .25
bdec[0] = abs(round(((ballrect.centerx - playerrect.centerx) * .25) / 300,3))
bdec[1] = abs(round(((ballrect.centery - playerrect.centery) * .25) / 300,3))
print(bvel[0],bvel[1],bdec[0],bdec[1])
ball_pos = False
dirc = False
else:
dirc = True
if event.type == pygame.KEYUP:
if event.key == pygame.K_w or event.key == pygame.K_UP:
up = False
if event.key == pygame.K_s or event.key == pygame.K_DOWN:
down = False
if event.key == pygame.K_a or event.key == pygame.K_LEFT:
left = False
if event.key == pygame.K_d or event.key == pygame.K_RIGHT:
right = False
if playerrect.colliderect(ballrect):
ball_pos = True
if ball_pos:
up = False
down = False
left = False
right = False
bvel[0] = 0
bvel[1] = 0
if dirc == False:
ballrect.centerx = (playerrect.width + 6) * math.cos(angle) + playerrect.centerx
ballrect.centery = (playerrect.width + 6) * math.sin(angle) + playerrect.centery
angle += 0.05
pygame.draw.rect(display, (255,255,255), playerrect)
pygame.draw.rect(WIN,(255,0,0),ballrect)
pygame.draw.circle(display,(255,255,255),(ballrect.centerx,ballrect.centery),8)
pygame.draw.circle(WIN,(255,0,0),(playerrect.centerx,playerrect.centery),playerrect.width + 6, 2)
WIN.blit(pygame.transform.scale(display,(W,H)),(0,0))
pix_finder(ballrect)
pygame.display.update()
clock.tick(FPS)
Подробнее здесь: [url]https://stackoverflow.com/questions/79379007/how-to-make-a-ball-decelerate-in-python-pygame[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия