gpt4 book ai didi

python - PyGame - 创建新图像后图像停止移动

转载 作者:太空宇宙 更新时间:2023-11-04 03:27:07 24 4
gpt4 key购买 nike

我有一个简单的 PyGame游戏取自网络,我正在做一些修改以学习游戏编程。

这是一个非常简单的游戏。关卡中显示一个字符(类 Player),如果您按 CTRL 一颗子弹(这是从 Bullet 类加载的图像)。项目符号只是占据角色的位置并增加它的 X轴(水平移动)直到永远。

例如,如果我按两次 CTRL ,第一颗子弹卡住,第二颗子弹继续移动,直到我再次按下 CTRL , 等等。

到目前为止,这是我的代码。我很抱歉发布了所有内容,但因为我是 PyGame 的新人我无法区分哪些代码可能与问题相关。

#! /usr/bin/python

import pygame
from pygame import *

#WIN_WIDTH = 800
#WIN_HEIGHT = 640
WIN_WIDTH = 400
WIN_HEIGHT = 340
HALF_WIDTH = int(WIN_WIDTH / 2)
HALF_HEIGHT = int(WIN_HEIGHT / 2)

DISPLAY = (WIN_WIDTH, WIN_HEIGHT)
DEPTH = 32
FLAGS = 0
CAMERA_SLACK = 30

def main():
global cameraX, cameraY
pygame.init()
screen = pygame.display.set_mode(DISPLAY, FLAGS, DEPTH)
pygame.display.set_caption("Use arrows to move!")
timer = pygame.time.Clock()

up = down = left = right = running = shoot = False
bg = Surface((32,32))
bg.convert()
bg.fill(Color("#000000"))
entities = pygame.sprite.Group()
player = Player(32, 32)
#bullet = Bullet(30,7)
platforms = []

x = y = 0
level = [
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",
"P P",
"P P",
"P P",
"P PP PPPPPPPPPPP P",
"P P",
"P P",
"P P",
"P PPPPPPPP P",
"P P",
"P PPPPPPP P",
"P PPPPPP P",
"P P",
"P PPPPPPP P",
"P P",
"P PPPPPP P",
"P P",
"P PPPPPPPPPPP P",
"P P",
"P PPPPPPPPPPP P",
"P P",
"P E",
"P E",
"P E",
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",]
# build the level
for row in level:
for col in row:
if col == "P":
p = Platform(x, y)
platforms.append(p)
entities.add(p)
if col == "E":
e = ExitBlock(x, y)
platforms.append(e)
entities.add(e)
x += 32
y += 32
x = 0

total_level_width = len(level[0])*32
total_level_height = len(level)*32
camera = Camera(complex_camera, total_level_width, total_level_height)
entities.add(player)

while 1:
timer.tick(60)

for e in pygame.event.get():
if e.type == QUIT: raise SystemExit, "QUIT"
if e.type == KEYDOWN and e.key == K_ESCAPE:
raise SystemExit, "ESCAPE"
if e.type == KEYDOWN and e.key == K_UP:
up = True
if e.type == KEYDOWN and e.key == K_DOWN:
down = True
if e.type == KEYDOWN and e.key == K_LEFT:
left = True
if e.type == KEYDOWN and e.key == K_RIGHT:
right = True
if e.type == KEYDOWN and e.key == K_SPACE:
running = True
if e.type == KEYDOWN and e.key == K_LCTRL:
shoot = True
player_pos = player.returnPlayerPos()
bullet = Bullet(player_pos[0]+50, player_pos[1]+30)
entities.add(bullet)

if e.type == KEYUP and e.key == K_UP:
up = False
if e.type == KEYUP and e.key == K_DOWN:
down = False
if e.type == KEYUP and e.key == K_RIGHT:
right = False
if e.type == KEYUP and e.key == K_LEFT:
left = False

# draw background
for y in range(32):
for x in range(32):
screen.blit(bg, (x * 32, y * 32))
camera.update(player)
#camera.update(bullet)

# update player, draw everything else
player.update(up, down, left, right, running, platforms)

# update bullet
if shoot == True:
bullet.update()

for e in entities:
screen.blit(e.image, camera.apply(e))
pygame.display.update()


class Camera(object):
def __init__(self, camera_func, width, height):
self.camera_func = camera_func
self.state = Rect(0, 0, width, height)

def apply(self, target):
return target.rect.move(self.state.topleft)

def update(self, target):
self.state = self.camera_func(self.state, target.rect)

def simple_camera(camera, target_rect):
l, t, _, _ = target_rect
_, _, w, h = camera
return Rect(-l+HALF_WIDTH, -t+HALF_HEIGHT, w, h)

def complex_camera(camera, target_rect):
l, t, _, _ = target_rect
_, _, w, h = camera
l, t, _, _ = -l+HALF_WIDTH, -t+HALF_HEIGHT, w, h

l = min(0, l) # stop scrolling at the left edge
l = max(-(camera.width-WIN_WIDTH), l) # stop scrolling at the right edge
t = max(-(camera.height-WIN_HEIGHT), t) # stop scrolling at the bottom
t = min(0, t) # stop scrolling at the top
return Rect(l, t, w, h)

class Entity(pygame.sprite.Sprite):
def __init__(self):
pygame.sprite.Sprite.__init__(self)

class Player(Entity):
def __init__(self, x, y):
Entity.__init__(self)
self.xvel = 0
self.yvel = 0
self.onGround = False
self.image = pygame.image.load('images/character.png') # @UndefinedVariable
self.rect = Rect(x, y, 75, 89)


def update(self, up, down, left, right, running, platforms):
if up:
# only jump if on the ground
if self.onGround: self.yvel -= 10
if down:
pass
if running:
self.xvel = 12
if left:
self.xvel = -8
if right:
self.xvel = 8
if not self.onGround:
# only accelerate with gravity if in the air
self.yvel += 0.3
# max falling speed
if self.yvel > 100: self.yvel = 100
if not(left or right):
self.xvel = 0
# increment in x direction
self.rect.left += self.xvel
# do x-axis collisions
self.collide(self.xvel, 0, platforms)
# increment in y direction
self.rect.top += self.yvel
# assuming we're in the air
self.onGround = False;
# do y-axis collisions
self.collide(0, self.yvel, platforms)

def returnPlayerPos(self):
m = []
m.append(self.rect[0])
m.append(self.rect[1])
return m

def collide(self, xvel, yvel, platforms):
for p in platforms:
if pygame.sprite.collide_rect(self, p):
if isinstance(p, ExitBlock):
pygame.event.post(pygame.event.Event(QUIT))
if xvel > 0:
self.rect.right = p.rect.left
print "collide right"
if xvel < 0:
self.rect.left = p.rect.right
print "collide left"
if yvel > 0:
self.rect.bottom = p.rect.top
self.onGround = True
self.yvel = 0
if yvel < 0:
self.rect.top = p.rect.bottom

class Bullet(Entity):
def __init__(self, x, y):
Entity.__init__(self)
self.image = pygame.image.load('images/bullet.png')
self.rect = Rect(x, y, 30, 7)

def update(self):
self.rect.right += 4


class Platform(Entity):
def __init__(self, x, y):
Entity.__init__(self)
self.image = Surface((32, 32))
self.image.convert()
self.image.fill(Color("#DDDDDD"))
self.rect = Rect(x, y, 32, 32)

def update(self):
pass

class ExitBlock(Platform):
def __init__(self, x, y):
Platform.__init__(self, x, y)
self.image.fill(Color("#0033FF"))

if __name__ == "__main__":
main()

所以我想知道是否有人可以帮助我并告诉我如何在我的游戏中发射无限子弹并同时保持所有水平移动,而不是只有一个.

提前致谢

最佳答案

问题出在第 101 和 124 行

bullet = Bullet(player_pos[0]+50, player_pos[1]+30)
entities.add(bullet)
...
# update bullet
if shoot == True:
bullet.update()

您将新项目符号添加到实体列表(第 102 行)。但是,当需要移动项目符号时(第 125 行),您只移动最近的一个(项目符号是最新的)。

您必须更新列表中的每个项目符号,直到它们移出屏幕。

我不会在这里进行完整的代码审查;我们为此设立了一个单独的小组。但是,请注意“== True”总是是多余的。在这里,只需说“如果拍摄:”

关于python - PyGame - 创建新图像后图像停止移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32612465/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com