《pygame游戏开发实战指南》第三节 理解pygame中的坐标体系

news2024/9/20 18:33:13

pygame中的坐标体系非常的简单,其实就是一句话:任何对象的左上角都为坐标原点(0, 0),向右为X轴正方向,向下为Y轴正方向。如下图所示。本节主要通过一些示例来带大家理解这一句话。如果读者已经理解的话,可以直接跳过这一节。
pygame坐标系

项目代码下载地址: https://github.com/la-vie-est-belle/pygame_codes


3.1 坐标体系使用示例

在示例代码3-1中,我们往屏幕上放了陆地图片和小恐龙图片,然后往小恐龙头上加了一朵小花。

import sys
import pygame

pygame.init()
screen = pygame.display.set_mode((1100, 600))
pygame.display.set_caption('Dino Runner')

icon = pygame.image.load('icon.png')
pygame.display.set_icon(icon)

land = pygame.image.load('land.png').convert_alpha()
land_rect = land.get_rect()
land_rect.y = 520                                   # 1

dino = pygame.image.load('dino_start.png').convert_alpha()
dino_rect = dino.get_rect()
dino_rect.topleft = (80, 450)                       # 2

flower = pygame.image.load('flower.png').convert_alpha()
flower_rect = flower.get_rect(topleft=(70, 10))     # 3

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    screen.fill((255, 255, 255))
    screen.blit(land, land_rect)
    screen.blit(dino, dino_rect)
    dino.blit(flower, flower_rect)

    pygame.display.flip()

运行结果如下:
在这里插入图片描述

代码解释如下:
#1 设置陆地图片在屏幕上的y坐标,值为520,坐标为(0, 520)
陆地图片在屏幕上的位置

#2 设置小恐龙图片左上角在屏幕上的位置,坐标为(80, 450)
小恐龙图片在屏幕上的位置

#3 设置小花朵图片左上角在小恐龙图片上的位置,坐标为(70, 10)。这里我们直接在get_rect()函数中设置了topleft的值,效果跟以下代码相同。

flower_rect = flower.get_rect()
flower_rect.topleft = (70, 10)

小花朵图片在小恐龙图片上的位置


3.2 改变坐标原点的位置

一些开发者可能不习惯将坐标原点放在左上角,也不习惯向右为X轴正方向,向下为Y轴正方向。假如我们现在要以屏幕中心为坐标原点,向右为X轴正方向,向上为Y轴正方向,需要怎么做呢?
屏幕中心为原点
因为pygame没有提供改变坐标原点的函数,所以我们可以自己写一个坐标转换函数。请看示例代码3-2。

import sys
import pygame


def convert_coordinate(surface_width, surface_height, x, y):            # 1
    new_x = x + int(surface_width / 2)
    new_y = int(surface_height / 2) - y
    return new_x, new_y


pygame.init()
screen = pygame.display.set_mode((1100, 600))
pygame.display.set_caption('Dino Runner')

icon = pygame.image.load('icon.png')
pygame.display.set_icon(icon)

dino = pygame.image.load('dino_start.png').convert_alpha()
dino_rect = dino.get_rect()
dino_rect.topleft = convert_coordinate(screen.get_width(), screen.get_height(), 0, 0)   # 2
print(dino_rect.topleft)

flower = pygame.image.load('flower.png').convert_alpha()
flower_rect = flower.get_rect(topleft=convert_coordinate(dino.get_width(), dino.get_height(), 0, 0))    # 3
print(flower_rect.topleft)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    screen.fill((255, 255, 255))
    screen.blit(dino, dino_rect)
    dino.blit(flower, flower_rect)

    pygame.display.flip()

运行结果如下:
示例代码3-2运行结果

代码解释如下:
#1 坐标转换函数,根据目标Surface对象的宽高计算得出新坐标体系下的x和y坐标。

#2 在新坐标体系下,如果我们将小恐龙的坐标设置为(0, 0),其实就是将它的左上角位置放在屏幕中心。
新坐标体系下的小恐龙

#3 同理,在新坐标体系下,如果我们将小花朵的坐标设置为(0, 0),其实就是将它的左上角位置放在小恐龙的中心。
新坐标体系下的小花朵


3.3 小结

在本节我们学习了pygame的坐标体系,以及如何通过一个坐标转换函数来建立新的坐标体系。


如果你喜欢笔者的这部专栏,可以给笔者一些打赏,或者通过购买一些项目来支持作者,非常感谢!

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

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

相关文章

iPhone不下载APP直接投屏到电脑,这些投影设置你会用吗【电脑投影设置需添加】

最近小编一直在追唐朝诡事录之西行,太好看了,就是手机屏幕有点小,虽然也可以在电脑上看,但是小编心血来潮想投屏到此电脑看看,因此就写了这篇文章。 ①首先打开电脑的设置,打开系统 ②左侧栏中找到投影到此…

学习Java的日子 Day63 文件上传,文件下载,上传头像案例

文件上传下载 1.文件上传 文件上传的应用 比如个人信息的管理,上传头像 比如商品信息的管理,上传商品的图片 这些都需要通过浏览器客户端将图片上传到服务器的磁盘上 2.文件上传原理 所谓的文件上传就是服务器端通过request对象获取输入流,将…

VMware安装Centos虚拟机使用NAT模式无法上网问题处理

NAT模式无法上网问题处理 Centos7与Ubuntu使用同一个NAT网络,Ubuntu正常访问互联网,Centos无法正常访问。 处理方案: cd /etc/sysconfig/network-scripts vi ifcfg-ens33 修改配置项: 重启网络: service network resta…

vue的nextTick是下一次事件循环吗

如题,nextTick的回调是在下一次事件循环被执行的吗? 是不是下一次事件循环取决于nextTick的实现,如果是用的微任务,那么就是本次事件循环;否则如果用的是宏任务,那么就是下一次事件循环。 我们看下Vue3中…

STM32L051K8U6-开发资料

STM32L051测试 (四、Flash和EEPROM的读写)-云社区-华为云 (huaweicloud.com) STM32L051测试 (四、Flash和EEPROM的读写) - 掘金 (juejin.cn) STM32L0 系列 EEPROM 读写,程序卡死?_stm32l0片内eeprom_stm3…

Android studio配置代码模版

一、背景: 在工作中,总是要写一些重复的代码,特别是项目有相关规范时,就会产生很多模版代码,每次要么复制一份,要么重新写一份新的,很麻烦,于是我就在想,能不能像创建一…

tomato靶场

扫描网址端口 访问一下8888 我们用kali扫描一下目录 访问这个目录 产看iofo.php源码,发现里面有文件包含漏洞 访问/etc/passwd/发现确实有文件包含漏洞 远程连接2211端口 利用报错,向日志文件注入木马,利用文件包含漏洞访问日志文件 http:/…

现代前端架构介绍(第二部分):如何将功能架构分为三层

远离JavaScript疲劳和框架大战,了解真正重要的东西 在这个系列的前一部分 《App是如何由不同的构建块构成的》中,我们揭示了现代Web应用是由不同的构建块组成的,每个构建块都承担着特定的角色,如核心、功能等。在这篇文章中&#…

手机市场回暖,为何OPPO却“遇冷”?

在智能手机这片红海中,OPPO曾以其独特的营销策略和创新的产品设计,一度占据国内市场的领先地位。然而,近期的数据却揭示了OPPO正面临前所未有的挑战,销量下滑、库存高企,昔日的辉煌似乎已成过眼云烟。 当整个手机市场逐…

单个或两个及以上java安装与环境变量配置

目录 java下载地址: 1.安装java 1.1 安装程序 1.2选择安装路径 1.3等待安装 2.首先,进入环境变量 2.1 找到设置(第一个win11,第二个win10) 2.2 进入到系统高级系统设置(第一个win11,第二…

快捷生成vue模板插件

Vetur < 就可以选择快捷键

Java多线程实现的两种方式

Java多线程实现的两种方式 1. 继承Thread类2. 实现Runnable接口3.总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1. 继承Thread类 直接继承java.lang.Thread类&#xff0c;并重写其run方法。这种方式简单直接&#xff0c;但限制了类…

Python3接口测试框架的整体布局与设计

实战项目整体布局概览 本实战项目基本的层级结构如下&#xff1a; 习惯性的命名规则&#xff0c;把所有的辅助类py文件放在commonsrc这个包里面&#xff0c;如数据库配置封装文件、接口配置封装文件等&#xff1b;辅助类py文件在整个项目中初期代码写好后一般是不会去大范围修…

Character.AI的联合创始人Noam Shazeer将加入谷歌;又一个开源平替llamacoder;和mem0一样的动态记忆框架

✨ 1: Character.AI 创始人回归google Character.AI的联合创始人Noam Shazeer将加入谷歌 Character.AI的联合创始人Noam Shazeer和Daniel De Freitas离开公司&#xff0c;重新加入Google旗下的DeepMind研究团队。Google签署了一项非独占性协议&#xff0c;使用Character.AI的…

Java8新特性(二) Stream与Optional详解

Java8新特性&#xff08;二&#xff09; Stream与Optional详解 一. Stream流 1. Stream概述 1.1 基本概念 Stream&#xff08;java.util.stream&#xff09; 是Java 8中新增的一种抽象流式接口&#xff0c;主要用于配合Lambda表达式提高批量数据的计算和处理效率。Stream不是…

远程控制电脑的正确姿势,3大神器助你秒变技术达人!

现在的生活节奏快得跟打鼓似的&#xff0c;不管是在家工作、帮朋友修电脑&#xff0c;还是想控制家里的播放器放个电影&#xff0c;远程控制电脑这事儿越来越重要了。有没有遇到过想用电脑却够不着的尴尬&#xff1f;别急&#xff0c;今天咱们就来看看怎么搞定远程控制电脑&…

快瞳宠物AI识别赋能养宠智能设备,让品牌大有可为

随着国内养宠市场的不断完善与成熟&#xff0c;许多家庭养宠理念从“健康养宠”向“育儿式养宠”的升级&#xff0c;国内宠物行业向高质量发展阶段迈进&#xff0c;宠物经济增长迅猛。报告显示&#xff0c;2024年宠物智能设备货架电商年销售额达2.5亿&#xff0c;增速近30%。内…

记录一次学习过程(msf、cs的使用、横向渗透等等)

目录 用python搭建一个简单的web服务器 代码解释 MSF msfvenom 功能 用途 查看payloads列表 msfconsole 功能 用途 msfvenom和msfconsole配合使用 来个例子 msf会话中用到的一些命令 在windows中net user用法 列出所有用户账户 显示单个用户账户信息 创建用户账…

x-cmd mod | x jq - 轻量级的 JSON 处理工具

目录 简介使用语法参数子命令x jq openx jq repl 简介 jq 是一个轻量级的 JSON 处理工具&#xff0c;是由 Stephen Dolan 于 2012 年开发。 使用语法 x jq [SUB_COMMAND] <#n>参数 参数描述#n继承 jq 子命令或参数选项 子命令 名称描述x jq open用浏览器打开 jqplay…

Axure入门及快速上手的法宝元件库:解锁高效原型设计之旅

在当今快速迭代的数字产品时代&#xff0c;原型设计成为了连接产品创意与实现之间不可或缺的桥梁。Axure RP&#xff0c;作为一款强大的交互原型设计工具&#xff0c;凭借其易用性、灵活性和丰富的功能&#xff0c;成为了设计师和产品经理的首选。它不仅能够帮助用户快速创建高…