在Pygame中使用self.rect.centerx来实现角色的随机移动

79 篇文章 ¥59.90 ¥99.00
本文介绍了如何在Pygame中利用self.rect.centerx属性实现角色的随机移动。通过创建角色类,设置update方法更新随机偏移量,以及在游戏主循环中处理角色位置更新和绘制,实现了角色的动态移动效果。

Pygame是一个广泛使用的Python游戏开发库,它提供了丰富的功能和工具来创建各种类型的游戏。在游戏中,角色的移动是一个常见的需求,而使用self.rect.centerx属性可以实现角色的随机移动。下面我将详细介绍如何实现这一功能,并提供相应的源代码。

首先,我们需要导入Pygame库并初始化游戏:

import pygame
import random

pygame.init()

# 设置游戏窗口尺寸
width = 800
height = 600
screen = pygame.display.set_mode<
import pygame import sys import random # 初始化Pygame pygame.init() WIDTH, HEIGHT = 800, 600 screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("River Rice - 简易demo") # 颜色定义 GREEN = (34, 139, 34) # 草原色 BROWN = (139, 69, 19) # 马路色 WHITE = (255, 255, 255) YELLOW = (255, 204, 0) # 荷包蛋颜色 # 玩家类 class Player(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = pygame.Surface((40, 60)) self.image.fill(WHITE) # 白色方块代表玩家 self.rect = self.image.get_rect(center=(WIDTH//2, HEIGHT//2)) self.speed = 5 def update(self): # 玩家移动控制 keys = pygame.key.get_pressed() if keys[pygame.K_a] and self.rect.left > 0: self.rect.x -= self.speed if keys[pygame.K_d] and self.rect.right < WIDTH: self.rect.x += self.speed if keys[pygame.K_w] and self.rect.top > 0: self.rect.y -= self.speed if keys[pygame.K_s] and self.rect.bottom < HEIGHT: self.rect.y += self.speed # 荷包蛋武器类 class EggWeapon(pygame.sprite.Sprite): def __init__(self, x, y): super().__init__() self.image = pygame.Surface((20, 20)) self.image.fill(YELLOW) self.rect = self.image.get_rect(center=(x, y)) self.speed = 8 def update(self): # 荷包蛋向右飞行(可修改方向逻辑) self.rect.x += self.speed if self.rect.left > WIDTH: self.kill() # 超出屏幕删除 # 地图绘制(草原+简易马路) def draw_map(): # 草原背景 screen.fill(GREEN) # 底部马路 pygame.draw.rect(screen, BROWN, (0, HEIGHT-100, WIDTH, 100)) # 简易滑滑梯(左上角三角形代表) pygame.draw.polygon(screen, (255, 165, 0), [(50, 400), (100, 300), (150, 400)]) # 主游戏循环 def main(): player = Player() all_sprites = pygame.sprite.Group(player) weapons = pygame.sprite.Group() clock = pygame.time.Clock() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() # 按下空格键投掷荷包蛋 if event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: egg = EggWeapon(player.rect.centerx, player.rect.centery) all_sprites.add(egg) weapons.add(egg) # 更新游戏元素 all_sprites.update() # 绘制地图和元素 draw_map() all_sprites.draw(screen) pygame.display.flip() clock.tick(60) if __name__ == "__main__": main()
08-27
import pygame import random import sys # 初始化Pygame pygame.init() # 游戏配置 SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 FPS = 60 WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) GREEN = (0, 255, 0) # 设置屏幕 screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption("二次元像素冒险") clock = pygame.time.Clock() # 原创角色类(二次元少女) class Player(pygame.sprite.Sprite): def __init__(self): super().__init__() # 简化像素形象(实际可替换为自定义图片) self.image = pygame.Surface((40, 60)) self.image.fill((255, 192, 203)) # 粉色头发 pygame.draw.rect(self.image, (255, 255, 0), (10, 20, 20, 30)) # 黄色衣服 self.rect = self.image.get_rect() self.rect.centerx = SCREEN_WIDTH // 2 self.rect.bottom = SCREEN_HEIGHT - 10 self.speed_x = 5 self.speed_y = 0 self.jump_power = -15 self.gravity = 1 self.on_ground = True def update(self): # 重力应用 self.speed_y += self.gravity if self.speed_y > 10: self.speed_y = 10 self.rect.y += self.speed_y # 地面碰撞 if self.rect.bottom >= SCREEN_HEIGHT - 5: self.rect.bottom = SCREEN_HEIGHT - 5 self.speed_y = 0 self.on_ground = True # 左右移动 keys = pygame.key.get_pressed() if keys[pygame.K_LEFT] and self.rect.left > 0: self.rect.x -= self.speed_x if keys[pygame.K_RIGHT] and self.rect.right < SCREEN_WIDTH: self.rect.x += self.speed_x # 跳跃 if keys[pygame.K_SPACE] and self.on_ground: self.speed_y = self.jump_power self.on_ground = False # 道具类(收集物) class Item(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = pygame.Surface((30, 30)) self.image.fill(GREEN) self.rect = self.image.get_rect() self.rect.x = random.randint(0, SCREEN_WIDTH - 30) self.rect.y = random.randint(-100, -30) self.speed_y = random.randint(2, 4) def update(self): self.rect.y += self.speed_y if self.rect.top > SCREEN_HEIGHT: self.kill() # 敌人类(障碍物) class Enemy(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = pygame.Surface((40, 40)) self.image.fill(RED) self.rect = self.image.get_rect() self.rect.x = random.randint(0, SCREEN_WIDTH - 40) self.rect.y = random.randint(-150, -50) self.speed_y = random.randint(3, 5) def update(self): self.rect.y += self.speed_y if self.rect.top > SCREEN_HEIGHT: self.kill() # 初始化精灵组 all_sprites = pygame.sprite.Group() items = pygame.sprite.Group() enemies = pygame.sprite.Group() player = Player() all_sprites.add(player) # 游戏变量 score = 0 font = pygame.font.Font(None, 40) spawn_timer = 0 # 游戏主循环 running = True while running: # 控制帧率 clock.tick(FPS) # 事件处理 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 生成道具和敌人 spawn_timer += 1 if spawn_timer % 60 == 0: # 每秒生成1个道具 item = Item() all_sprites.add(item) items.add(item) if spawn_timer % 80 == 0: # 每1.3秒生成1个敌人 enemy = Enemy() all_sprites.add(enemy) enemies.add(enemy) # 更新所有精灵 all_sprites.update() # 碰撞检测(收集道具) collected = pygame.sprite.spritecollide(player, items, True) for _ in collected: score += 10 # 碰撞检测(碰到敌人游戏结束) hits = pygame.sprite.spritecollide(player, enemies, False) if hits: running = False # 绘制画面 screen.fill(BLACK) all_sprites.draw(screen) # 显示分数 score_text = font.render(f"Score: {score}", True, WHITE) screen.blit(score_text, (10, 10)) # 更新屏幕 pygame.display.flip() # 游戏结束显示 game_over_font = pygame.font.Font(None, 60) game_over_text = game_over_font.render(f"Game Over! Score: {score}", True, RED) screen.blit(game_over_text, (SCREEN_WIDTH//2 - 150, SCREEN_HEIGHT//2)) pygame.display.flip() pygame.time.wait(2000) # 退出游戏 pygame.quit() sys.exit()
最新发布
11-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值