2013-11-14 3 views
-2

Итак, это моя игра, над которой я работаю, и поэтому все идет хорошо, игрок может передвигаться и сбивать коробки, которые должны двигаться, но theres эти небольшие сбои, но прежде чем идти на Херес код:Два сбоя движения врага

import pygame, math, random, sys 
from pygame import * 
import random, math, cmath 

pygame.init() 

#variables end---------------------------------------------------------------- 

#imagers 
grass = "grass_shit.png" #grass image 
player_img = "shithead.png" #player name 
ali_img = "shit_head2.png" #alien image 
dead_screen = "dead_shit.png" 
cross_hair = "crosshair.png" 
playButton = "playbutton.png" 

#screen 
screen = pygame.display.set_mode((850, 640),0,32) #set screen      
background = pygame.image.load(grass).convert() #load image to screen 

health = 100 

#mouse things 
crosshair = pygame.image.load(cross_hair).convert_alpha() 

#variables end---------------------------------------------------------------- 

pygame.mouse.set_visible(False) 

black = (0, 0, 0) 
white = (255, 255, 255) 
red = (255, 0, 0) 
blue = (0, 0, 255) 

player_x, player_y = 0, 0 
move_player_x, move_player_y = 0, 0 

move_ali_x, move_ali_y = 0, 0 

class Block(pygame.sprite.Sprite): 

    def __init__(self, color): 

     pygame.sprite.Sprite.__init__(self) 

     self.image = pygame.Surface([20, 15]) 
     self.image.fill(color) 

     self.rect = self.image.get_rect() 

    def update(self): 

     global move_ali_x 
     global move_ali_y 

     if block.rect.x < player_x: 
      move_ali_x =+ 0.05 
     elif block.rect.x > player_x: 
      move_ali_x =- 0.05 
     if block.rect.y < player_y: 
      move_ali_y =+ 0.05 
     elif block.rect.y > player_y: 
      move_ali_y =- 0.05 

class Player(pygame.sprite.Sprite): 

    def __init__(self): 

     pygame.sprite.Sprite.__init__(self) 

     self.image = pygame.Surface([20,20]) 
     self.image.fill(red) 

     self.rect = self.image.get_rect() 
    def update(self): 

     pos = pygame.mouse.get_pos() 


     self.rect.x = player_x 
     self.rect.y = player_y 

class Bullet(pygame.sprite.Sprite): 

    def __init__(self, mouse, player): 

     pygame.sprite.Sprite.__init__(self) 

     self.image = pygame.Surface([4, 10]) 
     self.image.fill(black) 

     self.mouse_x, self.mouse_y = mouse[0], mouse[1] 
     self.player = player 

     self.rect = self.image.get_rect() 

    def update(self): 

     speed = 10 
     range = 50000 
     distance = [self.mouse_x - self.player[0], self.mouse_y - self.player[1]] 
     norm = math.sqrt(distance[0] ** 2 + distance[1] ** 2) 
     direction = [distance[0]/norm, distance[1]/norm] 
     bullet_vector = [direction[0] * speed, direction[1] * speed] 


     self.rect.x += bullet_vector[0] 
     self.rect.y += bullet_vector[1] 

pygame.init() 

screen_width = 850 
screen_height = 640 
screen = pygame.display.set_mode([screen_width,screen_height]) 

all_sprites_list = pygame.sprite.Group() 
block_list = pygame.sprite.Group() 
bullet_list = pygame.sprite.Group() 

for i in range(5): 

    block = Block(blue) 

    block.rect.x = random.randrange(screen_width) 
    block.rect.y = random.randrange(350) 

    block_list.add(block) 
    all_sprites_list.add(block) 

player = Player() 
all_sprites_list.add(player) 

done = False 

clock = pygame.time.Clock() 

score = 0 
player.rect.y = 370 

# -------- Main Program Loop ----------- 
while not done: 

    # --- Event Processing 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      done = True 

     elif event.type == pygame.MOUSEBUTTONDOWN: 

      bullet = Bullet(event.pos, [player.rect.x, player.rect.y]) 

      bullet.rect.x = player.rect.x 
      bullet.rect.y = player.rect.y 

      all_sprites_list.add(bullet) 
      bullet_list.add(bullet) 

     if event.type== pygame.KEYDOWN:  
      if event.key==K_a: 
        move_player_x=-4 
      elif event.key==K_d: 
        move_player_x=+4 
      elif event.key==K_w: 
        move_player_y=-4 
      elif event.key==K_s: 
        move_player_y=+4 

     if event.type== pygame.KEYUP: 
      if event.key==K_a: 
        move_player_x=0 
      elif event.key==K_d: 
        move_player_x=0 
      elif event.key==K_w: 
        move_player_y=0 
      elif event.key==K_s: 
        move_player_y=0 

    # --- Game logic 

    all_sprites_list.update() 

    player_x += move_player_x 
    player_y += move_player_y 

    block.rect.y += move_ali_y 
    block.rect.x += move_ali_x 

    for bullet in bullet_list: 

     block_hit_list = pygame.sprite.spritecollide(bullet, block_list, True) 

     for block in block_hit_list: 
      bullet_list.remove(bullet) 
      all_sprites_list.remove(bullet) 
      score += 1 
      print(score) 

     if bullet.rect.y < -10: 
      bullet_list.remove(bullet) 
      all_sprites_list.remove(bullet) 

    if player.rect.colliderect(block.rect): 
     health =- 35 

    mouse_x, mouse_y = pygame.mouse.get_pos() 
    mouse_x -= crosshair.get_width()/2 
    mouse_y -= crosshair.get_height()/2 
    screen.blit(background,(0,0)) 

    all_sprites_list.draw(screen) 

    screen.blit(crosshair,(mouse_x, mouse_y)) 
    pygame.display.flip() 
    pygame.display.update() 

    clock.tick(20) 

pygame.quit() 

Так глюк номер один: только один из боксеров движется, я не могу понять, почему это только один из них движется по направлению к игроку, все боксеры призваны двигайтесь к игроку, так как это надеется стать стрельцом из зомби.

Ошибка: В случайной точке коробка, которая перемещается, перестает двигаться во всех направлениях, но одна, поэтому давайте скажем, что это произойдет, когда поле находится в центре экрана, если игрок идет влево от ящик, ничего, но когда игрок движется вправо от игрока, он движется вправо, но только прямо не вверх или вниз, и эти швы случаются в точке soem каждый раз.

Ну вот это, надеюсь, вы можете помочь спасибо куч StackOverflow

+4

Пожалуйста перерыв вниз ваш код к минимальному примеру .. – Mailerdaimon

+0

Почему так много пустых строк? попробуйте использовать скрипт типа 'pep8.py', это поможет вам лучше писать код – Paco

+0

Подсказка: я вижу, что у вас нет учетной записи [gamedev.se] ... – brasofilo

ответ

0

Ваш код должен выглядеть следующим образом:

import pygame 
from pygame import * 

import sys 
import math 
import random 
import cmath 

#---------------------------------------------------------------------- 

BLACK = (0, 0, 0) 
WHITE = (255, 255, 255) 
RED = (255, 0, 0) 
BLUE = (0, 0, 255) 

#imagers 
IMAGE_GRASS  = "grass_shit.png" #grass image 
IMAGE_PLAYER  = "shithead.png" #player name 
IMAGE_ALI   = "shit_head2.png" #alien image 
IMAGE_DEAD_SCREEN = "dead_shit.png" 
IMAGE_CROSSHAIR = "crosshair.png" 
IMAGE_PLAYBUTTON = "playbutton.png" 
#~ IMAGE_GRASS  = "ball3.png" #grass image 
#~ IMAGE_PLAYER  = "ball2.png" #player name 
#~ IMAGE_ALI   = "ball3.png" #alien image 
#~ IMAGE_DEAD_SCREEN = "ball3.png" 
#~ IMAGE_CROSSHAIR = "ball1.png" 
#~ IMAGE_PLAYBUTTON = "ball3.png" 

#---------------------------------------------------------------------- 

class Block(pygame.sprite.Sprite): 

    def __init__(self, color, x, y, player = None): 

     pygame.sprite.Sprite.__init__(self) 

     self.player = player 

     self.image = pygame.Surface([20, 15]) 
     self.image.fill(color) 
     self.rect = self.image.get_rect() 
     self.rect.x = x 
     self.rect.y = y 

     self.move_x = self.move_y = 0 

    def update(self): 

     if self.player: 
      player_x, player_y = self.player.rect.center 

      if self.rect.x < player_x: 
       self.rect.x += 1 
      elif self.rect.x > player_x: 
       self.rect.x -= 1 

      if self.rect.y < player_y: 
       self.rect.y += 1 
      elif self.rect.y > player_y: 
       self.rect.y -= 1 

#---------------------------------------------------------------------- 

class Player(pygame.sprite.Sprite): 

    def __init__(self, screen_rect, x=0, y=0): 

     pygame.sprite.Sprite.__init__(self) 

     self.image = pygame.Surface([20,20]) 
     self.image.fill(RED) 

     self.rect = self.image.get_rect() 
     self.rect.x = x 
     self.rect.y = y 

     self.min_x = screen_rect.left 
     self.min_y = screen_rect.top 
     self.max_x = screen_rect.right 
     self.max_y = screen_rect.bottom 

     self.move_x = self.move_y = 0 

     self.health = 100 

    def update(self): 

     pos = pygame.mouse.get_pos() 

     self.rect.x += self.move_x 
     self.rect.y += self.move_y 

     if self.rect.top < self.min_x: 
      self.rect.top = self.min_x 
     elif self.rect.bottom > self.max_y: 
      self.rect.bottom = self.max_y 

     if self.rect.left < self.min_x: 
      self.rect.left = self.min_x 
     elif self.rect.right > self.max_x: 
      self.rect.right = self.max_x 

    def event_handler(self, event): 

     if event.type == pygame.KEYDOWN:  
      if event.key == pygame.K_a: 
       self.move_x = -4 
      elif event.key == pygame.K_d: 
       self.move_x = +4 
      elif event.key == pygame.K_w: 
       self.move_y = -4 
      elif event.key == pygame.K_s: 
       self.move_y = +4 

     if event.type == pygame.KEYUP: 
      if event.key in (pygame.K_a, pygame.K_d): 
       self.move_x = 0 
      elif event.key in (pygame.K_w, pygame.K_s): 
       self.move_y = 0 

#---------------------------------------------------------------------- 

class Bullet(pygame.sprite.Sprite): 

    def __init__(self, start_pos, mouse_pos): 

     pygame.sprite.Sprite.__init__(self) 

     self.start_rect = start_pos.rect.copy() 
     self.mouse_x, self.mouse_y = mouse_pos # mouse[0], mouse[1] 

     self.image = pygame.Surface([5, 5]) 
     self.image.fill(BLACK)  
     self.rect = self.image.get_rect() 
     self.rect.centerx = self.start_rect.centerx 
     self.rect.centery = self.start_rect.centery 

     self.speed = 10 
     self.max_range = 50 
     self.current_range = 0 

     distance_x = self.mouse_x - self.start_rect.centerx 
     distance_y = self.mouse_y - self.start_rect.centery 

     norm = math.sqrt(distance_x ** 2 + distance_y ** 2) 
     direction_x = distance_x/norm 
     direction_y = distance_y/norm 

     self.bullet_vector_x = direction_x * self.speed 
     self.bullet_vector_y = direction_y * self.speed 

    def update(self): 

     self.current_range += 1 

     if self.current_range < self.max_range: 
      print self.start_rect.centerx + (self.bullet_vector_x*self.current_range), 
      print self.rect.centerx + self.bullet_vector_x, 

      #self.rect.centerx += self.bullet_vector_x 
      self.rect.centerx = self.start_rect.centerx + (self.bullet_vector_x*self.current_range) 

      print self.rect.centerx 

      #self.rect.centery += self.bullet_vector_y 
      self.rect.centery = self.start_rect.centery + (self.bullet_vector_y*self.current_range) 

     else: 
      self.kill() 

#---------------------------------------------------------------------- 

class Crosshair(pygame.sprite.Sprite): 

    def __init__(self): 

     pygame.sprite.Sprite.__init__(self) 

     self.image = pygame.image.load(IMAGE_CROSSHAIR).convert_alpha() 
     self.rect = self.image.get_rect() 

    def update(self): 

     mouse_x, mouse_y = pygame.mouse.get_pos() 

     self.rect.centerx = mouse_x 
     self.rect.centery = mouse_y 

    def draw(self, screen): 
     screen.blit(self.image,self.rect.topleft) 

#---------------------------------------------------------------------- 

class Background(pygame.sprite.Sprite): 

    def __init__(self): 

     pygame.sprite.Sprite.__init__(self) 

     self.image = pygame.image.load(IMAGE_GRASS).convert_alpha() 
     self.rect = self.image.get_rect() 

    def draw(self, screen): 
     screen.fill((128,128,128)) 
     screen.blit(self.image,(0,0)) 

#---------------------------------------------------------------------- 

class Game(): 

    def __init__(self): 

     pygame.init() 

     screen_width = 850 
     screen_height = 640 

     self.screen = pygame.display.set_mode((screen_width,screen_height)) 

     pygame.mouse.set_visible(False) 

     #----- 

     self.all_sprites_list = pygame.sprite.Group() 
     self.block_list = pygame.sprite.Group() 
     self.bullet_list = pygame.sprite.Group() 

     # --- create sprites --- 

     self.background = Background() 

     self.player = Player(self.screen.get_rect(), 0, 370) 
     self.all_sprites_list.add(self.player) 

     for i in range(5): 

      block = Block(BLUE, random.randrange(100, screen_width), random.randrange(10, screen_height-10), self.player) 

      self.block_list.add(block) 
      self.all_sprites_list.add(block) 


     self.crosshair = Crosshair() 

     #----- 

     font = pygame.font.SysFont("", 72) 
     self.text_pause = font.render("PAUSE", -1, RED) 
     self.text_pause_rect = self.text_pause.get_rect(center=self.screen.get_rect().center) # center text 

     #----- 

     self.score = 0 


    def bullet_create(self, start_pos, mouse_pos): 
     bullet = Bullet(start_pos, mouse_pos) 

     self.all_sprites_list.add(bullet) 
     self.bullet_list.add(bullet) 

    def bullets_update(self): 

     for bullet in self.bullet_list: 

      block_hit_list = pygame.sprite.spritecollide(bullet, self.block_list, True) 

      for block in block_hit_list: 
       self.bullet_list.remove(bullet) 
       self.all_sprites_list.remove(bullet) 
       self.score += 1 
       print self.score 

       if bullet.rect.y < -10: 
        self.bullet_list.remove(bullet) 
        self.all_sprites_list.remove(bullet) 

       if pygame.sprite.collide_rect(self.player, block): 
        self.player.health =- 35 

    # -------- Main Program Loop ----------- 

    def run(self): 

     clock = pygame.time.Clock() 

     RUNNING = True 
     PAUSED = False 

     while RUNNING: 

      # --- events --- 

      for event in pygame.event.get(): 

       if event.type == pygame.QUIT: 
        RUNNING = False 

       elif event.type == pygame.KEYDOWN: 
        if event.key == pygame.K_ESCAPE: 
         RUNNING = false 
        elif event.key == pygame.K_SPACE: 
         PAUSED = not PAUSED 

       elif event.type == pygame.MOUSEBUTTONDOWN: 
        self.bullet_create(self.player, event.pos) 

       # send event to player 
       self.player.event_handler(event) 

       # send event to crosshair for mousebuttondown 
       #if not PAUSED: 
       # self.crosshair.event_handler(event) 

      # --- updates --- 

      if not PAUSED: 
       self.all_sprites_list.update() 
       self.bullets_update() 

      self.crosshair.update() 

      # --- draws --- 

      self.background.draw(self.screen) 

      self.all_sprites_list.draw(self.screen) 

      self.crosshair.draw(self.screen) 

      if PAUSED: 
       self.screen.blit(self.text_pause, self.text_pause_rect.topleft) 

      pygame.display.update() # use flip() OR update() 

      # --- FPS --- 

      clock.tick(20) 

     # --- quit --- 

     pygame.quit() 

#---------------------------------------------------------------------- 

Game().run() 

Изменения:

  • игрок может двигаться, но может оставить экран
  • нажмите space, чтобы приостановить игру - но вы все равно можете перемещать курсор и огонь :)
  • пули имеет максимальный диапазон - чем он удаляется
  • я изменить пулевые расчеты VETOR потому что значение было округлен до целого числа каждого кадра и пули траектории была неправильным
  • пули неизменяемой траектории, когда игрок двигается
  • всего код находится в классы, за исключением некоторых постоянных значений. Добавить класс Crosshair и фон
  • вы можете увидеть, как класс (Player) обрабатывать события в event_handle
  • Я использую pygame.Rect() (screen.get_rect(), image.get_rect()), чтобы получить rect.top, rect.left, rect.center, rect.centerx, rect.topleft и т. д.

Есть еще много вещей, чтобы сделать.

пс. если кто-то нуждается образов 'ball1.png', 'ball2.png', 'ball3.png', чтобы запустить этот пример, вы можете найти его в ответ на

+0

Вау, это должно занять некоторое время, спасибо – user2975896

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