pygame制作游戏第一天

pygame制作第一天

截个图

首先还是黑屏哈。后面找时间慢慢做地图跟其他角色,还有攻击方式等。

这里先做了一个"炫酷"的雨云召唤技能。

人物可以移动,g键召唤持续10秒的跟随目标的雨云。角色会被雨滴攻击。

思路很重要,不然数据传递就乱了。

雨滴是单个的,与其他元素无关(除了要传入攻击目标)。

云里面生成雨滴对象的集合,雨滴的x范围在与的[x,x+cloud.width]内

云需要跟随目标(这里暂定是玩家自己)需要定义其x,y的速度,以及方向。

人物我做了个基类charactor,玩家player继承基类。未雨绸缪哈

charactor.py

python 复制代码
class Charactor(object):
    def __init__(self, x=0, y=0):
        self.x = x
        self.y = y

    def attack(self):
        pass

    def update(self, keys):
        pass

    def draw_damage(self, damage, window):
        pass

    def draw(self, delta, window):
        pass

player.py

python 复制代码
import pygame

from cloud import Cloud

from settings import *
from charactor import Charactor


class Player(Charactor):
    def __init__(self):
        super().__init__()
        self.hp = 100
        self.x_speed = person_x_speed
        self.y_speed = person_y_speed
        self.facing = {
            'right': True,
            "left": False,
            'up': False,
            'down': False
        }
        self.pre_facing = 'right'
        self.peron_down_walk_images = peron_down_walk_images
        self.peron_up_walk_images = peron_up_walk_images
        self.peron_right_walk_images = peron_right_walk_images
        self.peron_left_walk_images = peron_left_walk_images
        self.image_index = 0
        self.image = peron_down_walk_images[self.image_index]
        self.width = peron_down_walk_images[self.image_index].get_width()
        self.height = peron_down_walk_images[self.image_index].get_height()

        self.hit_by_raindrop = 0

        self.font = pygame.font.Font(None, 36)
        self.get_damage = 0  # 受到伤害
        self.get_damage_text = None  # 受到伤害文本
        self.time_counter = 0  # 计时器
        self.skills = {
            'g': {'status': False,
                  'cloud': Cloud(self.x, self.y - 200),
                  'exist_time': 10,
                  }

        }

    def update(self, keys):
        if keys[pygame.K_a]:
            self.x -= self.x_speed
            self.facing['right'], self.facing['left'], self.facing['up'], self.facing[
                'down'] = False, True, False, False
        if keys[pygame.K_d]:
            self.x += self.x_speed
            self.facing['right'], self.facing['left'], self.facing['up'], self.facing[
                'down'] = True, False, False, False
        if keys[pygame.K_w]:
            self.y -= self.y_speed
            self.facing['right'], self.facing['left'], self.facing['up'], self.facing[
                'down'] = False, False, True, False
        if keys[pygame.K_s]:
            self.y += self.y_speed
            self.facing['right'], self.facing['left'], self.facing['up'], self.facing[
                'down'] = False, False, False, True
        if keys[pygame.K_g]:
            if not self.skills['g']['status']:
                self.skills['g']['status'] = True

    def skill_cloud(self, delta, window):
        if self.time_counter >= self.skills['g']['exist_time']:
            self.skills['g']['status'] = False
            self.time_counter = 0
        if self.skills['g']['status']:
            self.skills['g']['cloud'].rained_objects = [self]
            self.skills['g']['cloud'].update(delta, self)
            self.skills['g']['cloud'].draw(window)
        else:
            self.skills['g']['cloud'] = Cloud(self.x, self.y - 200)

    def damaged(self, damage):
        font = pygame.font.Font(None, 24)
        text1 = font.render(f"-{damage}", True, (255, 0, 0))
        self.get_damage = damage
        self.get_damage_text = text1

    def draw(self, delta, window):
        self.time_counter += delta
        self.skill_cloud(delta, window)
        for k, v in self.facing.items():
            if v and self.pre_facing != k:
                self.pre_facing = k
                self.image_index = 0
            if v and self.pre_facing == k:
                self.image_index = self.image_index + int(delta * FPS) if self.image_index < 6 else 0
            self.image = peron_down_walk_images[self.image_index]
            self.width = peron_down_walk_images[self.image_index].get_width()
            self.height = peron_down_walk_images[self.image_index].get_height()
        if self.facing['right']:
            images = self.peron_right_walk_images
        elif self.facing['left']:
            images = self.peron_left_walk_images
        elif self.facing['up']:
            images = self.peron_up_walk_images
        else:
            images = self.peron_down_walk_images
        window.blit(images[self.image_index], (self.x, self.y))
        pygame.draw.rect(window, (0, 0, 255), (0, 0, 40, 30))
        text1 = self.font.render(str(self.hp), True, (255, 0, 0))
        window.blit(text1, (screen_width - 100, 5))
        if self.get_damage:
            window.blit(self.get_damage_text, (self.x, self.y - 30))
            self.get_damage = 0

rain.py

python 复制代码
import random
import pygame

from settings import *


class Rain(pygame.sprite.Sprite):
    def __init__(self, x, y, rained_objects):
        super().__init__()
        self.width = random.randint(0, 3)
        self.length = random.randint(8, 15)
        self.image = pygame.Surface([self.width, self.length])
        self.image.fill((244, 244, 255))
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.rained_objects = rained_objects
        self.drop_speed = random.randint(rain_drop_speed[0], rain_drop_speed[1]) # 下落速度随机范围
        self.gravity = drop_gravity  # 加速度

    def check_collision(self, item):
        return True if (item.x < self.rect.x < item.x + item.width
                        and item.y < self.rect.y < item.y + item.height) else False

    def update(self):
        self.drop_speed = self.drop_speed * (1 + self.gravity)
        self.rect.y += int(self.drop_speed)
        if self.rect.y > screen_height:
            self.kill()
        damage = int(10 * ((self.width * self.length) / 10))
        for item in self.rained_objects:
            if self.check_collision(item):
                item.hit_by_raindrop += 1
                item.hp -= damage
                item.damaged(damage)
                self.kill()

cloud.py

python 复制代码
import random

import pygame

from settings import *
from rain import Rain


class Cloud:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.image = pygame.image.load(cloud_image_path).convert_alpha()
        self.width = self.image.get_width()
        self.height = self.image.get_height()
        self.x_speed = cloud_x_speed
        self.y_speed = cloud_y_speed
        self.move_right = True
        self.move_down = True
        self.delta = 0
        self.raining = True
        self.raindrops = pygame.sprite.Group()
        self.rain_counts = rain_counts
        self.rained_objects = []
        self.raining_time = 0
        self.total_raining_time = 10
        self.target_distance = 100

    def update(self, delta, target):
        self.raining_time += delta
        self.x = self.x + self.x_speed if self.move_right else self.x - self.x_speed
        self.y = self.y + self.y_speed if self.move_down else self.y - self.y_speed
        if self.x + self.width <= target.x: self.move_right = True
        if self.x >= target.x + target.width: self.move_right = False
        if self.y + self.height < target.y - self.target_distance:
            self.move_down, self.y_speed = True, cloud_y_speed
        elif self.y + self.height > target.y - self.target_distance:
            self.move_down, self.y_speed = False, cloud_y_speed
        else:
            self.y_speed = 0

    def rain(self, window):
        rain_range = [i for i in range(self.x, self.x + self.width)]
        if len(self.raindrops) <= self.rain_counts and self.raining:
            x = random.choice(rain_range)
            y = self.y + self.height
            new_raindrop = Rain(x, y, self.rained_objects)
            self.raindrops.add(new_raindrop)
        self.raindrops.update()
        self.raindrops.draw(window)

    def draw(self, window):
        window.blit(self.image, (self.x, self.y))
        self.rain(window)
        if self.raining_time >= self.total_raining_time:
            self.raining = False

settings.py

python 复制代码
import random
import pygame

screen_width = 1280
screen_height = 720
FPS = 60
cloud_image_path = "data/cloud.png"
cloud_x_speed = 2
cloud_y_speed = 1
person_x_speed = 5
person_y_speed = 3
rain_counts = 5
rain_drop_speed = [3, 8]
rain_drop_interval = 0.1
drop_gravity = 0.005

peron_down_walk_images = []
for i in range(0, 7):
    img = pygame.image.load("data/catgame/walk/down_walk_%d.png" % i)
    peron_down_walk_images.append(img)
peron_up_walk_images = []
for i in range(0, 7):
    img = pygame.image.load("data/catgame/walk/up_walk_%d.png" % i)
    peron_up_walk_images.append(img)
peron_left_walk_images = []
for i in range(0, 7):
    img = pygame.image.load("data/catgame/walk/left_walk_%d.png" % i)
    peron_left_walk_images.append(img)
peron_right_walk_images = []
for i in range(0, 7):
    img = pygame.image.load("data/catgame/walk/right_walk_%d.png" % i)
    peron_right_walk_images.append(img)


ground_path = "data/ground1.png"
ground_rows = 4
ground_columns = 8
相关推荐
m0_748251721 天前
Android webview 打开本地H5项目(Cocos游戏以及Unity游戏)
android·游戏·unity
gantengsheng1 天前
基于51单片机和OLED12864的小游戏《贪吃蛇》
单片机·嵌入式硬件·游戏·51单片机
264玫瑰资源库1 天前
从零开始C++棋牌游戏开发之第三篇:游戏的界面布局设计
开发语言·c++·python·游戏·pygame·源代码管理
264玫瑰资源库1 天前
从零开始C++游戏开发之第七篇:游戏状态机与回合管理
开发语言·c++·游戏
windwind20001 天前
游戏关卡设计方法的杂感
游戏·关卡设计
白乐天_n2 天前
腾讯游戏安全移动赛题Tencent2016A
安全·游戏
这是我582 天前
C++打小怪游戏
c++·其他·游戏·visual studio·小怪·大型·怪物
tealcwu2 天前
【游戏设计原理】21 - 解谜游戏的设计
游戏·游戏策划
清梦20202 天前
经典问题---跳跃游戏II(贪心算法)
算法·游戏·贪心算法
tealcwu2 天前
【游戏设计原理】22 - 石头剪刀布
游戏·游戏策划