2013-06-14 2 views
0

Полный новичок, новый для программирования в целом. Я пытаюсь написать игру скроллера в python, используя pygame. Я создал три разные библиотеки для своих классов спрайтов для: игрока, врага и земли. Я сделал страну спрайтом, чтобы игрок мог взаимодействовать (сталкиваться) с разными объектами в классе земли и не мог пройти через них. Проблема, с которой я сталкиваюсь, заключается в том, что я хочу, чтобы вражеский спрайт мог взаимодействовать с земельным спрайтом. В идеале, я хочу, чтобы вражеские спрайты начинались в точке «x» и приводились в движение (-2), пока они не вступают в контакт с земельным спрайтом, и в этот момент я хочу, чтобы он повернул направление. Я пытаюсь все, что только могу придумать, и искать в Интернете решение для того, чтобы эта работа не имела успеха. Похоже, это должно быть очень просто, но я не могу заставить его работать.Python, столкнувшись с проблемой управления вражеским спрайтом

Спасибо за ваше время.

вот мой код:

земля спрайт:

import pygame 

class Object(pygame.sprite.Sprite): 
    def __init__(self,image_file): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load(image_file) 
     self.rect = self.image.get_rect() 

игрок спрайт:

import pygame 

class Player(pygame.sprite.Sprite): 
    change_x = 0 
    change_y = 0 
    jump_ready = False 
    frame_since_collision = 0 
    frame_since_jump = 0 
    frame = 0 
    def __init__(self): 
     pygame.sprite.Sprite.__init__(self) 
     self.images = [] 
     for i in range(1,9): 
      img = pygame.image.load("pit"+str(i)+".png").convert() 
      img.set_colorkey((0,0,0)) 
      self.images.append(img) 
     self.image = self.images[0] 
     self.rect = self.image.get_rect() 

    def changespeed_x(self,x): 
     self.change_x = x 
    def changespeed_y(self,y): 
     self.change_y = y 
    def update(self,ground,brick,enemy): 
     if self.change_x < 0: 
      self.frame += 1 
      if self.frame > 3*4: 
       self.frame = 0 
      self.image = self.images[self.frame//4] 
     if self.change_x > 0: 
      self.frame += 1 
      if self.frame > 3*4: 
       self.frame = 0 
      self.image = self.images[self.frame//4+4] 

     old_x = self.rect.x 
     new_x = old_x + self.change_x 
     self.rect.x = new_x 

     player_health = 5 
     hurt = pygame.sprite.spritecollide(self,enemy,False) 
     if hurt: 
      player_health -= 1 
      print(player_health) 

     brick_break = pygame.sprite.spritecollide(self,brick,True) 
     collide = pygame.sprite.spritecollide(self,ground,False) 
     if collide: 
      self.rect.x = old_x 
     old_y = self.rect.y 
     new_y = old_y + self.change_y 
     self.rect.y = new_y 

     touch_list = pygame.sprite.spritecollide(self,ground,False) 

     for ground in touch_list: 
      self.rect.y = old_y 
      self.rect.x = old_x 
      self.change_y = 0 
      self.frame_since_collision = 0 
     if self.frame_since_collision < 6 and self.frame_since_jump < 6: 
      self.frame_since_jump = 100 
      self.change_y -= 8 
     self.frame_since_collision += 1 
     self.frame_since_jump += 1 

    def calc_grav(self): 
     self.change_y += .35 
     if self.rect.y >= 450 and self.change_y >= 0: 
      self.change_y = 0 
      self.rect.y = 450 
      self.frame_since_collision = 0 
    def jump(self,blocks): 
     self.jump_ready = True 
     self.frame_since_jump = 0 

это враг спрайт, который работает, он только перемещается влево, каждый раз, когда я попробовал изменение кода столкновения, как у меня в классе игрока, спрайт просто остановился, когда он столкнулся с земельным спрайтом

противника спрайт:

import pygame 


class Enemy(pygame.sprite.Sprite): 
    def __init__(self,image_file): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load(image_file) 
     self.image = self.image.convert() 
     self.image.set_colorkey((0,0,0)) 
     self.rect = self.image.get_rect() 

    def update(self,ground): 
     change_x = -2 
     self.rect.x += change_x 

и мой основной код программы:

# first must import 
import pygame 
import random 
import thing 
import enemy 
import player 



# initialize the game engine 
pygame.init() 

# define some colors 
# more color combos at www.colorpicker.com 
black = (0, 0, 0) 
white = (255, 255, 255) 
green = (0, 255, 0) 
red = (255, 0, 0) 
blue = (131,226,252) 


# open and set window size. 
screen_width = 700 
screen_height = 350 
screen = pygame.display.set_mode([screen_width,screen_height]) 

break_list = pygame.sprite.Group() 
land_list = pygame.sprite.Group() 
enemy_list = pygame.sprite.Group() 
all_sprites_list = pygame.sprite.Group() 

cloud = pygame.image.load("cumulus-huge.png").convert() 

for x in range(300,500,60): 
    brick = thing.Object("birck.png") 
    brick.rect.x = x 
    brick.rect.y = 180 
    break_list.add(brick) 
    all_sprites_list.add(brick) 

for x in range(0,200,50): 
    wall = thing.Object("Sky3.png") 
    wall.rect.x = -180 
    wall.rect.y = x 
    land_list.add(wall) 
    all_sprites_list.add(wall) 


for x in range (-50,1400,70): 
    ground = thing.Object("Ground2.png") 
    ground.rect.x = x 
    ground.rect.y = 305 
    land_list.add(ground) 
    all_sprites_list.add(ground) 

monster = enemy.Enemy("monster1.png") 
monster.rect.x = 650 
monster.rect.y = 250 
enemy_list.add(monster) 
all_sprites_list.add(monster) 

for x in range(760,1070,300): 
    pipe = thing.Object("pipe-top.png") 
    pipe.rect.x = x 
    pipe.rect.y = 225 
    land_list.add(pipe) 
    all_sprites_list.add(pipe) 

player = player.Player() 
player.rect.x = 10 
player.rect.y = 230 
all_sprites_list.add(player) 


# set the window title 
pygame.display.set_caption("Scroller") 

# the following code sets up the main program loop 

# Boolean Variable to loop until the user clicks the close button. 
done = False # loop control 

# used to manage how fast the screen updates 
clock = pygame.time.Clock() # controls how fast game runs 


# Main Program Loop 
while done == False: 
    # ALL EVENT PROCESSING (input) SHOULD GO BELOW THIS COMMENT 

    for event in pygame.event.get(): # user did something 
     if event.type == pygame.QUIT: #If user clicked close 
      done = True # flag that we are done so we exit this loop 

     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_LEFT: 
       player.changespeed_x(-6) 
      if event.key == pygame.K_RIGHT: 
       player.changespeed_x(6) 
      if event.key == pygame.K_UP: 
       player.jump(land_list) 
      if event.key == pygame.K_DOWN: 
       player.changespeed_y(6) 

     if event.type == pygame.KEYUP: 
      if event.key == pygame.K_LEFT: 
       player.changespeed_x(-0) 
      if event.key == pygame.K_RIGHT: 
       player.changespeed_x(0) 

    monster.update() 
    player.update(land_list,break_list,enemy_list) 
    player.calc_grav() 


    # ALL EVENT PROCESSING (input) SHOULD GO ABOVE THIS COMMENT 

    # ALL GAME LOGIC (process) SHOULD GO BELOW THIS COMMENT 



    if player.rect.x >= 500: 
     diff = player.rect.x - 500 
     player.rect.x=500 
     for ground in land_list: 
      ground.rect.x -= diff 
     for brick in break_list: 
      brick.rect.x -= diff 
     for monster in enemy_list: 
      monster.rect.x -= diff 

    if player.rect.x <= 15: 
     diff = 15 - player.rect.x 
     player.rect.x = 15 
     for ground in land_list: 
      ground.rect.x += diff 
     for brick in break_list: 
      brick.rect.x += diff 
     for monster in enemy_list: 
      monster.rect.x += diff 

    # ALL GAME LOGIC (process) SHOULD GO ABOVE THIS COMMENT 

    # ALL CODE TO DRAW (output) SHOULD GO BELOW THIS COMMENT 

    # First, clear the screen. Don't put other drawing commands 
    # above this, or they will be erased with this command. 
    screen.fill(blue) 
    screen.blit(cloud,[200,0]) 
    cloud.set_colorkey(black) 
    all_sprites_list.draw(screen) 


    # ALL CODE TO DRAW (output) SHOULD GO ABOVE THIS COMMENT 

    # This will update the screen with what's been drawn. 
    pygame.display.flip() 

    # limit to 30frames per second 
    clock.tick(30) 

pygame.quit() 
+0

Для запуска кода необходимо несколько изображений. Можете ли вы предоставить ссылки на изображения? – falsetru

+0

enemy.Enemy.update() имеет параметр ground, но вызывается без какого-либо аргумента в главном программном коде. – falsetru

ответ

1

Ваш классовый враг должен быть таким:

class Enemy(pygame.sprite.Sprite): 
    def __init__(self,image_file): 
     pygame.sprite.Sprite.__init__(self) 
     self.image = pygame.image.load(image_file) 
     self.image = self.image.convert() 
     self.image.set_colorkey((0,0,0)) 
     self.rect = self.image.get_rect() 
     self.vel = -2 

    def update(self,ground): 
     self.rect.x += self.vel 

Затем в цикле обновления, реализовать этот псевдокод:

... 

if monster collides with ground: 
    monster.vel *= -1 

... 
+0

Большое вам спасибо, это работает отлично! Я знал, что это что-то простое, я даже попробовал нечто подобное, что не сработало, теперь я понимаю, почему. Еще раз спасибо. – user2484439

Смежные вопросы