飞机大战页面刷新帧数问题
本帖最后由 lzb1001 于 2022-10-14 13:49 编辑# main.py
import pygame
import sys
import traceback
import myplane
import enemy
import bullet
import supply
from pygame.locals import *
from random import *
pygame.init()
pygame.mixer.init()
bg_size = width, height = 480, 700
screen = pygame.display.set_mode(bg_size)
pygame.display.set_caption('飞机大战 - FishC Demo')
background = pygame.image.load('D:\\work\\经典飞机大战\\images\\background.png').convert()
# 载入游戏音乐文件
pygame.mixer.music.load('D:\\work\\经典飞机大战\\sound\\game_music.ogg')
pygame.mixer.music.set_volume(0.2)
bullet_sound = pygame.mixer.Sound('D:\\work\\经典飞机大战\\sound\\bullet.wav')
bullet_sound.set_volume(0.2)
use_bomb_sound = pygame.mixer.Sound('D:\\work\\经典飞机大战\\sound\\use_bomb.wav')
use_bomb_sound.set_volume(0.2)
supply_sound = pygame.mixer.Sound('D:\\work\\经典飞机大战\\sound\\supply.wav')
supply_sound.set_volume(0.2)
get_bomb_sound = pygame.mixer.Sound('D:\\work\\经典飞机大战\\sound\\get_bomb.wav')
get_bomb_sound.set_volume(0.2)
get_bullet_sound = pygame.mixer.Sound('D:\\work\\经典飞机大战\\sound\\get_bullet.wav')
get_bullet_sound.set_volume(0.2)
upgrade_sound = pygame.mixer.Sound('D:\\work\\经典飞机大战\\sound\\upgrade.wav')
upgrade_sound.set_volume(0.2)
enemy3_flying_sound = pygame.mixer.Sound('D:\\work\\经典飞机大战\\sound\\enemy3_flying.wav')
enemy3_flying_sound.set_volume(0.2)
enemy1_down_sound = pygame.mixer.Sound('D:\\work\\经典飞机大战\\sound\\enemy1_down.wav')
enemy1_down_sound.set_volume(0.1)
enemy2_down_sound = pygame.mixer.Sound('D:\\work\\经典飞机大战\\sound\\enemy2_down.wav')
enemy2_down_sound.set_volume(0.2)
enemy3_down_sound = pygame.mixer.Sound('D:\\work\\经典飞机大战\\sound\\enemy3_down.wav')
enemy3_down_sound.set_volume(0.5)
me_down_sound = pygame.mixer.Sound('D:\\work\\经典飞机大战\\sound\\me_down.wav')
me_down_sound.set_volume(0.2)
def main():
pygame.mixer.music.play(-1)
me = myplane.MyPlane(bg_size)
clock = pygame.time.Clock()
# 增加用于切换图片的变量:
switch_image = True
# 增加延时变量
delay = 100
running = True
while running: # 也可使用while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
# 检测用户的键盘操作
key_pressed = pygame.key.get_pressed()
# 移动我方飞机:根据检测到的按键调用相应移动方法执行
if key_pressed or key_pressed:
me.moveUp()
if key_pressed or key_pressed:
me.moveDown()
if key_pressed or key_pressed:
me.moveLeft()
if key_pressed or key_pressed:
me.moveRight()
# 绘制游戏背景
screen.blit(background, (0, 0))
# 绘制我方飞机
if switch_image:
screen.blit(me.image1, me.rect)
else:
screen.blit(me.image2, me.rect)
if not(delay % 5):# 每5帧切换一次我方飞机的图片,实现飞机飞行的动态效果
switch_image = not switch_image
delay -= 1
if not delay:
delay = 100
pygame.display.flip()
clock.tick(60) # 帧率设置为60秒(即最高不能高过60帧每秒),每执行一次循环相当于跑一帧
if __name__ == '__main__':
try:
main()
except SystemExit:
pass
except:
traceback.print_exc()
pygame.quit()
input()
------------------------------------------
Windows 10 专业版 | Python 3.7.6
------------------------------------------
【我的问题】
1、每5帧切换一次我方飞机的图片,实现飞机飞行的动态效果---放在代码前面
clock.tick(60) # 帧率设置为60秒(即最高不能高过60帧每秒),每执行一次循环相当于跑一帧---放在代码后面
两句代码不会互相干扰或影响实现游戏效果吗?
不知道这样表达大神能理解我的意思或困惑吗?
2、延迟变量delay是否可能减为0甚至负数呢?
******************************
感谢大神不吝赐教,为新手解疑释惑。
赠人玫瑰,手有余香,好人一生平安! 我说下我的理解,不一定对哈。
第一个问题:
if not(delay % 5):
与clock.tick(60)
的功能是不一样的,
if not(delay % 5) 是限制image1与image2两张图片的更换频率,
而clock.tick(60),是限制循环每秒的循环次数。从而达到设置页面刷新率的效果,
clock.tick(60) 这里是一秒内循环60次,就代表一秒内要运行你上面绘制我方飞机60次,大概这种意思
第二个问题:延迟变量delay是否可能减为0甚至负数呢?
肯定不得变负数的,里面的这句代码,就是防止这种情况发生。
当delay为0时,又将delay的值设为100。这句代码的意思你现在应该知道是怎么回事了。
delay -= 1
if not delay:
delay = 100 lymww 发表于 2022-10-14 15:51
我说下我的理解,不一定对哈。
第一个问题:
假设我方飞机两张图片为a和b:
当delay值依次等于… 6、 5、 4、 3、 2、1、 0、100、99、98、97、96、95、94、……
对应的图片依次为 … a b … … … … a b … … … … a …
也就是说当五个数字换一次图,唯独当delay=0和100时会连续换图
不知道我理解的对吗?大神是否理解我上面的意思 lymww 发表于 2022-10-14 15:51
我说下我的理解,不一定对哈。
第一个问题:
还有:我测试了一下,代码中delay值和delay%5不一定要100和5的组合,比如5换成其他数字也可以,只是说换成5,飞机图片变换的频率看起来使得飞机尾气或火焰喷射大小的速度或频率比较适中、比较逼真而已。
delay = 100
running = True
while running: # 也可使用while True:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
# 检测用户的键盘操作
key_pressed = pygame.key.get_pressed()
# 移动我方飞机:根据检测到的按键调用相应移动方法执行
if key_pressed or key_pressed:
me.moveUp()
if key_pressed or key_pressed:
me.moveDown()
if key_pressed or key_pressed:
me.moveLeft()
if key_pressed or key_pressed:
me.moveRight()
# 绘制游戏背景
screen.blit(background, (0, 0))
# 绘制我方飞机
if switch_image:
screen.blit(me.image1, me.rect)
else:
screen.blit(me.image2, me.rect)
if not(delay % 5):# 每5帧切换一次我方飞机的图片,实现飞机飞行的动态效果
switch_image = not switch_image
delay -= 1
if not delay:
delay = 100 lzb1001 发表于 2022-10-14 17:32
假设我方飞机两张图片为a和b:
当delay值依次等于… 6、 5、 4、 3、 2、1、 0、100、9 ...
不会出现delay = 0的情况,应该你是先进行依次循环,循环完后再做的 delay -= 1,
所有当你delay =1时,进行了依次循环后,delay就变为100了,
从delay=100开始,它图片切换频率是a,b,b,b,b,a,b,b,b,b,a,。。。。这样循环
基本就是图片a后,维持4次图片b,然后再回到图片a,然后再4次图片b.
lzb1001 发表于 2022-10-14 17:49
还有:我测试了一下,代码中delay值和delay%5不一定要100和5的组合,比如5换成其他数字也可以,只是说换 ...
是的,这个值是你自己去随意设置的,只要使程序运行起来看起来流畅就行 666
页:
[1]