python外星人入侵不显示子弹_【Python】python外星人入侵,武装飞船,代码写好后,不显示子弹...

按照书上写的武装飞船,写到能够左右移动了,但到了射击(装子弹)时候,按照书上的代码照搬了,运行时没显示代码有问题,但就是按了空格键,不见有子弹,其他都正常。

代码:

alien_invasion.py

import sys

import pygame

from pygame.sprite import Group

from settings import Settings

from ship import Ship

import game_functions as gf

def run_game():

#初始化pygame、设置和屏幕对象

pygame.init()

ai_settings = Settings()

screen = pygame.display.set_mode(

(ai_settings.screen_width,ai_settings.screen_height))

pygame.display.set_caption("Alien Invasion")

#创建一艘飞船

ship = Ship(ai_settings,screen)

#创建一个用于存储子弹的编组

bullets = Group()

#开始游戏主循环

while True:

gf.check_events(ai_settings,screen,ship,bullets)

ship.update()

bullets.update()

gf.update_screen(ai_settings,screen,ship,bullets)

run_game()

**game_functions.py**

import sys

import pygame

from bullet import Bullet

def check_keydown_events(event,ai_settings,screen,ship,bullets):

"""响应按键"""

if event.key == pygame.K_RIGHT:

ship.moving_right = True

elif event.key == pygame.K_LEFT:

ship.moving_left = True

elif event.key == pygame.K_SPACE:

#创建一颗子弹,并将其加入到编组bullets中

new_bullet = Bullet(ai_settings,screen,ship)

bullets.add(new_bullet)

def check_keyup_events(event,ship):

"""响应松开"""

if event.key == pygame.K_RIGHT:

ship.moving_right = False

elif event.key == pygame.K_LEFT:

ship.moving_left = False

def check_events(ai_settings,screen,ship,bullets):

"""响应按键和鼠标事件"""

for event in pygame.event.get():

if event.type == pygame.QUIT:

sys.exit()

elif event.type == pygame.KEYDOWN:

check_keydown_events(event,ai_settings,screen,ship,bullets)

elif event.type == pygame.KEYUP:

check_keyup_events(event,ship)

def update_screen(ai_settings,screen,ship,bullets):

"""更新屏幕上的图像,并切换到新屏幕"""

#每次循环时都重绘屏幕

screen.fill(ai_settings.bg_color)

ship.blitme()

#让最近绘制的屏幕可见

pygame.display.flip()

#在飞船和外星人后面重绘所有子弹

for bullet in bullets.sprites():

bullet.draw_bullet()

**bullet.py**

import pygame

from pygame.sprite import Sprite

class Bullet(Sprite):

"""一个对飞船发射的子弹进行管理的类"""

def __init__(self,ai_settings,screen,ship):

"""在飞船所处的位置创建一个子弹对象"""

super(Bullet,self). __init__()

self.screen = screen

#在(0,0)处创建一个表示子弹的举行,再设置正确的位置

self.rect = pygame.Rect(0,0,ai_settings.bullet_width,

ai_settings.bullet_height)

self.rect.centerx = ship.rect.centerx

self.rect.top = ship.rect.top

#存储用小数表示的子弹位置

self.y = float(self.rect.y)

self.color = ai_settings.bullet_color

self.speed_factor = ai_settings.bullet_speed_factor

def update(self):

"""向上移动子弹"""

#更新表示子弹位置的小数值

self.y -= self.speed_factor

#更新表示子弹的rect的位置

self.rect.y = self.y

def draw_bullet(self):

"""在屏幕上绘制子弹"""

pygame.draw.rect(self.screen,self.color,self.rect)

settings.py

class Settings():

"""存储《外星人入侵》的所有设置的类"""

def __init__(self):

"""初始化游戏的设置"""

#屏幕设置

self.screen_width = 1200

self.screen_height = 800

self.bg_color = (230,230,230)

#飞船的设置

self.ship_speed_factor = 1.5

#子弹设置

self.bullet_speed_factor = 1

self.bullet_width = 3

self.bullet_height = 15

self.bullet_color = 60,60,60

ship.py

import pygame

class Ship():

def __init__(self,ai_settings,screen):

"""初始化飞船并设置其初始位置"""

self.screen = screen

self.ai_settings = ai_settings

#加载飞船图像并获取其外接矩形

self.image = pygame.image.load('images/ship.bmp')

self.rect = self.image.get_rect()

self.screen_rect = screen.get_rect()

#将每艘新飞船放在屏幕底部中央

self.rect.centerx = self.screen_rect.centerx

self.rect.bottom = self.screen_rect.bottom

#在飞船的属性center中存储小数值

self.center = float(self.rect.centerx)

#移动标志

self.moving_right = False

self.moving_left = False

def update(self):

"""根据移动标志调整飞船的位置"""

#更新飞船的center值,而不是rect

if self.moving_right and self.rect.right < self.screen_rect.right:

self.center += self.ai_settings.ship_speed_factor

if self.moving_left and self.rect.left > 0:

self.center -= self.ai_settings.ship_speed_factor

#根据self.center更新rect对象

self.rect.centerx = self.center

def blitme(self):

"""在指定位置绘制飞船"""

self.screen.blit(self.image,self.rect)

回答

game_function.py 中的子弹绘制要在显示在屏幕之前

如下:

#在飞船和外星人后面重绘所有子弹

for bullet in bullets.sprites():

bullet.draw_bullet()

ship.blitme()

#让最近绘制的屏幕可见

pygame.display.flip()

这样改一下

game_function.py

—-snip—-

def update_screen(ai_settings,screen,ship,bullets):

"""更新屏幕上的图像,并切换到新屏幕"""

#每次循环时都重绘屏幕

screen.fill(ai_settings.bg_color)

ship.blitme()

#在飞船和外星人后面重绘所有子弹

for bullet in bullets.sprites():

bullet.draw_bullet()

ship.blitime()

#让最近绘制的屏幕可见

pygame.display.flip()

我的也是 代码完全正确,甚至打开了编辑者写的代码,还是没有子弹

不请自来!

你的game_function.py呢?

功能模块也要添加进相关的设置,主程序才能调用出来,

主程序的

bullets.update()这里应该是会报错的

还有,函数里面的形参要和书本上的一致

耐心点抄下去,不要着急,

已找到问题原因,你应该是虚拟机中运行的,虚拟机中要按住ctrl+space,就可以有子弹了

请问题主解决问题了吗,我也遇到了同样的问题

我也是这个问题,子弹会出来,但是子弹不会动

谢谢大佬,我也是这个问题,照着书敲的,看了好久,看到了你的帖子问题才解决的 。谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529864.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python常见的异常类有哪些_Python常见异常类型

标签&#xff1a;常见 nic 警告 werror pytho 无效 本地变量 计算 pointBaseException     所有异常的基类SystemExit             解释器请求退出KeyboardInterrupt          用户中断执行(通常是输入^C)Exc…

mysql dos 下切换连接_如何在dos下连接进入mysql对数据库进行操作

一、&#xff1a;windowsR 进入命令命令提示符输入 net start mysql若出现系统错误&#xff0c;要将命令提示符以管理员身份运行若出现不是内部指令&#xff0c;进入下面环境变量设置界面&#xff0c;配置path路径1.进入系统查看界面&#xff0c;点击高级系统设置2&#xff0c…

mysql二级缓存redis_SpringBoot+Mybatis+redis(二级缓存)搭建

刚刚开始接触Spring Boot&#xff0c;因为极简单的配置开发&#xff0c;搭建一个通用的Spring BootMybaitisredis的开发框架。一、用maven构建项目&#xff0c;pom.xml文件如下&#xff1a;org.springframework.bootspring-boot-starter-parent1.5.1.RELEASEorg.springframewor…

mysql自定义两个条件排序_使用MySQL中的两个不同列进行自定义排序?

为此&#xff0c;将ORDER BY子句与CASE语句一起使用。让我们首先创建一个表-mysql> create table DemoTable1610-> (-> Marks int,-> Name varchar(20)-> ) ;使用插入命令在表中插入一些记录-mysql> insert into DemoTable1610 values(85,John);mysql> in…

java获取文件大小_Java中获取文件大小的详解及实例代码

Java 获取文件大小今天写代码时需要实现获取文件大小的功能&#xff0c;目前有两种实现方法&#xff0c;一种是使用File的length()方法&#xff1b;另外一种是使用FileInputStream的available()方法&#xff0c;当InputStream未进行read操作时&#xff0c;available()的大小应该…

java访问权限friendly_Java的访问权限

一&#xff0e;Java访问权限饰词(access specifiers)Java有public、protect、friendly、private四种访问权限&#xff0c;并且这四访问权限的访问范围越来越小。1&#xff0e; friendly1) 果一个class内的数据成员或方法没有任何权限饰词&#xff0c;那么它的缺省访问权限就是f…

java 0 255_java – 什么(float)(par4 16255)/ 255.0F;意思?

带alpha通道的RGB(通常称为RGBA或aRGB)是四个字节打包成一个整数.AAAAAAAARRRRRRRRBBBBBBBBGGGGGGGG // the original par4, each char represents one bit.// where ARBG stands for alpha, red, blue and green bit.shift和运算符用于检索每个字节.例如,par4>> 16&…

java ie下载文件名乱码问题_php中强制下载文件的代码(解决了IE下中文文件名乱码问题)...

中间遇到一个问题是提交的中文文件名直接放到header里在IE下会变成乱码&#xff0c;解决方法是将文件名先urlencode一下再放入header&#xff0c;如下。$file_name urlencode($_REQUEST[filename]);header("Pragma: public"); header("Expires: 0");heade…

java如何获得当前路径_在java中如何得到当前路径

归纳一些网上取java路径的方法&#xff1a;注明&#xff1a;如果从ANT启动程序&#xff0c;this.getClass().getResource("")取出来的比较怪&#xff0c;直接用JAVA命令行调试就可成功。得到classpath和当前类的绝对路径的一些方法获得CLASSPATH之外路径的方法&#…

java继承总结_JAVA笔记:Java中的继承总结

继承&#xff1a;在Java中使用extends关键字来实现类的继承 &#xff0c;extends意思就是派生&#xff0c;所以子类也叫派生类&#xff0c;继承的主要目的是扩展类的内容操作格式&#xff1a; class A{}; class B extends A{};子类B可以继承父类A中的公用方法&#xff0c;也可…

java正则表达式 类_java正则表达式相关类的使用

import java.util.regex.Matcher;import java.util.regex.Pattern;public class TestZhengZe {public static void main(String[] args) {//匹配数字Pattern mac Pattern.compile("-?(0|([1-9][0-9]*))(\\.[0-9])?");System.out.println(mac.matcher("101.00…

Java转置_Java实现单链表的逆转置

单链表逆转置的递归与非递归方式package link.reverse;// 定义一个单链表class Node {//变量private int record;//指向下一个对象private Node nextNode;public Node(int record) {this.record record;}public int getRecord() {return record;}public void setRecord(int re…

单利 java_Java设计模式-单利模式

单例模式作为对象的创建模式&#xff0c;单例模式确保其某一个类只有一个实例&#xff0c;而且自行实例化并向整个系统提供这个实例&#xff0c;这个类称为单例类。单例模式有以下特点&#xff1a;1、单例类只能有一个实例2、单例类必须自己创建自己的唯一实例3、单例类必须给其…

esp8266接7735_基于8266的ESPEASY固件接入HASS的教程(可无脑接入各类传感...

首先国际惯例&#xff0c;先放上成果:QQ图片20170629160143.png (172.48 KB, 下载次数: 3)2017-6-29 16:03 上传如上图所示&#xff0c;楼主把颗粒物传感器和二氧化碳传感器加入到了HASS里&#xff0c;当然&#xff0c;论坛之前也有诸位大神提供过类似固件和方法来实现这一目标…

java定义private_java9开始——接口中可以定义private私有方法

在传统的Java编程中&#xff0c;被广为人知的一个知识点是&#xff1a;java Interface接口中不能定义private私有方法。只允许我们定义public访问权限的方法、抽象方法或静态方法。但是从Java 9 开始&#xff0c;Interface 接口中允许定义私有方法和私有静态方法。下面我们就来…

java poi生成excel文件_java poi 导出Excel文件

1&#xff0c;导包 poi-3.9-XXX.JAR2, 创建一个实体对象public class Student implements Serializable {/****/private static final long serialVersionUID 1L;private int id;private String name;private int age;private Date borth;public Student(int id, String name…

java中捕获异常的作用_在Java中捕获通用异常?

您可以传递Class对象并以编程方式检查。public static void checkForException(String message,Class exceptionType, ExpectedExceptionBlock block) {try {block.exceptionThrowingCode();} catch (Exception ex) {if ( exceptionType.isInstance(ex) ) {return;} else {thro…

java如何循环调用方法_Java:调用方法的“中断”循环?

我的小程序有点问题。我有一个JOptionPane要求一个数字&#xff0c;如果该数字小于10&#xff0c;则一个循环会一直持续下去&#xff0c;并永远做下去&#xff0c;继续询问数字。 在该循环内&#xff0c;我调用一个方法&#xff0c;将int作为参数。 在该方法中&#xff0c;我需…

随机投点法计算定积分java_11 随机模拟积分 | 统计计算

11.4 高维定积分上面的两种计算一元函数定积分的方法可以很容易地推广到多元函数定积分&#xff0c;或称高维定积分。设\(d\)元函数\(h(x_1, x_2, \dots, x_d)\)定义于超矩形\[\begin{aligned}C \{(x_1, x_2, \ldots, x_d): a_i \leq x_i \leq b_i, i1,2,\ldots,d \}\end{alig…

java el ognl_EL和OGNL表达式的区分

OGNL是通常要结合Struts 2的标志一起使用&#xff0c;如 struts页面中不能单独使用&#xff0c;el可以单独使用 ${sessionScope.username}页面取值区别&#xff1a;名称servletognl elparametersre…