日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

linux ba 模拟,在你的 Python 游戏中模拟引力 | Linux 中国

發(fā)布時(shí)間:2024/1/23 linux 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux ba 模拟,在你的 Python 游戏中模拟引力 | Linux 中国 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

學(xué)習(xí)如何使用 Python 的 Pygame 模塊編程電腦游戲,并開始操作引力。 -- Seth Kenlon

真實(shí)的世界充滿了運(yùn)動(dòng)和生活。物理學(xué)使得真實(shí)的生活如此忙碌和動(dòng)態(tài)。物理學(xué)是物質(zhì)在空間中運(yùn)動(dòng)的方式。既然一個(gè)電腦游戲世界沒有物質(zhì),它也就沒有物理學(xué)規(guī)律,使用游戲程序員不得不模擬物理學(xué)。

從大多數(shù)電腦游戲來(lái)說(shuō),這里基本上僅有兩個(gè)方面的物理學(xué)是重要的:引力和碰撞。

當(dāng)你到你的游戲中時(shí),你實(shí)現(xiàn)了一些碰撞檢測(cè),但是這篇文章要添加更多的東西,因?yàn)橐π枰鲎矙z測(cè)。想想為什么引力可能涉及碰撞。如果你不能想到任何原因,不要擔(dān)心 —— 它會(huì)隨著你開發(fā)示例代碼工作而且顯然。

在真實(shí)世界中的引力是有質(zhì)量的物體來(lái)相互吸引的傾向性。物體(質(zhì)量)越大,它施加越大的引力作用。在電腦游戲物理學(xué)中,你不必創(chuàng)建質(zhì)量足夠大的物體來(lái)證明引力的正確;你可以在電腦游戲世界本身中僅編程一個(gè)物體落向假設(shè)的最大的對(duì)象的傾向。

添加一個(gè)引力函數(shù)

記住你的玩家已經(jīng)有了一個(gè)決定動(dòng)作的屬性。使用這個(gè)屬性來(lái)將玩家精靈拉向屏幕底部。

在 Pygame 中,較高的數(shù)字更接近屏幕的底部邊緣。

在真實(shí)的世界中,引力影響一切。然而,在平臺(tái)游戲中,引力是有選擇性的 —— 如果你添加引力到你的整個(gè)游戲世界,你的所有平臺(tái)都將掉到地上。反之,你可以僅添加引力到你的玩家和敵人精靈中。

首先,在你的 Player 類中添加一個(gè) gravity 函數(shù):

def gravity(self):

self.movey += 3.2 # 玩家掉落的多快

這是一個(gè)簡(jiǎn)單的函數(shù)。首先,不管你的玩家是否想運(yùn)動(dòng),你設(shè)置你的玩家垂直運(yùn)動(dòng)。也就是說(shuō),你已經(jīng)編程你的玩家總是在下降。這基本上就是引力。

為使引力函數(shù)生效,你必須在你的主循環(huán)中調(diào)用它。這樣,當(dāng)每一個(gè)處理循環(huán)時(shí),Python 都應(yīng)用下落運(yùn)動(dòng)到你的玩家。

在這代碼中,添加第一行到你的循環(huán)中:

player.gravity() # 檢查引力

player.update()

啟動(dòng)你的游戲來(lái)看看會(huì)發(fā)生什么。要注意,因?yàn)樗l(fā)生的很快:你是玩家從天空上下落,馬上掉出了你的游戲屏幕。

你的引力模擬是工作的,但是,也許太好了。

作為一次試驗(yàn),嘗試更改你玩家下落的速度。

給引力添加一個(gè)地板

你的游戲沒有辦法發(fā)現(xiàn)你的角色掉落出世界的問題。在一些游戲中,如果一個(gè)玩家掉落出世界,該精靈被刪除,并在某個(gè)新的位置重生。在另一些游戲中,玩家會(huì)丟失分?jǐn)?shù)或一條生命。當(dāng)一個(gè)玩家掉落出世界時(shí),不管你想發(fā)生什么,你必須能夠偵測(cè)出玩家何時(shí)消失在屏幕外。

在 Python 中,要檢查一個(gè)條件,你可以使用一個(gè) if 語(yǔ)句。

你必需查看你玩家是否正在掉落,以及你的玩家掉落的程度。如果你的玩家掉落到屏幕的底部,那么你可以做一些事情。簡(jiǎn)化一下,設(shè)置玩家精靈的位置為底部邊緣上方 20 像素。

使你的 gravity 函數(shù)看起來(lái)像這樣:

def gravity(self):

self.movey += 3.2 # 玩家掉落的多快

if self.rect.y > worldy and self.movey >= 0:

self.movey = 0

self.rect.y = worldy-ty

然后,啟動(dòng)你的游戲。你的精靈仍然下落,但是它停在屏幕的底部。不過(guò),你也許不能看到你在地面層之上的精靈。一個(gè)簡(jiǎn)單的解決方法是,在精靈碰撞游戲世界的底部后,通過(guò)添加另一個(gè) -ty 到它的新 Y 位置,從而使你的精靈彈跳到更高處:

def gravity(self):

self.movey += 3.2 # 玩家掉落的多快

if self.rect.y > worldy and self.movey >= 0:

self.movey = 0

self.rect.y = worldy-ty-ty

現(xiàn)在你的玩家在屏幕底部彈跳,恰好在你地面精靈上面。

你的玩家真正需要的是反抗引力的方法。引力問題是,你不能反抗它,除非你有一些東西來(lái)推開引力作用。因此,在接下來(lái)的文章中,你將添加地面和平臺(tái)碰撞以及跳躍能力。在這期間,嘗試應(yīng)用引力到敵人精靈。

到目前為止,這里是全部的代碼:

#!/usr/bin/env python3

# draw a world

# add a player and player control

# add player movement

# add enemy and basic collision

# add platform

# add gravity

# GNU All-Permissive License

# Copying and distribution of this file, with or without modification,

# are permitted in any medium without royalty provided the copyright

# notice and this notice are preserved. This file is offered as-is,

# without any warranty.

import pygame

import sys

import os

'''

Objects

'''

class Platform(pygame.sprite.Sprite):

# x location, y location, img width, img height, img file

def __init__(self,xloc,yloc,imgw,imgh,img):

pygame.sprite.Sprite.__init__(self)

self.image = pygame.image.load(os.path.join('images',img)).convert()

self.image.convert_alpha()

self.rect = self.image.get_rect()

self.rect.y = yloc

self.rect.x = xloc

class Player(pygame.sprite.Sprite):

'''

Spawn a player

'''

def __init__(self):

pygame.sprite.Sprite.__init__(self)

self.movex = 0

self.movey = 0

self.frame = 0

self.health = 10

self.score = 1

self.images = []

for i in range(1,9):

img = pygame.image.load(os.path.join('images','hero' + str(i) + '.png')).convert()

img.convert_alpha()

img.set_colorkey(ALPHA)

self.images.append(img)

self.image = self.images[0]

self.rect = self.image.get_rect()

def gravity(self):

self.movey += 3.2 # how fast player falls

if self.rect.y > worldy and self.movey >= 0:

self.movey = 0

self.rect.y = worldy-ty-ty

def control(self,x,y):

'''

control player movement

'''

self.movex += x

self.movey += y

def update(self):

'''

Update sprite position

'''

self.rect.x = self.rect.x + self.movex

self.rect.y = self.rect.y + self.movey

# moving left

if self.movex < 0:

self.frame += 1

if self.frame > ani*3:

self.frame = 0

self.image = self.images[self.frame//ani]

# moving right

if self.movex > 0:

self.frame += 1

if self.frame > ani*3:

self.frame = 0

self.image = self.images[(self.frame//ani)+4]

# collisions

enemy_hit_list = pygame.sprite.spritecollide(self, enemy_list, False)

for enemy in enemy_hit_list:

self.health -= 1

print(self.health)

ground_hit_list = pygame.sprite.spritecollide(self, ground_list, False)

for g in ground_hit_list:

self.health -= 1

print(self.health)

class Enemy(pygame.sprite.Sprite):

'''

Spawn an enemy

'''

def __init__(self,x,y,img):

pygame.sprite.Sprite.__init__(self)

self.image = pygame.image.load(os.path.join('images',img))

#self.image.convert_alpha()

#self.image.set_colorkey(ALPHA)

self.rect = self.image.get_rect()

self.rect.x = x

self.rect.y = y

self.counter = 0

def move(self):

'''

enemy movement

'''

distance = 80

speed = 8

if self.counter >= 0 and self.counter <= distance:

self.rect.x += speed

elif self.counter >= distance and self.counter <= distance*2:

self.rect.x -= speed

else:

self.counter = 0

self.counter += 1

class Level():

def bad(lvl,eloc):

if lvl == 1:

enemy = Enemy(eloc[0],eloc[1],'yeti.png') # spawn enemy

enemy_list = pygame.sprite.Group() # create enemy group

enemy_list.add(enemy) # add enemy to group

if lvl == 2:

print("Level " + str(lvl) )

return enemy_list

def loot(lvl,lloc):

print(lvl)

def ground(lvl,gloc,tx,ty):

ground_list = pygame.sprite.Group()

i=0

if lvl == 1:

while i < len(gloc):

ground = Platform(gloc[i],worldy-ty,tx,ty,'ground.png')

ground_list.add(ground)

i=i+1

if lvl == 2:

print("Level " + str(lvl) )

return ground_list

def platform(lvl,tx,ty):

plat_list = pygame.sprite.Group()

ploc = []

i=0

if lvl == 1:

ploc.append((0,worldy-ty-128,3))

ploc.append((300,worldy-ty-256,3))

ploc.append((500,worldy-ty-128,4))

while i < len(ploc):

j=0

while j <= ploc[i][2]:

plat = Platform((ploc[i][0]+(j*tx)),ploc[i][1],tx,ty,'ground.png')

plat_list.add(plat)

j=j+1

print('run' + str(i) + str(ploc[i]))

i=i+1

if lvl == 2:

print("Level " + str(lvl) )

return plat_list

'''

Setup

'''

worldx = 960

worldy = 720

fps = 40 # frame rate

ani = 4 # animation cycles

clock = pygame.time.Clock()

pygame.init()

main = True

BLUE = (25,25,200)

BLACK = (23,23,23 )

WHITE = (254,254,254)

ALPHA = (0,255,0)

world = pygame.display.set_mode([worldx,worldy])

backdrop = pygame.image.load(os.path.join('images','stage.png')).convert()

backdropbox = world.get_rect()

player = Player() # spawn player

player.rect.x = 0

player.rect.y = 0

player_list = pygame.sprite.Group()

player_list.add(player)

steps = 10 # how fast to move

eloc = []

eloc = [200,20]

gloc = []

#gloc = [0,630,64,630,128,630,192,630,256,630,320,630,384,630]

tx = 64 #tile size

ty = 64 #tile size

i=0

while i <= (worldx/tx)+tx:

gloc.append(i*tx)

i=i+1

enemy_list = Level.bad( 1, eloc )

ground_list = Level.ground( 1,gloc,tx,ty )

plat_list = Level.platform( 1,tx,ty )

'''

Main loop

'''

while main == True:

for event in pygame.event.get():

if event.type == pygame.QUIT:

pygame.quit(); sys.exit()

main = False

if event.type == pygame.KEYDOWN:

if event.key == pygame.K_LEFT or event.key == ord('a'):

print("LEFT")

player.control(-steps,0)

if event.key == pygame.K_RIGHT or event.key == ord('d'):

print("RIGHT")

player.control(steps,0)

if event.key == pygame.K_UP or event.key == ord('w'):

print('jump')

if event.type == pygame.KEYUP:

if event.key == pygame.K_LEFT or event.key == ord('a'):

player.control(steps,0)

if event.key == pygame.K_RIGHT or event.key == ord('d'):

player.control(-steps,0)

if event.key == pygame.K_UP or event.key == ord('w'):

print('jump')

if event.key == ord('q'):

pygame.quit()

sys.exit()

main = False

world.blit(backdrop, backdropbox)

player.gravity() # check gravity

player.update()

player_list.draw(world)

enemy_list.draw(world)

ground_list.draw(world)

plat_list.draw(world)

for e in enemy_list:

e.move()

pygame.display.flip()

clock.tick(fps)

這是仍在進(jìn)行中的關(guān)于使用 在創(chuàng)建電腦游戲的第七部分。先前的文章是:

via:

作者:

本文由 榮譽(yù)推出

:看到這里點(diǎn)一下 在看唄?

總結(jié)

以上是生活随笔為你收集整理的linux ba 模拟,在你的 Python 游戏中模拟引力 | Linux 中国的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。