0

まったくの初心者で、プログラミング全般に不慣れです。pygame を使用して、Python でサイド スクローラー ゲームを作成しようとしています。プレイヤー、敵、土地のスプライト クラス用に 3 つの異なるライブラリを作成しました。プレイヤーが土地クラスのさまざまなオブジェクトと相互作用 (衝突) し、それらを通り抜けることができないように、土地をスプライトにしました。私が抱えている問題は、敵のスプライトが土地のスプライトとも相互作用するようにしたいということです。理想的には、敵のスプライトをポイント "x" から開始し、ランド スプライトと接触するまで動き (-2) を設定し、その時点で方向を反転させたいと考えています。私は考えられるすべてのことを試してきましたが、オンラインでこれを機能させるための解決策を探していましたが、成功しませんでした。それは本当に単純なはずですが、私はそれを機能させることができません。

お時間をいただきありがとうございます。

ここに私のコードがあります:

ランドスプライト :

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()
4

1 に答える 1