Pygame似乎“避免"了.环形

编程入门 行业动态 更新时间:2024-10-23 10:32:08
本文介绍了Pygame似乎“避免"了.环形的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我刚开始使用Pygame,目前正在尝试一些基本的移动功能.

I am just getting started with Pygame and I am currently trying out some basic movement functions.

尝试将运动条件编码到对象类而不是游戏循环中时遇到问题.

I ran into a problem when trying to code my movement conditions into my object class rather than in the game loop.

我的第一次尝试如下:

classes.py:

classes.py:

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

main.py:

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 = [] 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 == KEYDOWN: if event.key == K_DOWN: for o in objects: screen.blit(background, o.pos, o.pos) #erases players by bliting bg for o in objects: o.speed = 4 o.move_south() #moves player o.speed = 0 screen.blit(o.image, o.pos) #draws player if event.key == K_RIGHT: for o in objects: screen.blit(background, o.pos, o.pos) #erases players by bliting bg for o in objects: o.speed = 4 o.move_east() #moves player o.speed = 0 screen.blit(o.image, o.pos) #draws player pygame.display.update() pygame.time.delay(50)

我第二次失败的尝试是dp:

My second attempt which didn't work was to dp:

classes.py:

classes.py:

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): for event in pygame.event.get(): if event.type == KEYDOWN: if event.key == K_DOWN: screen.blit(background, self.pos, self.pos) #erases players by bliting bg self.speed = 4 self.move_south() #moves player self.speed = 0 if event.key == K_RIGHT: screen.blit(background, self.pos, self.pos) #erases players by bliting bg self.speed = 4 self.move_east() #moves player self.speed = 0 screen.blit(self.image, self.pos) #draws player

main.py:

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 = [] 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() for o in objects: o.move() pygame.display.update() pygame.time.delay(50)

因此,似乎代码很难解决实例中的事件循环.我之所以想将运动编码为一种方法而不是直接输入main,是为了节省空间并使以后添加字符更容易.

So it seems that the code struggles to go and check the event loop from the instance. The reason I wanted to code the movement as a method rather than straight in main was to save space and make it easier to add characters later on.

推荐答案

您的代码具有竞争条件(要真正宽松地使用该术语).

Your code has a race condition (to use the term really loosely).

字符不动的原因是,第一个pygame.event.get调用(当您检查QUIT事件时)占用了队列中的所有KEYDOWN事件.然后(除非您在第一个循环运行时设法按一个键),当第一个GameObject检查事件时,队列中没有KEYDOWN事件. Diddo用于所有其他GameObjects.

The reason that your characters are not moving is that the first pygame.event.get call (when you are checking for a QUIT event) consumes all the KEYDOWN events that are on the queue. Then (unless you manage to press a key while the first loop is running), there are no KEYDOWN events in the queue when the first GameObject checks for events. Diddo for all other GameObjects.

您需要在一个循环中处理所有pygame事件.示例代码:

You need to handler all pygame events in one loop. Example code:

class GameObject(): #rest of class def move(self,event): if event.key == K_DOWN: screen.blit(background, self.pos, self.pos) #erases players by bliting bg self.speed = 4 self.move_south() #moves player self.speed = 0 #repeat for all other directions screen.blit(self.image, self.pos) #draws player #initialize objects while True: for event in pygame.event.get(): if event.type == QUIT: #handle quit event elif event.type == KEYDOWN: for o in objects: o.move(event) #do non-eventhandling tasks.

更多推荐

Pygame似乎“避免"了.环形

本文发布于:2023-11-24 08:58:36,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1624561.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:环形   Pygame   quot

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!