червь вражеского типа должен ходить в пределах заданной границы слева направо.
это два наиболее важных сценария игры. сценарий Main.py и sprites.py Где-то здесь должна быть причина, по которой черви не отображаются. спасибо за помощь.
Я уже пытался изменить все в руководстве с pygame-ce на pygame, поскольку у меня нет pygame-ce (да, в настоящее время я следую руководству, чтобы изучить pygame). Вначале все враги были невидимы. После изменения кода пчелы теперь видны, но черви в большей степени полагаются на мой плиточный файл. И мне нужно разобраться с Tiled.
from settings import *
from sprites import *
from groups import AllSprites
from support import *
from timer import Timer
from random import randint
class Game:
def __init__(self):
pygame.init()
self.display_surface = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption('Platformer')
self.clock = pygame.time.Clock()
self.running = True
# groups
self.all_sprites = AllSprites()
self.collision_sprites = pygame.sprite.Group()
self.bullet_sprites = pygame.sprite.Group()
self.enemy_sprites = pygame.sprite.Group()
# load game
self.load_assets()
self.setup()
# timers
self.bee_timer = Timer(50, func = self.create_bee, autostart = True, repeat = True) # die 100 zu 50 wenn die bees schneller spawnen sollen
def create_bee(self):
spawn_x = randint(0, self.level_width - 50) # anywhere in map width
spawn_y = randint(50, self.level_height - 50) # anywhere in map height
Bee(
frames=self.bee_frames,
pos=(spawn_x, spawn_y),
groups=(self.all_sprites, self.enemy_sprites),
speed=randint(1,1)
)
def create_bullet(self, pos, direction):
x = pos[0] + direction * 34 if direction == 1 else pos[0] + direction * 34 - self.bullet_surf.get_width()
Bullet(self.bullet_surf, (x, pos[1]), direction, (self.all_sprites, self.bullet_sprites))
Fire(self.fire_surf, pos, self.all_sprites, self.player)
self.audio['shoot'].play()
def load_assets(self):
# graphics
self.player_frames = import_folder('images', 'player')
self.bullet_surf = import_image('images', 'gun', 'bullet')
self.fire_surf = import_image('images', 'gun', 'fire')
self.bee_frames = import_folder('images', 'enemies', 'bee')
self.worm_frames = import_folder('images', 'enemies', 'worm')
# sounds
self.audio = audio_importer('audio')
def setup(self):
tmx_map = load_pygame(join('data', 'maps', 'world.tmx'))
self.level_width = tmx_map.width * TILE_SIZE
self.level_height = tmx_map.height * TILE_SIZE
for x, y, image in tmx_map.get_layer_by_name('Main').tiles():
Sprite((x * TILE_SIZE,y * TILE_SIZE), image, (self.all_sprites, self.collision_sprites))
for x, y, image in tmx_map.get_layer_by_name('Decoration').tiles():
Sprite((x * TILE_SIZE,y * TILE_SIZE), image, self.all_sprites)
for obj in tmx_map.get_layer_by_name('Entities'):
if obj.name == 'Player':
self.player = Player((obj.x, obj.y), self.all_sprites, self.collision_sprites, self.player_frames, self.create_bullet)
if obj.name == 'Worm':
Worm(self.worm_frames, pygame.Rect(obj.x, obj.y, obj.width, obj.height), (self.all_sprites, self.enemy_sprites))
print("Worm created at:", obj.x, obj.y)
print(len(self.worm_frames))
#self.audio['music'].play(loops = -1)
def collision(self):
# bullets -> enemies
for bullet in self.bullet_sprites.sprites():
sprite_collision = pygame.sprite.spritecollide(bullet, self.enemy_sprites, False, pygame.sprite.collide_mask)
if sprite_collision:
self.audio['impact'].play()
bullet.kill()
for sprite in sprite_collision:
sprite.destroy()
# enemies -> player
if pygame.sprite.spritecollide(self.player, self.enemy_sprites, False, pygame.sprite.collide_mask):
self.running = False
def run(self):
while self.running:
dt = self.clock.tick(FRAMERATE) / 1000
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False
# update
self.bee_timer.update()
self.all_sprites.update(dt)
self.collision()
# draw
self.display_surface.fill(BG_COLOR)
self.all_sprites.draw(self.player.rect.center)
pygame.display.update()
pygame.quit()
if __name__ == '__main__':
game = Game()
game.run()
from settings import *
from timer import Timer
from math import sin
from random import randint
class Sprite(pygame.sprite.Sprite):
def __init__(self, pos, surf, groups):
super().__init__(groups)
self.image = surf
self.rect = self.image.get_rect(topleft = pos)
class Bullet(Sprite):
def __init__(self, surf, pos, direction, groups):
super().__init__(pos, surf, groups)
# adjustment
self.image = pygame.transform.flip(self.image, direction == -1, False)
# movement
self.direction = direction
self.speed = 850
def update(self, dt):
self.rect.x += self.direction * self.speed * dt
class Fire(Sprite):
def __init__(self, surf, pos, groups, player):
super().__init__(pos, surf, groups)
self.player = player
self.flip = player.flip
self.timer = Timer(100, autostart = True, func = self.kill)
self.y_offset = pygame.Vector2(0, 8)
if self.player.flip:
self.rect.midright = self.player.rect.midleft + self.y_offset
self.image = pygame.transform.flip(self.image, True, False)
else:
self.rect.midleft = self.player.rect.midright + self.y_offset
def update(self, _):
self.timer.update()
if self.player.flip:
self.rect.midright = self.player.rect.midleft + self.y_offset
else:
self.rect.midleft = self.player.rect.midright + self.y_offset
if self.flip != self.player.flip:
self.kill()
class AnimatedSprite(Sprite):
def __init__(self, frames, pos, groups):
self.frames, self.frame_index, self.animation_speed = frames, 0, 10
super().__init__(pos, self.frames[self.frame_index], groups)
def animate(self, dt):
self.frame_index += self.animation_speed * dt
self.image = self.frames[int(self.frame_index) % len(self.frames)]
class Enemy(AnimatedSprite):
def __init__(self, frames, pos, groups):
super().__init__(frames, pos, groups)
self.death_timer = Timer(200, func = self.kill)
def destroy(self):
self.death_timer.activate()
self.animation_speed = 0
self.image = pygame.mask.from_surface(self.image).to_surface()
self.image.set_colorkey('black')
def update(self, dt):
self.death_timer.update()
if not self.death_timer:
self.move(dt)
self.animate(dt)
self.constraint()
class Bee(Enemy):
def __init__(self, frames, pos, groups, speed):
super().__init__(frames, pos, groups)
self.speed = speed
self.amplitude = randint(500, 600)
self.frequency = randint(300, 600)
def move(self, dt):
self.rect.x -= self.speed * dt
self.rect.y += sin(pygame.time.get_ticks() / self.frequency) * self.amplitude * dt
def constraint(self):
if self.rect.right 0: self.rect.right = sprite.rect.left
if self.direction.x < 0: self.rect.left = sprite.rect.right
if direction == 'vertical':
if self.direction.y > 0: self.rect.bottom = sprite.rect.top
if self.direction.y < 0: self.rect.top = sprite.rect.bottom
self.direction.y = 0
def check_floor(self):
bottom_rect = pygame.Rect(0, 0, self.rect.width, 2)
bottom_rect.midtop = self.rect.midbottom
self.on_floor = (bottom_rect.collidelist([sprite.rect for sprite in self.collision_sprites]) >= 0)
def animate(self, dt):
if self.direction.x:
self.frame_index += self.animation_speed * dt
self.flip = self.direction.x < 0
else:
self.frame_index = 0
self.frame_index = 1 if not self.on_floor else self.frame_index
self.image = self.frames[int(self.frame_index) % len(self.frames)]
self.image = pygame.transform.flip(self.image, self.flip, False)
def update(self, dt):
self.shoot_timer.update()
self.check_floor()
self.input()
self.move(dt)
self.animate(dt)
Подробнее здесь: https://stackoverflow.com/questions/798 ... ygame-game
Почему тип врага «червь» не виден в моей игре PyGame? ⇐ Python
Программы на Python
-
Anonymous
1769867631
Anonymous
червь вражеского типа должен ходить в пределах заданной границы слева направо.
это два наиболее важных сценария игры. сценарий Main.py и sprites.py Где-то здесь должна быть причина, по которой черви не отображаются. спасибо за помощь.
Я уже пытался изменить все в руководстве с pygame-ce на pygame, поскольку у меня нет pygame-ce (да, в настоящее время я следую руководству, чтобы изучить pygame). Вначале все враги были невидимы. После изменения кода пчелы теперь видны, но черви в большей степени полагаются на мой плиточный файл. И мне нужно разобраться с Tiled.
from settings import *
from sprites import *
from groups import AllSprites
from support import *
from timer import Timer
from random import randint
class Game:
def __init__(self):
pygame.init()
self.display_surface = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
pygame.display.set_caption('Platformer')
self.clock = pygame.time.Clock()
self.running = True
# groups
self.all_sprites = AllSprites()
self.collision_sprites = pygame.sprite.Group()
self.bullet_sprites = pygame.sprite.Group()
self.enemy_sprites = pygame.sprite.Group()
# load game
self.load_assets()
self.setup()
# timers
self.bee_timer = Timer(50, func = self.create_bee, autostart = True, repeat = True) # die 100 zu 50 wenn die bees schneller spawnen sollen
def create_bee(self):
spawn_x = randint(0, self.level_width - 50) # anywhere in map width
spawn_y = randint(50, self.level_height - 50) # anywhere in map height
Bee(
frames=self.bee_frames,
pos=(spawn_x, spawn_y),
groups=(self.all_sprites, self.enemy_sprites),
speed=randint(1,1)
)
def create_bullet(self, pos, direction):
x = pos[0] + direction * 34 if direction == 1 else pos[0] + direction * 34 - self.bullet_surf.get_width()
Bullet(self.bullet_surf, (x, pos[1]), direction, (self.all_sprites, self.bullet_sprites))
Fire(self.fire_surf, pos, self.all_sprites, self.player)
self.audio['shoot'].play()
def load_assets(self):
# graphics
self.player_frames = import_folder('images', 'player')
self.bullet_surf = import_image('images', 'gun', 'bullet')
self.fire_surf = import_image('images', 'gun', 'fire')
self.bee_frames = import_folder('images', 'enemies', 'bee')
self.worm_frames = import_folder('images', 'enemies', 'worm')
# sounds
self.audio = audio_importer('audio')
def setup(self):
tmx_map = load_pygame(join('data', 'maps', 'world.tmx'))
self.level_width = tmx_map.width * TILE_SIZE
self.level_height = tmx_map.height * TILE_SIZE
for x, y, image in tmx_map.get_layer_by_name('Main').tiles():
Sprite((x * TILE_SIZE,y * TILE_SIZE), image, (self.all_sprites, self.collision_sprites))
for x, y, image in tmx_map.get_layer_by_name('Decoration').tiles():
Sprite((x * TILE_SIZE,y * TILE_SIZE), image, self.all_sprites)
for obj in tmx_map.get_layer_by_name('Entities'):
if obj.name == 'Player':
self.player = Player((obj.x, obj.y), self.all_sprites, self.collision_sprites, self.player_frames, self.create_bullet)
if obj.name == 'Worm':
Worm(self.worm_frames, pygame.Rect(obj.x, obj.y, obj.width, obj.height), (self.all_sprites, self.enemy_sprites))
print("Worm created at:", obj.x, obj.y)
print(len(self.worm_frames))
#self.audio['music'].play(loops = -1)
def collision(self):
# bullets -> enemies
for bullet in self.bullet_sprites.sprites():
sprite_collision = pygame.sprite.spritecollide(bullet, self.enemy_sprites, False, pygame.sprite.collide_mask)
if sprite_collision:
self.audio['impact'].play()
bullet.kill()
for sprite in sprite_collision:
sprite.destroy()
# enemies -> player
if pygame.sprite.spritecollide(self.player, self.enemy_sprites, False, pygame.sprite.collide_mask):
self.running = False
def run(self):
while self.running:
dt = self.clock.tick(FRAMERATE) / 1000
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False
# update
self.bee_timer.update()
self.all_sprites.update(dt)
self.collision()
# draw
self.display_surface.fill(BG_COLOR)
self.all_sprites.draw(self.player.rect.center)
pygame.display.update()
pygame.quit()
if __name__ == '__main__':
game = Game()
game.run()
from settings import *
from timer import Timer
from math import sin
from random import randint
class Sprite(pygame.sprite.Sprite):
def __init__(self, pos, surf, groups):
super().__init__(groups)
self.image = surf
self.rect = self.image.get_rect(topleft = pos)
class Bullet(Sprite):
def __init__(self, surf, pos, direction, groups):
super().__init__(pos, surf, groups)
# adjustment
self.image = pygame.transform.flip(self.image, direction == -1, False)
# movement
self.direction = direction
self.speed = 850
def update(self, dt):
self.rect.x += self.direction * self.speed * dt
class Fire(Sprite):
def __init__(self, surf, pos, groups, player):
super().__init__(pos, surf, groups)
self.player = player
self.flip = player.flip
self.timer = Timer(100, autostart = True, func = self.kill)
self.y_offset = pygame.Vector2(0, 8)
if self.player.flip:
self.rect.midright = self.player.rect.midleft + self.y_offset
self.image = pygame.transform.flip(self.image, True, False)
else:
self.rect.midleft = self.player.rect.midright + self.y_offset
def update(self, _):
self.timer.update()
if self.player.flip:
self.rect.midright = self.player.rect.midleft + self.y_offset
else:
self.rect.midleft = self.player.rect.midright + self.y_offset
if self.flip != self.player.flip:
self.kill()
class AnimatedSprite(Sprite):
def __init__(self, frames, pos, groups):
self.frames, self.frame_index, self.animation_speed = frames, 0, 10
super().__init__(pos, self.frames[self.frame_index], groups)
def animate(self, dt):
self.frame_index += self.animation_speed * dt
self.image = self.frames[int(self.frame_index) % len(self.frames)]
class Enemy(AnimatedSprite):
def __init__(self, frames, pos, groups):
super().__init__(frames, pos, groups)
self.death_timer = Timer(200, func = self.kill)
def destroy(self):
self.death_timer.activate()
self.animation_speed = 0
self.image = pygame.mask.from_surface(self.image).to_surface()
self.image.set_colorkey('black')
def update(self, dt):
self.death_timer.update()
if not self.death_timer:
self.move(dt)
self.animate(dt)
self.constraint()
class Bee(Enemy):
def __init__(self, frames, pos, groups, speed):
super().__init__(frames, pos, groups)
self.speed = speed
self.amplitude = randint(500, 600)
self.frequency = randint(300, 600)
def move(self, dt):
self.rect.x -= self.speed * dt
self.rect.y += sin(pygame.time.get_ticks() / self.frequency) * self.amplitude * dt
def constraint(self):
if self.rect.right 0: self.rect.right = sprite.rect.left
if self.direction.x < 0: self.rect.left = sprite.rect.right
if direction == 'vertical':
if self.direction.y > 0: self.rect.bottom = sprite.rect.top
if self.direction.y < 0: self.rect.top = sprite.rect.bottom
self.direction.y = 0
def check_floor(self):
bottom_rect = pygame.Rect(0, 0, self.rect.width, 2)
bottom_rect.midtop = self.rect.midbottom
self.on_floor = (bottom_rect.collidelist([sprite.rect for sprite in self.collision_sprites]) >= 0)
def animate(self, dt):
if self.direction.x:
self.frame_index += self.animation_speed * dt
self.flip = self.direction.x < 0
else:
self.frame_index = 0
self.frame_index = 1 if not self.on_floor else self.frame_index
self.image = self.frames[int(self.frame_index) % len(self.frames)]
self.image = pygame.transform.flip(self.image, self.flip, False)
def update(self, dt):
self.shoot_timer.update()
self.check_floor()
self.input()
self.move(dt)
self.animate(dt)
Подробнее здесь: [url]https://stackoverflow.com/questions/79880021/why-is-the-enemy-type-worm-not-visible-in-my-pygame-game[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия