Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 6 days ago.
Improve this question
`So I was making the Alien Invasion Game form Crash Course Python by Eric Matthews. However, when I completed the Alien Invaion.py, the Ship.py, and the Settings.py, I only got a black screen.
I expected a picture of the ship at the bottom middle of the screen with a grayish background. However, it was all black.
Here is the codes:
Alien Invasion.py:
import sys
import pygame
class AlienInvasion:
"""Overall class to manage game assets and behavior."""
def __init__(self):
"""Initialize the game, and create game resources."""
pygame.init()
self.screen = pygame.display.set_mode((1200, 800))
pygame.display.set_caption("Alien Invasion")
def run_game(self):
"""Start the main loop for the game."""
while True:
# Watch for keyboard and mouse events.
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# Make the most recently drawn screen visible.
pygame.display.flip()
if __name__ == '__main__':
# Make a game instance, and run the game.
ai = AlienInvasion()
ai.run_game()
def __init__(self):
pygame.display.set_caption("Alien Invasion")
# Set the background color.
self.bg_color = (230, 230, 230)
def run_game(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# Redraw the screen during each pass through the loop.
self.screen.fill(self.bg_color)
# Make the most recently drawn screen visible.
pygame.display.flip()
import pygame
from Settings import Settings
class AlienInvasion:
"""Overall class to manage game assets and behavior."""
def __init__(self):
"""Initialize the game, and create game resources."""
pygame.init()
self.settings = Settings()
self.screen = pygame.display.set_mode(
(self.settings.screen_width, self.settings.screen_height))
pygame.display.set_caption("Alien Invasion")
def run_game(self):
# Redraw the screen during each pass through the loop.
self.screen.fill(self.settings.bg_color)
# Make the most recently drawn screen visible.
pygame.display.flip()
from Settings import Settings
from Ship import Ship
class AlienInvasion:
"""Overall class to manage game assets and behavior."""
def __init__(self):
pygame.display.set_caption("Alien Invasion")
self.ship = Ship(self)
def run_game(self):
#Redraw the screen during each pass throught the loop.
self.screen.fill(self.settings.bg_color)
self.ship.blitme()
#Make the most recently drawn screen visible
pygame.display.flip()
Ship.py:
import pygame
class Ship:
"""A class to manage the ship"""
def __init__(self, ai_game):
"""Initialize the ship and its starting postion"""
self.screen = ai_game.screen
self.screen_rect = ai_game.screen.get_rect()
#Load the ship image and get its rect.
self.image = pygame.image.load('images/ship.bmp')
self.rect = self.image.get_rect()
#Start each new ship at the bottom center of the screen.
self.rect.midbottom = self.screen_rect.midbottom
def blitme(self):
"""Draw the ship at its current location"""
self.screen.blit(self.image, self.rect)
Settings.py
class Settings:
"""A class to store all settings for Alien Invasion."""
def __init__(self):
"""Initialize the game's static settings."""
# Screen settings.
self.screen_width = 1100
self.screen_height = 700
self.bg_color = (230, 230, 230)`
Related
I'm new to coding and just started reading "Python Crash Course" around a month back. While working on one of the projects, I encountered this error: AttributeError: 'AlienInvasion' object has no attribute 'blit'
Code:
main:
import sys
import pygame
from settings import Settings
from ship import Ship
class AlienInvasion:
'''overall class to manage game behavior'''
def __init__(self):
'''initialize pygame'''
pygame.init()
self.settings = Settings()
self.screen = pygame.display.set_mode(
(self.settings.screen_width, self.settings.screen_height))
pygame.display.set_caption("Alien Invasion")
self.ship = Ship(self)
# bg color
self.bg_color = (230, 230, 230)
def run_game(self):
'''main loop'''
while True:
# watch for keyboard and mouse events
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
# draw screen
self.screen.fill(self.settings.bg_color)
self.ship.blitme()
# make most recent screen visible
pygame.display.flip()
if __name__ == '__main__':
# make an instance of game
ai = AlienInvasion()
ai.run_game()
ship:
import pygame
class Ship:
'''class to manage ship'''
def __init__(self, ai_game):
'''initialize ship and start pos'''
self.screen = ai_game
self.screen_rect = ai_game.screen.get_rect()
# load ship
self.image = pygame.image.load('images/ship.bmp')
self.rect = self.image.get_rect()
# start each new ship
self.rect.midbottom = self.screen_rect.midbottom
def blitme(self):
'''draw a ship at current location'''
self.screen.blit(self.image, self.rect)
full error msg:
Traceback (most recent call last):
File "C:\Users\richh\PycharmProjects\pythonProject\alien_shooter\main.py", line 39, in <module>
ai.run_game()
File "C:\Users\richh\PycharmProjects\pythonProject\alien_shooter\main.py", line 32, in run_game
self.ship.blitme()
File "C:\Users\richh\PycharmProjects\pythonProject\alien_shooter\ship.py", line 18, in blitme
self.screen.blit(self.image, self.rect)
AttributeError: 'AlienInvasion' object has no attribute 'blit'
The problem is that you are confused over whether you are sending the entier AlienInvasion instance to Ship, or just the pygame screen. There are two ways to clear that up. Instead of this:
import pygame
class Ship:
'''class to manage ship'''
def __init__(self, ai_game):
'''initialize ship and start pos'''
self.screen = ai_game
self.screen_rect = ai_game.screen.get_rect()
just save the screen item:
self.screen = ai_game.screen
self.screen_rect = ai_game.screen.get_rect()
A better way would be just to pass the pygame instance, instead of the whole AlienInvasion instance. So, in AlienInvasion, change this:
self.ship = Ship(self)
to this:
self.ship = Ship(self.screen)
Then in Ship, change the last line of this:
def __init__(self, ai_game):
'''initialize ship and start pos'''
self.screen = ai_game
self.screen_rect = ai_game.screen.get_rect()
to this:
self.screen_rect = ai_game.get_rect()
In the file ship.py, in the line:
self.screen = ai_game
It's supposed to be:
self.screen = ai_game.screen
Doing this would make the attribute screen in Ship to be equal to the attribute screen in your main. Only then you could pass in the values of screen in main to your blit function.
I'm getting a bit confused here, I'm making the alien game from pygame tutorial.
I've been making the bullets and I don't understand. In the bullet's __init__, it calls ai_game as the second arg, but how does it know to reference the AlienInvasion class? I don't create a variable anywhere called ai_game. and I don't have to say ai_game = AlienInvasion in the __init__.
class Bullet(Sprite):
"""A class to manage bullets fired from the ship"""
def __init__(self, ai_game):
"""Create a bullet object at the ship's current position."""
super().__init__()
self.screen = ai_game.screen
self.settings = ai_game.settings
self.color=self.settings.bullet_color
# Create a bullet rect at (0, 0) and then set correct position.
self.rect = pygame.Rect(0,0, self.settings.bullet_width, self.settings.bullet_height)
self.rect.midtop = ai_game.ship.rect.midtop
# Store the bullet's position as a decimal value.
self.y = float(self.rect.y)
class AlienInvasion:
"""Overall class to manage game assets and behavior."""
def __init__(self):
"""Initialize the game, and create game resources."""
pygame.init()
self.settings = Settings()
self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))
pygame.display.set_caption("Alien Invasion")
self.ship = Ship(self)
#set the background color.
self.bg_color = (230, 230, 230)
def run_game(self):
"""Start the main loop for the game."""
while True:
self._check_events()
self._update_screen()
self.ship.update()
# redraw the screen during each pass through the loop.
I just get the general "finished with exit code 0" Not sure why its not printing the screen anymore. What would cause this?
If anyone has any input as to why this would be, i'd very much appreciate it so i can move forward & finish the project!
From what ive read, its hard to go on without knowing what actually is causing the "none-error"
import sys
import pygame
from settings import Settings
from ship import Ship
class Alieninvasion:
"""overall class to manage game assets & behaviors"""
def __init__(self):
"""initialize the game & create game resources"""
pygame.init()
self.settings = Settings()
self.screen = pygame.display.set_mode(
(self.settings.screen_width, self.settings.screen_height))
self.screen = pygame.display.set_mode((1000, 600)) # the self.screen portion makes it available in all methods in the class
pygame.display.set_caption("Alien Invasion!!!") # the self.settings & self.screen can possibly replace the
# screen & bg_color that doesn't include the settings syntax
self.ship = Ship(self)
# set the background color
self.bg_color = (230, 230, 230)
def run_game(self):
"""starting the main loop for the game"""
while True:
self._check_events()
self.update_screen()
# redraw the screen during each pass through the loop
self.screen.fill(self.bg_color)
self.screen.fill(self.settings.bg_color)
self.ship.blitme()
def _check_events(self):
"""responds to keypresses & mouse events"""
for event in pygame.event.get():
if event.type == pygame.QUIT():
sys.exit()
elif event.type == pygame.KEYDOWN:
if event.key ==pygame.K_RIGHT:
# move the ship to the right
self.ship.rect.x += 1
# makes the most recently drawn screen visible. Continually updates the display to show new game position elements and hide old ones.
pygame.display.flip()
def update_screen(self):
"""update images on the screen & flip to a new screen"""
self.screen.fill(self.settings.bg_color)
self.ship.blitme()
pygame.display.flip()
if __name__ == 'main':
# make a game instance and run the game.
ai = Alieninvasion()
ai.run_game()
"""the run_game as part of the if block ensures it only runs if the file is called directly"""
I am doing the Alien Invasion project in the Python Crash Course book. When I test the code to see if the ship comes on screen the screen starts then shuts down.
I have been looking through the code for hours now without finding out why.
The game:
import sys
import pygame
from settings import Settings
from ship import Ship
def run_game():
# Initialize pygame, settings, and screen object
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode(
(ai_settings.screen_width, ai_settings.screen_height))
pygame.display.set_caption("Alien Invasion")
# Make a ship
ship = Ship(screen)
# Set background color
bg_color = (230, 230, 230)
# Start the main loop for the game
while True:
# Watch for keyboard and mouse events
for event in pygame.event.get():
if event == pygame.quit():
sys.exit()
# Redraw the screen during each pass through the loop
screen.fill(ai_settings.bg_color)
ship.blitme()
# Make most recently drawn screen visible
pygame.display.flip()
run_game()
Settings:
class Settings():
def __init__(self):
"""Initialize the game's settings."""
# Screen settings
self.screen_width = 1200
self.screen_height = 800
self.bg_color = (230, 230, 230)
Ship:
import pygame
class Ship():
def __init__(self, screen):
self.screen = screen
# Load the ship image and get its rect.
self.image = pygame.image.load('images/ship.bmp')
self.rect = self.image.get_rect()
self.screen_rect = screen.get_rect()
# Start each new ship at the bottom center of the screen.
self.rect.centerx = self.screen_rect.centerx
self.rect.bottom = self.screen_rect.bottom
def blitme(self):
self.screen.blit(self.image, self.rect)
This is the error that comes up
"C:\Users\My Name\Desktop\Mapper\Python'\Scripts\python.exe" "C:/Users/My Name/Desktop/Mapper/Python/Projects/alien invasion/alien_invasion.py"
pygame 1.9.6
Hello from the pygame community. https://www.pygame.org/contribute.html
Traceback (most recent call last):
File "C:/Users/My Name/Desktop/Mapper/Python/Projects/alien invasion/alien_invasion.py", line 37, in <module>
run_game()
File "C:/Users/My Name/Desktop/Mapper/Python/Projects/alien invasion/alien_invasion.py", line 30, in run_game
screen.fill(ai_settings.bg_color)
pygame.error: display Surface quit
Process finished with exit code 1
The line
if event == pygame.quit():
doesn't do what you expect it to do. pygame.quit() is a function and it uninitialize all pygame modules. The function returns None and so the condition fails. The code runs through and crashes at the next instruction which tries to access a pygame module.
Change it to:
if event.type == pygame.QUIT:
The .type property of a pygame.event.Event object contains the event type identifier. pygame.QUIT is an enumerator constant which identifies the quit event. See the documentation of pygame.event.
I'm working on a Ping Pong game in Pygame. Having some trouble getting the paddles to display on screen within a class. I have a feeling either my constructor init method is incorrect (although not throwing up any errors) or the display colour is overwriting the paddles.
Here's my code.
Program.py
import sys
import pygame
from settings import Settings
from paddles import Paddles
import game_functions as gf
def run_game():
# Initialise pygame, settings and screen object.
pygame.init()
ai_settings = Settings()
screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))
pygame.display.set_caption('Ping Pong')
# Start the main loop for the game.
while True:
gf.check_events()
gf.update_screen(ai_settings,screen)
#Make paddles
paddles = Paddles(screen)
run_game()
paddles.py
import pygame
import sys
class Paddles():
def __init__(self, screen):
self.screen = screen
self.paddle_l = pygame.draw.rect(screen, (255, 255, 255), [15, 250, 10, 100])
self.paddle_r = pygame.draw.rect(screen, (255, 255, 255), [780, 250, 10, 100])
def paddles(self):
pass
settings.py
class Settings():
"""A class to store all settings for Ping Pong"""
def __init__(self):
"""Initialise the game's settings."""
# Screen settings
self.screen_width = 800
self.screen_height = 600
self.bg_colour = (0,0,0)
game_functions.py
import sys
import pygame
def check_events():
"""Respond to keypresses and mouse events."""
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
def update_screen(ai_settings, screen):
"""Update images on the screen and flip to the new screen."""
# Redraw the screen during each pass through the loop.
screen.fill(ai_settings.bg_colour)
pygame.display.flip()
Like I said I'm not getting any errors, the game window just opens to a black background. The code worked when I put it inside a normal function but not a class.
What am I doing wrong? How do I get the paddles to display?
Is there a reason you're setting paddles outside of the "main loop?"
Moving paddles into your update_screen method gets them showing, at the very least. However, this is newing up a new Paddles object each time update_screen is called.
def update_screen(ai_settings, screen):
"""Update images on the screen and flip to the new screen."""
# Redraw the screen during each pass through the loop.
screen.fill(ai_settings.bg_colour)
paddles = Paddles(screen)
pygame.display.flip()