这是这本书中的代码Beginning Python Games Development With PyGame:
import pygame
from pygame.locals import *
from sys import exit
from math import *
class Vector2:
def __init__(self, x=0, y=0):
self.x = x
self.y = y
if hasattr(x, "__getitem__"):
x, y = x
self._v = [float(x), float(y)]
else:
self._v = [float(x), float(y)]
def __getitem__(self, index):
return self._v[index]
def __setitem__(self, index, value):
self._v[index] = 1.0 * value
def __str__(self):
return "(%s, %s)"%(self.x, self.y)
def from_points(P1, P2):
return Vector2(P2[0] - P1[0], P2[1] - P1[1])
# return np.array(P2) - np.array(P1) # using numpy method
def get_magnitude(self):
return math.sqrt( self.x**2 + self.y**2 )
def normalize(self):
magnitude = self.get_magnitude()
try:
self.x /= magnitude
self.y /= magnitude
except ZeroDivisionError:
self.x = 0
self.y = 0
# rhs stands for Right Hand Side
def __add__(self, rhs):
return Vector2(self.x + rhs.x, self.y + rhs.y)
def __sub__(self, rhs):
return Vector2(self.x - rhs.x, self.y - rhs.y)
def __neg__(self):
return Vector2(-self.x, -self.y)
def __mul__(self, scalar):
return Vector2(self.x * scalar, self.y * scalar)
def __truediv__(self, scalar):
return Vector2(self.x / scalar, self.y / scalar)
background_image_filename = 'sushiplate.jpg'
sprite_image_filename = 'fugu.png'
pygame.init()
screen = pygame.display.set_mode((640, 480), 0, 32)
background = pygame.image.load(background_image_filename).convert()
sprite = pygame.image.load(sprite_image_filename).convert_alpha()
clock = pygame.time.Clock()
pygame.mouse.set_visible(False)
pygame.event.set_grab(True)
sprite_pos = Vector2(200, 150)
sprite_speed = 300.
sprite_rotation = 0.
sprite_rotation_speed = 360. # Degrees per second
while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
exit()
if event.type == KEYDOWN:
if event.key == K_ESCAPE:
pygame.quit()
exit()
pressed_keys = pygame.key.get_pressed()
pressed_mouse = pygame.mouse.get_pressed()
rotation_direction = 0.
movement_direction = 0.
rotation_direction = pygame.mouse.get_rel()[0] / 3.
if pressed_keys[K_LEFT]:
rotation_direction = +1.
if pressed_keys[K_RIGHT]:
rotation_direction = -1.
if pressed_keys[K_UP] or pressed_mouse[0]:
movement_direction = +1.
if pressed_keys[K_DOWN] or pressed_mouse[2]:
movement_direction = -1.
screen.blit(background, (0,0))
rotated_sprite = pygame.transform.rotate(sprite, sprite_rotation)
w, h = rotated_sprite.get_size()
sprite_draw_pos = Vector2(sprite_pos.x-w/2, sprite_pos.y-h/2)
screen.blit(rotated_sprite, (sprite_draw_pos.x, sprite_draw_pos.y))
time_passed = clock.tick()
time_passed_seconds = time_passed / 1000.0
sprite_rotation += rotation_direction * sprite_rotation_speed * time_passed_seconds
heading_x = sin(sprite_rotation*pi/180.)
heading_y = cos(sprite_rotation*pi/180.)
heading = Vector2(heading_x, heading_y)
heading *= movement_direction
sprite_pos+= heading * sprite_speed * time_passed_seconds
pygame.display.update()
这个脚本的问题是sprite
个CAN disappear从显示屏上.我试图通过在最后一行pygame.display.update()
的正上方添加以下代码来解决这个问题
if sprite_pos.x > screen.get_width() or sprite_pos.x < 0:
sprite_draw_pos.x = 0
if sprite_pos.y > screen.get_height() or sprite_pos.y < 0:
sprite_draw_pos.y = 0
然而,这个解决方案没有奏效,因为那sprite
个仍然消失了?有没有人能解释一下我做错了什么,告诉我如何实现这个目标?谢谢.