首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角色扮演游戏的场景设置

角色扮演游戏的场景设置
EN

Code Review用户
提问于 2016-02-03 00:04:46
回答 2查看 827关注 0票数 15

我做了一些游戏,但我仍然是新的制作游戏。我制作了这个RPG游戏,这个代码只是游戏的一部分。游戏对游戏的不同级别执行不同的Pygame文件,如代码的这一部分所示(这是用于随机战斗的):

代码语言:javascript
复制
 if (mainCharacterCoordinates.colliderect(battlefield) and (keys_pressed[pygame.K_DOWN] or keys_pressed[pygame.K_UP] or keys_pressed[pygame.K_RIGHT] or keys_pressed[pygame.K_LEFT])):
    f = open('x.txt', 'w')
    f.write(str(x))
    f.close()

    f = open('y.txt', 'w')
    f.write(str(y))
    f.close()
    execfile('battlefield.py')
    Exit = True

这是游戏的截图:

我对这段代码的关注在于我的编码方式是否有效。此刻,我最关心的是游戏中的两件事。我不确定我是否以正确的方式进行了冲突(它们仍然有效,但是在代码中它看起来很糟糕,如下所示)。我在主字符的左、右、上和底部创建了4个矩形,每个对象只有一个矩形,即对象的大小。在此之后,我告诉程序,如果有碰撞在左边,不要走左边和相同的其他三个方面的主要角色。如果有更好的制造碰撞的方法,是否可以给我一些提示?这样,“mainCharacter”就不能遍历一个对象。

代码语言:javascript
复制
    if (keys_pressed[pygame.K_LEFT] and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates8) and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates7) and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates6) and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates5) and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates4) and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates3) and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates2) and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates1) and not mainCharacterCoordinatesLeft.colliderect(crossCoordinates) and not mainCharacterCoordinatesLeft.colliderect(leftborder) and not mainCharacterCoordinatesLeft.colliderect(wellCoordinates) and not mainCharacterCoordinatesLeft.colliderect(trainCoordinates) and not mainCharacterCoordinatesLeft.colliderect(graveyardCoordinates)):
        mainCharacterImage=pygame.image.load(mainCharacterLeft[counter])
        counter = (counter + 1) % len(mainCharacterLeft)
        x -= 2
        CameraX -= 2

    if (keys_pressed[pygame.K_RIGHT] and not mainCharacterCoordinatesRight.colliderect(treeCoordinates8) and not mainCharacterCoordinatesRight.colliderect(treeCoordinates7) and not mainCharacterCoordinatesRight.colliderect(treeCoordinates6) and not mainCharacterCoordinatesRight.colliderect(treeCoordinates5) and not mainCharacterCoordinatesRight.colliderect(treeCoordinates4) and not mainCharacterCoordinatesRight.colliderect(treeCoordinates3) and not mainCharacterCoordinatesRight.colliderect(treeCoordinates2) and not mainCharacterCoordinatesRight.colliderect(treeCoordinates1) and not mainCharacterCoordinatesRight.colliderect(crossCoordinates) and not mainCharacterCoordinatesLeft.colliderect(rightborder) and not mainCharacterCoordinatesRight.colliderect(wellCoordinates) and not mainCharacterCoordinatesRight.colliderect(trainCoordinates) and not mainCharacterCoordinatesRight.colliderect(graveyardCoordinates)):
        mainCharacterImage=pygame.image.load(mainCharacterRight[counter])
        counter = (counter + 1) % len(mainCharacterRight)
        x += 2
        CameraX += 2

    if (keys_pressed[pygame.K_UP] and not mainCharacterCoordinatesTop.colliderect(treeCoordinates8) and not mainCharacterCoordinatesTop.colliderect(treeCoordinates7) and not mainCharacterCoordinatesTop.colliderect(treeCoordinates6) and not mainCharacterCoordinatesTop.colliderect(treeCoordinates5) and not mainCharacterCoordinatesTop.colliderect(treeCoordinates4) and not mainCharacterCoordinatesTop.colliderect(treeCoordinates3) and not mainCharacterCoordinatesTop.colliderect(treeCoordinates2) and not mainCharacterCoordinatesTop.colliderect(treeCoordinates1) and not mainCharacterCoordinatesTop.colliderect(crossCoordinates) and not mainCharacterCoordinatesTop.colliderect(topborder) and not mainCharacterCoordinatesTop.colliderect(wellCoordinates) and not mainCharacterCoordinatesTop.colliderect(trainCoordinates) and not mainCharacterCoordinatesTop.colliderect(graveyardCoordinates)):
        mainCharacterImage=pygame.image.load(mainCharacterBack[counter])
        counter = (counter + 1) % len(mainCharacterBack)
        y -= 2
        CameraY -= 2

    if (keys_pressed[pygame.K_DOWN] and not mainCharacterCoordinatesBottom.colliderect(treeCoordinates8) and not mainCharacterCoordinatesBottom.colliderect(treeCoordinates7) and not mainCharacterCoordinatesBottom.colliderect(treeCoordinates6) and not mainCharacterCoordinatesBottom.colliderect(treeCoordinates5) and not mainCharacterCoordinatesBottom.colliderect(treeCoordinates4) and not mainCharacterCoordinatesBottom.colliderect(treeCoordinates3) and not mainCharacterCoordinatesBottom.colliderect(treeCoordinates2) and not mainCharacterCoordinatesBottom.colliderect(treeCoordinates1) and not mainCharacterCoordinatesBottom.colliderect(crossCoordinates) and not mainCharacterCoordinatesBottom.colliderect(bottomborder) and not mainCharacterCoordinatesBottom.colliderect(wellCoordinates)and not mainCharacterCoordinatesBottom.colliderect(trainCoordinates) and not mainCharacterCoordinatesBottom.colliderect(graveyardCoordinates)):
        mainCharacterImage=pygame.image.load(mainCharacterFront[counter])
        counter = (counter + 1) % len(mainCharacterFront)
        y += 2
        CameraY += 2

第二个问题是我是否应该为静止物体创建函数。例如,在这个时候,我有:

代码语言:javascript
复制
 crossImage1 = pygame.image.load('cross.png')
 gameDisplay.blit(crossImage1,( 680 - CameraX , 300 - CameraY))

我是否应该像下面看到的那样,将这些转换成像“mainCharacter”这样的函数?

代码语言:javascript
复制
def mainCharacter(x,y,CameraX,CameraY):
   gameDisplay.blit(mainCharacterImage,(x - CameraX,y - CameraY))

mainCharacter(x,y,CameraX,CameraY)

还是应该保留只用于移动对象的函数?

我也是新问有关我的代码问题,所以请在评论中,如果你觉得我的问题太混乱,无法回答。

这是我的全部代码:

代码语言:javascript
复制
import pygame
import random

pygame.init()
gameDisplay = pygame.display.set_mode((800,600))
pygame.display.set_caption("No Name")
clock = pygame.time.Clock()
pygame.key.set_repeat(1, 1)


pygame.mixer.music.load('09 Terras Theme (Final Fantasy VI).mp3')
pygame.mixer.music.play(-1) 

Background = pygame.image.load('desert.png')
wellImage = pygame.image.load('well.png')
trainbottomImage = pygame.image.load('trainbottom.png')
traintopImage = pygame.image.load('traintop.png')
mainCharacterImage = pygame.image.load('main character (front).png')


crossImage1 = pygame.image.load('cross.png')
crossImage2 = pygame.image.load('cross.png')
crossImage3 = pygame.image.load('cross.png')
crossImage4 = pygame.image.load('cross.png')
crossImage5 = pygame.image.load('cross.png')
crossImage6 = pygame.image.load('cross.png')
crossImage7 = pygame.image.load('cross.png')
crossImage8 = pygame.image.load('cross.png')


treebottomImage1 = pygame.image.load('bottomtree.png')
treebottomImage2 = pygame.image.load('bottomtree.png')
treebottomImage3 = pygame.image.load('bottomtree.png')
treebottomImage4 = pygame.image.load('bottomtree.png')
treebottomImage5 = pygame.image.load('bottomtree.png')
treebottomImage6 = pygame.image.load('bottomtree.png')
treebottomImage7 = pygame.image.load('bottomtree.png')
treebottomImage8 = pygame.image.load('bottomtree.png')


treetopImage1 = pygame.image.load('toptree.png')
treetopImage2 = pygame.image.load('toptree.png')
treetopImage3 = pygame.image.load('toptree.png')
treetopImage4 = pygame.image.load('toptree.png')
treetopImage5 = pygame.image.load('toptree.png')
treetopImage6 = pygame.image.load('toptree.png')
treetopImage7 = pygame.image.load('toptree.png')
treetopImage8 = pygame.image.load('toptree.png')


graveyard = pygame.image.load('graveyard front.png')


CameraX = 0
CameraY = 0
x = 626
y = 384
counter = 0

f = open('x.txt')
x = int(f.readline())

f = open('y.txt')
y = int(f.readline())

CameraX = x-400
CameraY = y-300


def mainCharacter(x,y,CameraX,CameraY):
    gameDisplay.blit(mainCharacterImage,(x - CameraX,y - CameraY))



Exit = False

while (Exit == False):

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            Exit = True
    mainCharacterImage = pygame.image.load('main character (front).png')
    mainCharacterLeft = ['main character (left-left leg).png','main character (left-left leg).png','main character (left-left leg).png','main character (left-left leg).png','main character (left).png','main character (left).png','main character (left).png','main character (left).png','main character (left-right leg).png','main character (left-right leg).png','main character (left-right leg).png','main character (left-right leg).png']
    mainCharacterRight = ['main character (right-left leg).png','main character (right-left leg).png','main character (right-left leg).png','main character (right-left leg).png','main character (right).png','main character (right).png','main character (right).png','main character (right).png','main character (right-right leg).png','main character (right-right leg).png','main character (right-right leg).png','main character (right-right leg).png']
    mainCharacterBack = ['main character (back-left leg).png','main character (back-left leg).png','main character (back-left leg).png','main character (back-left leg).png','main character (back).png','main character (back).png','main character (back).png','main character (back).png','main character (back-right leg).png','main character (back-right leg).png','main character (back-right leg).png','main character (back-right leg).png']
    mainCharacterFront = ['main character (front-left leg).png','main character (front-left leg).png','main character (front-left leg).png','main character (front-left leg).png','main character (front).png','main character (front).png','main character (front).png','main character (front).png','main character (front-right leg).png','main character (front-right leg).png','main character (front-right leg).png','main character (front-right leg).png']
    keys_pressed = pygame.key.get_pressed()
    mainCharacterCoordinates = pygame.Rect((x,y),(x+30,y+30))
    wellCoordinates = pygame.Rect((0,600),(33,34))
    trainCoordinates = pygame.Rect((-1000,20),(2000,54))
    crossCoordinates = pygame.Rect((680,300),(80,180))

    mainCharacterCoordinatesLeft = pygame.Rect((x,y+27),(1,5))
    mainCharacterCoordinatesRight = pygame.Rect((x+28,y+27),(1,5))
    mainCharacterCoordinatesTop = pygame.Rect((x+2,y+20),(26,5))
    mainCharacterCoordinatesBottom = pygame.Rect((x+2,y+27),(26,7))

    leftborder = pygame.Rect((-1200,-2000),(10,6000))
    rightborder = pygame.Rect((800,-2000),(10,6000))
    topborder = pygame.Rect((-1200,-200),(6000,10))
    bottomborder = pygame.Rect((-1200,800),(6000,10))

    treeCoordinates1 = pygame.Rect((-1200,300),(30,31))
    treeCoordinates2 = pygame.Rect((-800,500),(30,31))
    treeCoordinates3 = pygame.Rect((-400,400),(30,31))
    treeCoordinates4 = pygame.Rect((-600,400),(30,31))
    treeCoordinates5 = pygame.Rect((100,300),(30,31))
    treeCoordinates6 = pygame.Rect((500,600),(30,31))
    treeCoordinates7 = pygame.Rect((-1000,500),(30,31))
    treeCoordinates8 = pygame.Rect((-300,700),(30,31))

    graveyardCoordinates = pygame.Rect((630,350),(30,31))



    if (keys_pressed[pygame.K_LEFT] and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates8) and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates7) and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates6) and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates5) and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates4) and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates3) and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates2) and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates1) and not mainCharacterCoordinatesLeft.colliderect(crossCoordinates) and not mainCharacterCoordinatesLeft.colliderect(leftborder) and not mainCharacterCoordinatesLeft.colliderect(wellCoordinates) and not mainCharacterCoordinatesLeft.colliderect(trainCoordinates) and not mainCharacterCoordinatesLeft.colliderect(graveyardCoordinates)):
        mainCharacterImage=pygame.image.load(mainCharacterLeft[counter])
        counter = (counter + 1) % len(mainCharacterLeft)
        x -= 2
        CameraX -= 2

    if (keys_pressed[pygame.K_RIGHT] and not mainCharacterCoordinatesRight.colliderect(treeCoordinates8) and not mainCharacterCoordinatesRight.colliderect(treeCoordinates7) and not mainCharacterCoordinatesRight.colliderect(treeCoordinates6) and not mainCharacterCoordinatesRight.colliderect(treeCoordinates5) and not mainCharacterCoordinatesRight.colliderect(treeCoordinates4) and not mainCharacterCoordinatesRight.colliderect(treeCoordinates3) and not mainCharacterCoordinatesRight.colliderect(treeCoordinates2) and not mainCharacterCoordinatesRight.colliderect(treeCoordinates1) and not mainCharacterCoordinatesRight.colliderect(crossCoordinates) and not mainCharacterCoordinatesLeft.colliderect(rightborder) and not mainCharacterCoordinatesRight.colliderect(wellCoordinates) and not mainCharacterCoordinatesRight.colliderect(trainCoordinates) and not mainCharacterCoordinatesRight.colliderect(graveyardCoordinates)):
        mainCharacterImage=pygame.image.load(mainCharacterRight[counter])
        counter = (counter + 1) % len(mainCharacterRight)
        x += 2
        CameraX += 2

    if (keys_pressed[pygame.K_UP] and not mainCharacterCoordinatesTop.colliderect(treeCoordinates8) and not mainCharacterCoordinatesTop.colliderect(treeCoordinates7) and not mainCharacterCoordinatesTop.colliderect(treeCoordinates6) and not mainCharacterCoordinatesTop.colliderect(treeCoordinates5) and not mainCharacterCoordinatesTop.colliderect(treeCoordinates4) and not mainCharacterCoordinatesTop.colliderect(treeCoordinates3) and not mainCharacterCoordinatesTop.colliderect(treeCoordinates2) and not mainCharacterCoordinatesTop.colliderect(treeCoordinates1) and not mainCharacterCoordinatesTop.colliderect(crossCoordinates) and not mainCharacterCoordinatesTop.colliderect(topborder) and not mainCharacterCoordinatesTop.colliderect(wellCoordinates) and not mainCharacterCoordinatesTop.colliderect(trainCoordinates) and not mainCharacterCoordinatesTop.colliderect(graveyardCoordinates)):
        mainCharacterImage=pygame.image.load(mainCharacterBack[counter])
        counter = (counter + 1) % len(mainCharacterBack)
        y -= 2
        CameraY -= 2

    if (keys_pressed[pygame.K_DOWN] and not mainCharacterCoordinatesBottom.colliderect(treeCoordinates8) and not mainCharacterCoordinatesBottom.colliderect(treeCoordinates7) and not mainCharacterCoordinatesBottom.colliderect(treeCoordinates6) and not mainCharacterCoordinatesBottom.colliderect(treeCoordinates5) and not mainCharacterCoordinatesBottom.colliderect(treeCoordinates4) and not mainCharacterCoordinatesBottom.colliderect(treeCoordinates3) and not mainCharacterCoordinatesBottom.colliderect(treeCoordinates2) and not mainCharacterCoordinatesBottom.colliderect(treeCoordinates1) and not mainCharacterCoordinatesBottom.colliderect(crossCoordinates) and not mainCharacterCoordinatesBottom.colliderect(bottomborder) and not mainCharacterCoordinatesBottom.colliderect(wellCoordinates)and not mainCharacterCoordinatesBottom.colliderect(trainCoordinates) and not mainCharacterCoordinatesBottom.colliderect(graveyardCoordinates)):
        mainCharacterImage=pygame.image.load(mainCharacterFront[counter])
        counter = (counter + 1) % len(mainCharacterFront)
        y += 2
        CameraY += 2

    a = random.randrange(-3000,4000)
    b = random.randrange(-2000,3000)    

    battlefield = pygame.Rect((a,b),(10,10))


    if (mainCharacterCoordinates.colliderect(battlefield) and (keys_pressed[pygame.K_DOWN] or keys_pressed[pygame.K_UP] or keys_pressed[pygame.K_RIGHT] or keys_pressed[pygame.K_LEFT])):
        f = open('x.txt', 'w')
        f.write(str(x))
        f.close()

        f = open('y.txt', 'w')
        f.write(str(y))
        f.close()
        execfile('battlefield.py')
        Exit = True


    if (x <= 630 and):
        graveyard = pygame.image.load('graveyard left.png')
    if (x >= 660 and):
        graveyard = pygame.image.load('graveyard right.png')
    if(y <= 350 and ):
        graveyard = pygame.image.load('graveyard back.png')
    if(y >= 380 and ):
        graveyard = pygame.image.load('graveyard front.png')

    gameDisplay.blit(Background,(-2000 - CameraX, -600 - CameraY))
    gameDisplay.blit(trainbottomImage,(-1000 - CameraX ,25 - CameraY))
    gameDisplay.blit(wellImage,(0 - CameraX , 600 - CameraY))

    gameDisplay.blit(treebottomImage1,( -1200 - CameraX , 300 - CameraY))
    gameDisplay.blit(treebottomImage2,( -800 - CameraX , 500 - CameraY))
    gameDisplay.blit(treebottomImage3,( -400 - CameraX , 400 - CameraY))
    gameDisplay.blit(treebottomImage4,(  -600 - CameraX , 400 - CameraY))
    gameDisplay.blit(treebottomImage5,( 100 - CameraX , 300 - CameraY))
    gameDisplay.blit(treebottomImage6,( 500 - CameraX , 600 - CameraY))
    gameDisplay.blit(treebottomImage7,( -1000 - CameraX , 500 - CameraY))
    gameDisplay.blit(treebottomImage8,( -300 - CameraX , 700 - CameraY))



    gameDisplay.blit(crossImage1,( 680 - CameraX , 300 - CameraY))
    gameDisplay.blit(crossImage2,( 680 - CameraX , 350 - CameraY))
    gameDisplay.blit(crossImage3,( 680 - CameraX , 400 - CameraY))
    gameDisplay.blit(crossImage4,( 680 - CameraX , 450 - CameraY))
    gameDisplay.blit(crossImage5,( 730 - CameraX , 300 - CameraY))
    gameDisplay.blit(crossImage6,( 730 - CameraX , 350 - CameraY))
    gameDisplay.blit(crossImage7,( 730 - CameraX , 400 - CameraY))
    gameDisplay.blit(crossImage8,( 730 - CameraX , 450 - CameraY))

    gameDisplay.blit(graveyard,(630 - CameraX , 350 - CameraY))
    mainCharacter(x,y,CameraX,CameraY)

    gameDisplay.blit(treetopImage1,( -1200 - CameraX , 269 - CameraY))
    gameDisplay.blit(treetopImage2,( -800 - CameraX , 469 - CameraY))
    gameDisplay.blit(treetopImage3,( -400 - CameraX , 369 - CameraY))
    gameDisplay.blit(treetopImage4,(  -600 - CameraX , 369 - CameraY))
    gameDisplay.blit(treetopImage5,( 100 - CameraX , 269 - CameraY))
    gameDisplay.blit(treetopImage6,( 500 - CameraX , 569 - CameraY))
    gameDisplay.blit(treetopImage7,( -1000 - CameraX , 469 - CameraY))
    gameDisplay.blit(treetopImage8,( -300 - CameraX , 669 - CameraY))   


    gameDisplay.blit(traintopImage,(-1000 - CameraX ,-7 - CameraY))
    pygame.display.update()
    clock.tick(60)


pygame.quit()
quit()
EN

回答 2

Code Review用户

发布于 2016-02-03 04:53:06

您应该始终关闭您打开的任何文件。您可以通过使用上下文管理器来保证这一点。

代码语言:javascript
复制
with open("some_file_name") as f:
    x = int(f.readline())

这是一种安全(且干净)的方法,可以保证文件被关闭,无论在with块中发生了什么。

票数 8
EN

Code Review用户

发布于 2016-02-03 00:30:11

欢迎来到这里!

首先,你有很多图像的vars。考虑使用图像列表,例如:

代码语言:javascript
复制
CROSS_IMAGE_FILENAME = ['cross.png'] * 8 # or different list
crossImages = [pygame.image.load(filename) for filename in CROSS_IMAGE_FILENAME]

相机和当前位置应该分组为Points或其他什么东西,所以不用SomethingXSomethingY,而是something.xsomething.y

mainCharacter更好地命名为drawMainCharacter。在这里用动词作为函数名比较好。

Exit == False条件可以像not Exit那样写入

您真的想要读取主字符(前面).png每一个循环迭代吗?

使用列表而不是很多类似命名的变量。您的vars正是您必须写这么长的条件的原因:

代码语言:javascript
复制
if (keys_pressed[pygame.K_LEFT] and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates8) and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates7) and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates6) and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates5) and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates4) and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates3) and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates2) and not mainCharacterCoordinatesLeft.colliderect(treeCoordinates1) and not mainCharacterCoordinatesLeft.colliderect(crossCoordinates) and not mainCharacterCoordinatesLeft.colliderect(leftborder) and not mainCharacterCoordinatesLeft.colliderect(wellCoordinates) and not mainCharacterCoordinatesLeft.colliderect(trainCoordinates) and not mainCharacterCoordinatesLeft.colliderect(graveyardCoordinates)):

可以写成这样的东西:

代码语言:javascript
复制
if keys_pressed[pygame.K_LEFT] not any(mainCharacterCoordinatesLeft.colliderect(obj) for obj in objects):

其中的对象是所有游戏中的对象的列表,比如树和房子。

所有blits都应该移动到单独的函数,比如drawScene。

票数 6
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/118703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档