Reputation: 13
I'm trying to write my game, based on material, that I've learned from the "Python crash course" book. Now I'm trying to make my ship shooting bullets. The code isn't ready yet, but when I've been testing it, I meet an error: name 'screen' is not defined
.
Could someone look at my code and tell me, what I'm doing wrong and give some tips on how to solve it?
Here is the traceback that I get:
Traceback (most recent call last):
File "/media/philip/9074-45DF/Python/rocket/rocket.py", line 139, in <module>
bullet_settings = Bullet(rocket_settings, screen, rocket)
NameError: name 'screen' is not defined
Here is my code:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import pygame
import sys
from pygame.sprite import Sprite
class Settings:
"""A class to store all settings for Rocket."""
def __init__(self):
"""Initialize the game screen settings."""
# Screen settings.
self.screen_width = 900
self.screen_height = 700
self.bg_color = (21, 36, 110)
class Rocket:
"""A class that describes rocket."""
def __init__(self, screen):
"""Initialize rocket and its starting position."""
self.screen = screen
# Load the rocket image and get its rect.
self.image = \
pygame.image.load('/media/philip/9074-45DF/Python/rocket/images/rocket.png'
)
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
# set starting position of a rocket.
self.rect.centerx = self.screen_rect.centerx
self.rect.centery = self.screen_rect.centery
# movement flag.
self.moving_right = False
self.moving_left = False
self.moving_up = False
self.moving_down = False
self.rotate_left = False
self.rotate_right = False
self.rocket_angle = 0
def update(self):
"""Update the rocket position based on the movement flag."""
if self.moving_right and self.rect.right \
< self.screen_rect.right:
self.rect.centerx += 2
if self.moving_left and self.rect.left > 0:
self.rect.centerx -= 2
if self.moving_up and self.rect.top > 0:
self.rect.centery -= 2
if self.moving_down and self.rect.bottom \
< self.screen_rect.bottom:
self.rect.centery += 2
def rotated_center(self, image, rocket_angle):
"""Rotating rocket around its axis."""
self.rotated_image = pygame.transform.rotate(self.image,
self.rocket_angle)
self.new_rect = \
self.rotated_image.get_rect(center=self.rect.center)
return (self.rotated_image, self.new_rect)
def blit_rocket(self, rect, rocket_angle):
"""Draw the rocket at its current location."""
if self.rotate_left:
self.rocket_angle = (self.rocket_angle + 1) % 360
self.screen.blit(self.rotated_image, self.new_rect)
else:
self.rocket_angle = (self.rocket_angle + 0) % 360
self.screen.blit(self.rotated_image, self.new_rect)
if self.rotate_right:
self.rocket_angle = (self.rocket_angle - 1) % 360
self.screen.blit(self.rotated_image, self.new_rect)
else:
self.rocket_angle = (self.rocket_angle + 0) % 360
self.screen.blit(self.rotated_image, self.new_rect)
def check_events(self, event):
"""Respond to a key events."""
# Responses to the keydown events.
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_RIGHT:
self.moving_right = True
if event.key == pygame.K_LEFT:
self.moving_left = True
if event.key == pygame.K_DOWN:
self.moving_down = True
if event.key == pygame.K_UP:
self.moving_up = True
if event.key == pygame.K_LSHIFT:
self.rotate_left = True
if event.key == pygame.K_RSHIFT:
self.rotate_right = True
# Responses to the keyup events.
if event.type == pygame.KEYUP:
if event.key == pygame.K_RIGHT:
self.moving_right = False
if event.key == pygame.K_LEFT:
self.moving_left = False
if event.key == pygame.K_DOWN:
self.moving_down = False
if event.key == pygame.K_UP:
self.moving_up = False
if event.key == pygame.K_LSHIFT:
self.rotate_left = False
if event.key == pygame.K_RSHIFT:
self.rotate_right = False
class Bullet(Sprite):
"""A class that stores bullet settings and manages bullets"""
def __init__(
self,
rocket_settings,
screen,
rocket,
):
"""Create a bullet object at the ship's current position."""
super(Bullet, self).__init__()
self.screen = screen
# Bullet settings.
self.bullet_width = 3
self.bullet_height = 5
self.bullet_color = (255, 204, 0)
self.bullets_allowed = 3
self.bullet_speed = 1
# Create a bullet object at the ship's current position.
self.rect = pygame.Rect(0, 0, bullet_settings.bullet_width,
bullet_settings.bullet_height)
self.rect.centerx = rocket.rect.top
self.color = bullet_settings.bullet_color
self.bullet_speed_factor = bullet_settings.bullet_speed
def update(self):
"""Moving bullet up the screen"""
# Update the bullet position.
self.y -= self.bullet_speed_factor
# Update the rect position.
self.rect.y = self.y
pygame.init()
rocket_settings = Settings()
bullet_settings = Bullet(rocket_settings, screen, rocket)
icon = \
pygame.image.load('/media/philip/9074-45DF/Python/rocket/images/rocket_icon.png'
)
pygame.display.set_icon(icon)
screen = pygame.display.set_mode((rocket_settings.screen_width,
rocket_settings.screen_height))
pygame.display.set_caption('Rocket')
rocket = Rocket(screen)
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
rocket.check_events(event)
screen.fill(rocket_settings.bg_color)
rocket.update()
rocket.rotated_center(rocket.image, rocket.rocket_angle)
rocket.blit_rocket(rocket.rect, rocket.rocket_angle)
pygame.display.flip()
Upvotes: 0
Views: 1249
Reputation:
The screen
variable has not been defined at runtime, so moving screen
's definition above bullet_settings
would work.
...
pygame.init()
pygame.display.set_icon(icon)
screen = pygame.display.set_mode((rocket_settings.screen_width, rocket_settings.screen_height))
pygame.display.set_caption("Rocket")
rocket = Rocket(screen)
rocket_settings = Settings()
bullet_settings = Bullet(rocket_settings, screen, rocket)
icon = pygame.image.load('/media/philip/9074-45DF/Python/rocket/images/rocket_icon.png')
...
Upvotes: 1