我正在尝试建立一种运动系统,使玩家朝点击位置移动。但是我一直在遇到与移动方法的参数有关的问题。
目前,移动方法需要将所有变量用作参数:
此代码有效:
def move(self,event,mouse_pos, screen, background):
if event.type == MOUSEBUTTONDOWN:
if mouse_pos[1] > self.pos[1]:
screen.blit(background, self.pos, self.pos) #erases players by bliting bg
self.speed = 1
self.move_south() #moves player
if mouse_pos[0] > self.pos[0]:
screen.blit(background, self.pos, self.pos) #erases players by bliting bg
self.speed = 1
self.move_east() #moves player
screen.blit(self.image, self.pos) #draws player
此代码不起作用:
def move(self,event):
if event.type == MOUSEBUTTONDOWN:
if mouse_pos[1] > self.pos[1]:
screen.blit(background, self.pos, self.pos) #erases players by bliting bg
self.speed = 1
self.move_south() #moves player
if mouse_pos[0] > self.pos[0]:
screen.blit(background, self.pos, self.pos) #erases players by bliting bg
self.speed = 1
self.move_east() #moves player
screen.blit(self.image, self.pos) #draws player
完整的课程代码:
import pygame, sys
from pygame.locals import *
class GameObject:
def __init__(self, image, height, speed):
self.speed = speed
self.image = image
self.pos = image.get_rect().move(0, height) #initial placement
def move_south(self):
self.pos = self.pos.move(0, self.speed)
if self.pos.right > 600:
self.pos.left = 0
def move_east(self):
self.pos = self.pos.move(self.speed , 0)
if self.pos.right > 600:
self.pos.left = 0
def move(self,event,mouse_pos, screen, background):
if event.type == MOUSEBUTTONDOWN:
if mouse_pos[1] > self.pos[1]:
screen.blit(background, self.pos, self.pos) #erases players by bliting bg
self.speed = 1
self.move_south() #moves player
if mouse_pos[0] > self.pos[0]:
screen.blit(background, self.pos, self.pos) #erases players by bliting bg
self.speed = 1
self.move_east() #moves player
screen.blit(self.image, self.pos) #draws player
主脚本代码:
import pygame, sys
from pygame.locals import *
from classes import *
screen = pygame.display.set_mode((640, 480))
#Importing Chars
player = pygame.image.load('green_hunter_small.png').convert()
#player.set_alpha(100) #makes whole player transparent
player.set_colorkey((0,0,0)) #sets background colour to transparent
ennemi = pygame.image.load('red_hunter_small.png').convert()
ennemi.set_colorkey((0,0,0))
background = pygame.image.load('grass_map_640x640.png').convert()
screen.blit(background, (0, 0))
objects = []
mouse_pos = (320, 240)
objects.append(GameObject(player, 80, 0))
for x in range(2): #create 2 objects
o = GameObject(ennemi, x*40, 0)
objects.append(o)
while True:
for event in pygame.event.get(): #setting up quit
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == MOUSEBUTTONDOWN :
mouse_pos = pygame.mouse.get_pos()
print mouse_pos
for o in objects:
screen.blit(background, o.pos, o.pos) #erases players by bliting bg
for o in objects:
o.move(event,mouse_pos,screen,background)
pygame.display.update()
pygame.time.delay(100)
我有两个问题:1)如何减少方法的参数数量?2)如何让播放器持续朝点击位置移动,而不是每次点击都一次?
您的问题是python中的“全局”变量实际上不是全局变量,而是在定义它们的模块所在的局部变量。因此,您无法引用main.py
文件中classes.py
文件中标出的全局变量。
有三种可能的解决方案:
(不推荐)移动的声明screen
,并background
在classes.py
文件中,这将使他们似乎格格不入。
(也不建议)将a添加from main import screen, background
到classes.py
文件中,这会产生循环导入问题,从而迫使main.py
模块from classes import *
在定义screen
和background
display.py
或screen.py
文件,其中定义了screen
和background
变量,并从main.py
和导入classes.py
该mouse_pos
变量完全没有必要并且被滥用:
pygame.mouse.get_pos()
直接在classes.py
文件中使用,但是pygame.mouse.get_pos()
本身是多余的,因为pygame.MOUSEBUTTONDOWN
事件具有pos
触发事件时鼠标位置的属性。本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句