向量学习3:蝌蚪随鼠标移动且蝌蚪头部总是指向鼠标

Posted geng_zhaoying

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了向量学习3:蝌蚪随鼠标移动且蝌蚪头部总是指向鼠标相关的知识,希望对你有一定的参考价值。

游戏设计中,一些角色随鼠标移动,要求角色的头部总是指向鼠标。例如小蝌蚪随鼠标移动,蝌蚪头部必须指向鼠标,否则鼠标向蝌蚪尾部方向移动,看起来蝌蚪向后倒退,显然不合理。角色随鼠标移动比较容易做到,只要令角色中心等于鼠标坐标值即可。但角色的头部总是指向鼠标,不用向量概念,就比较麻烦,如使用向量,则只用不多语句就能完成。这里用小蝌蚪在水中随鼠标移动例子来说明向量这种用法。首先看小蝌蚪图形,如下图。注意小蝌蚪从尾巴到头部近似是沿x轴正方向,因此认为和x轴夹角为0度。如小蝌蚪围绕其中心自转,蝌蚪头部就可以指向任何方向,其和x轴夹角是旋转角度。

鼠标当前位置向量-鼠标上次位置向量=鼠标的运动向量,只要使小蝌蚪围绕其中心自转角度等于鼠标的运动向量的角度,就能使蝌蚪头部总是指向鼠标,实现代码如下:

oldMouse=pygame.math.Vector2(上次鼠标x值,上次鼠标y值)   #上次鼠标位置向量
mouse_pos=pygame.mouse.get_pos()                       #得到鼠标当前坐标
mouse=pygame.math.Vector2(mouse_pos)            	   #鼠标当前位置向量
mouseMove=mouse-oldMouse				   			   #得到鼠标移动向量
r1,angle=mouseMove.as_polar()        #得到鼠标移动向量角度angle(和x轴夹角)
p=pygame.transform.rotate(p1,-angle)		   	    #小蝌蚪头部旋转-angle
r=p.get_rect(center=mouse_pos)         		   		#蝌蚪中心将移到鼠标位置 
oldMouse=mouse         			      #保存当前鼠标向量作为上次鼠标向量
screen.blit(p, r)                     #在屏幕指定位置绘制蝌蚪图形

程序运行后效果图如下。图中似乎是鼠标按下拖动蝌蚪移动,这是错觉,没有按下鼠标,仅仅移动鼠标,蝌蚪跟随鼠标移动。这是因为程序使蝌蚪的中心点等于鼠标坐标,因此看到鼠标总在看到中心位置附近。

完整程序如下,仅拷贝程序不能运行,必须在源程序所在文件夹中有背景图片文件和小蝌蚪去背景图片文件。随便找一个480x360(或较大)背景图片或不用背景图片(将背景设置为除黑色外的其他颜色,因蝌蚪为黑色)也不会影响程序运行效果。小蝌蚪图片可右击上边小蝌蚪图片,在弹出框中选择“将图像另存为”,保存文件,不知能否保留透明背景,不是透明背景请到在线网站去背景。向量知识仅介绍这么多,不涉及较难的向量知识,但这些向量知识对于游戏编程却有很大帮助。这些知识对于高年级小学生应该不难理解。

import pygame
pygame.init()
size = width, height = 480,360                      #创建游戏窗口大小
screen = pygame.display.set_mode(size)
pygame.display.set_caption("小蝌蚪随鼠标移动")  #设置窗口标题
bg_img = pygame.image.load("背景.jpeg").convert()   #背景图像
p=pygame.image.load("小蝌蚪2.png").convert_alpha()
r=p.get_rect()
p1=pygame.transform.scale(p, (r.width//3, r.height//3))    #调整图像的大小
oldMouse=pygame.math.Vector2(0,0)#蝌蚪移动前的位置向量,位置是任意值,使程序运行后第1次两向量能相减
fclock = pygame.time.Clock()                        #创建控制频率的clock
fps = 4                                             #定义刷新频率,=10似乎效果不如=4
running = True                                      #程序是否结束,初始运行
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:               #处理退出事件
            running = False                         #程序结束        
    mouse_pos=pygame.mouse.get_pos()                #得到鼠标位置
    screen.blit(bg_img,(0,0))                       #绘制背景
    mouse=pygame.math.Vector2(mouse_pos)            #鼠标位置向量
    #mouse-oldMouse,是鼠标当前位置向量-鼠标前次位置向量,所得向量即鼠标移动向量,即鼠标移动距离和方向
    r1,angle=(mouse-oldMouse).as_polar()  #蝌蚪p1初始方向沿x轴,必须转-angle角度和鼠标运动方向一致
    #r1,angle=(mouse_pos-oldMouse).as_polar()#向量(mouse_pos-oldMouse)的长度和x轴角度,不知原因此条也对
    p=pygame.transform.rotate(p1, -angle)  #蝌蚪p1头部转向鼠标移动方向          
    r=p.get_rect(center=mouse_pos)         #蝌蚪将移到鼠标位置 
    oldMouse=pygame.math.Vector2(mouse_pos)#保存鼠标位置向量,下次新鼠标位置向量将减该向量,得到新鼠标移动向量
    screen.blit(p, r)                           #在屏幕指定位置绘制图形
    pygame.display.flip()                           #刷新游戏场景
    fclock.tick(fps)    #fps是每秒多少帧,减去程序运行时间,为实现fps,还需延迟时间
pygame.quit()

以上是关于向量学习3:蝌蚪随鼠标移动且蝌蚪头部总是指向鼠标的主要内容,如果未能解决你的问题,请参考以下文章

Tableau 图表大全25之蝌蚪图

pygame游戏_小蝌蚪吃蚊子幼虫成长

pygame游戏_小蝌蚪吃蚊子幼虫成长

集训队日常训练20181201 E 1005 : 小蝌蚪

小蝌蚪传记:jscsshtml压缩与混淆汇总

在MATLAB二维图中,随鼠标移动,显示该点的坐标信息,如何做到?谢谢大家,在线等