Всем доброго дня, вот не могу сообразить как мне реализовать возможность перемещение спрайта моба по платформе списка lavel. Список читается и выводится успешно на экран вот этим кодом
x = 0
y = 0
for row in lavel:
for col in row:
if col == '-':
platfornome (x,y) #Строим платформы в режиме онлайн
elif col == '+':
hililka (x,y)
elif col == '$':
bar = Mob(x,y) #Координаты платформы
all_sprites.add(bar)
barmalei.add(bar)
x += 40
x = 0
y += 40
Возможно я ошибаюсь но вот я такой способ построил. То есть если строка
col == " " тогда self.vel.x += 0.5 в противному если строка col == ‘-’ self.vel.x -= 0.5 .
В итоге работы
#Движения
def update(self):
#Защита от проваливания моба сквозь платформу
#Нужно извлечь переменную из функции вызывающую мобов
#И поместить в место переменной bar
hits = pygame.sprite.spritecollide(bar ,platforms, False)
if bar.vel.y > 0:
if hits:
self.vel.y = 0
self.pos.y = hits[0].rect.top + 1
#свойства движение в зад назад
#если строка col == " " тогда self.vel.x += 0.5 в противному случае если строка
#col == тогда self.vel.x -= 0.5
self.vel.x += 0.5
if col == ' ':
self.vel.x = 0
if col == '-':
self.vel.x -= 0.5
#if col < '-':
# self.vel.x += 0.5
Моб бежит падает потом снова бежит по платформам куда то в даль и не что его остановить не может. Пробовал проверять значения какие приходят на col тесть ставил col = ’ ’ во всех условиях и соответственно мой моб вставал как в копанный на платформе. То есть не перемещался. В общем все перепробовал не получается. Для целостности картины ниже код игры привожу.
import pygame
from pygame.locals import *
import sys
import random
import clasiki
import array
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
YELLOW = (255, 255, 0)
pygame.init()
vec = pygame.math.Vector2 #2 for two dimensional
WIDTH = 1400 # Длина сцены
HEIGHT = 750 #Высота сцены
ACC = 0.5
FRIC = -0.12
FPS = 60
FramePerSec = pygame.time.Clock()
displaysurface = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Палигон отработки решений")
DOG = 0
#Класс персонажа
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
#self.image = pygame.image.load("character.png")
self.surf = pygame.Surface((40, 60))
self.surf.fill((128,255,40))
self.rect = self.surf.get_rect()
self.rect.centerx = WIDTH / 2
self.rect.bottom = HEIGHT - 200
self.pos = vec((300, 360))
self.vel = vec(0,0)
self.acc = vec(0,0)
def move(self):
self.acc = vec(0,0.5)
pressed_keys = pygame.key.get_pressed()
if pressed_keys[K_LEFT]:
self.acc.x = -ACC
if pressed_keys[K_RIGHT]:
self.acc.x = ACC
self.acc.x += self.vel.x * FRIC
self.vel += self.acc
self.pos += self.vel + 0.5 * self.acc
if self.pos.x > WIDTH:
self.pos.x = 0
if self.pos.x < 0:
self.pos.x = WIDTH
self.rect.midbottom = self.pos
def jump(self):
hits = pygame.sprite.spritecollide(self, platforms, False)
if hits:
self.vel.y = -15
def update(self):
hits = pygame.sprite.spritecollide(P1 ,platforms, False)
if P1.vel.y > 0:
if hits:
self.vel.y = 0
self.pos.y = hits[0].rect.top + 1
#------------------------------------------------------
# обработка выстрела
def shoot(self):
bullet = Bullet(self.rect.centerx, self.rect.top)
all_sprites.add(bullet)
bullets.add(bullet)
#--------------------------------------------------------
#Клас платформы
class platform(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.surf = pygame.Surface((WIDTH, 20))
self.surf.fill((255,0,0))
self.rect = self.surf.get_rect(center = (WIDTH/2, HEIGHT - 10))
def move(self):
pass
#Класс преграды для персанажа
class pregrada(pygame.sprite.Sprite):
def __init__(self,zx,zy):
super().__init__()
self.surf = pygame.Surface((40, 40))
self.surf.fill((BLUE))
self.rect = self.surf.get_rect()
self.rect.x = zx
self.rect.y = zy
def move(self):
pass
#Лечилка появляется в случайном месте карты игры
class hil(pygame.sprite.Sprite):
def __init__(self,zx,zy):
super().__init__()
self.surf = pygame.Surface((40, 40))
self.surf.fill((WHITE))
self.rect = self.surf.get_rect()
self.rect.x = zx
self.rect.y = zy
def move(self):
pass
#Класс выстрелов
class Bullet(pygame.sprite.Sprite):
def __init__(self, zx, zy):
super().__init__()
self.surf = pygame.Surface((40, 40))
self.surf.fill((WHITE))
self.rect = self.surf.get_rect()
self.rect.x = zx
self.rect.y = zy
#полёт пуль
def update(self):
self.rect.y += self.speedy
# убить, если он заходит за верхнюю часть экрана
if self.rect.bottom < 0:
self.kill()
#Мобы
class Mob(pygame.sprite.Sprite):
def __init__(self,zx,zy):
super().__init__()
#self.image = pygame.image.load("character.png")
self.surf = pygame.Surface((40, 60))
self.surf.fill((RED))
self.rect = self.surf.get_rect()
self.pos = vec((zx, zy))
self.vel = vec(0,0)
self.acc = vec(0,0)
self.engage = False
#Гравитайия действующая на моба
def move(self):
self.acc = vec(0,0.5)
pressed_keys = pygame.key.get_pressed()
self.acc.x += self.vel.x * FRIC
self.vel += self.acc
self.pos += self.vel + 0.5 * self.acc
#if self.pos.x > col:
# self.pos.x = 0
#if self.pos.x < 0:
# self.pos.x = col
self.rect.midbottom = self.pos
#Движения
def update(self):
#Защата от провалеваниея моба сквозь платформу
#Нужно извлеч переменную из функции вызыыввающию мобов
#И поместить в место переменной bar
hits = pygame.sprite.spritecollide(bar ,platforms, False)
if bar.vel.y > 0:
if hits:
self.vel.y = 0
self.pos.y = hits[0].rect.top + 1
#свойства движение в зад назад
#если строка col == " " тогда self.vel.x += 0.5 в противному случае если строка
#col == тогда self.vel.x -= 0.5
self.vel.x += 0.5
if col == ' ':
self.vel.x = 0
if col == '-':
self.vel.x -= 0.5
#if col < '-':
# self.vel.x += 0.5
#if self.vel.x < 0 and not self.engage:
# if self.rect.right >= platforms.rect.right:
# self.vel = vec(-3, 0) # Reverse the horizontal velocity.
#elif self.vel.x < 0 and not self.engage:
# if self.rect.left <= platforms.rect.left:
# self.vel = vec(3, 0) # Reverse the horizontal velocity.
PT1 = platform()
P1 = Player()
all_sprites = pygame.sprite.Group()
all_sprites.add(PT1)
all_sprites.add(P1)
platforms = pygame.sprite.Group()
barmalei = pygame.sprite.Group()
hilila = pygame.sprite.Group()
pre = pygame.sprite.Group()
#Группа выстрилов
bullets = pygame.sprite.Group()
platforms.add(PT1)
#Функции и всякая ерунда
#Функция посроения платформ
def platfornome (x,y):
K = pregrada(x,y) #Кардинаты платформы
all_sprites.add(K)
platforms.add(K)
#Функция размещение хила
def hililka (x,y):
K = hil(x,y) #Кардинаты платформы
all_sprites.add(K)
hilila.add(K)
#Функция размещение врага
#def vrag (x,y):
# global bar
# bar = Mob(x,y) #Кардинаты платформы
# all_sprites.add(bar)
# barmalei.add(bar)
# global bar
#####################################################
"""
- это платформа (реализовано)
+ это хилилка (реализована )
$ это враг
# это жуть при соприкосновение игра заканчивается
p место появление перса
"""
#Карата уравня 1
lavel = [
" ",
" ",
" ",
" ",
" ",
" ",
" ",
" $ ",
" -------- ",
" ",
" ",
" ",
" ----------- ",
" ",
" ",
" --- ",
" ",
" ",
"-----------------------------------"]
#Построение уровня
x = 0
y = 0
for row in lavel:
for col in row:
if col == '-':
platfornome (x,y) #Строим платформы в режиме онлаин
elif col == '+':
hililka (x,y)
elif col == '$':
bar = Mob(x,y) #Кардинаты платформы
all_sprites.add(bar)
barmalei.add(bar)
x += 40
x = 0
y += 40
##########################################################
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == pygame.KEYDOWN:
#Обработка событий
#Событие прыжка перса
if event.key == pygame.K_SPACE:
P1.jump()
#Событие выстрела перса
elif event.key == pygame.K_KP_ENTER:
P1.shoot()
displaysurface.fill((0,0,0))
all_sprites.update()
for entity in all_sprites:
displaysurface.blit(entity.surf, entity.rect)
entity.move()
pygame.display.flip()
#pygame.display.update()
FramePerSec.tick(FPS)