问:如何为平台游戏赚钱?

时间:2020-05-08 22:47:06

标签: python pygame

我做了一个简单的平台游戏,我想学习如何制作基本的收集硬币系统 在我的平台上产生硬币的地方,当我消费时,我可以通过点数系统获得点数 这是我的比赛票价:Game 我已经在youtube上查看了如何执行此操作,但没有任何教程对此进行了介绍,但我发现了1,但他们并没有解释我如何执行此操作, 和我的脚本:

import pygame
import random
import time
pygame.init()


# screen
window = pygame.display.set_mode((500,500))
pygame.display.set_caption("hyeo")
playerx = 350
playery = 250


# player
class player:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.isJump = False
        self.JumpCount = 10
        self.fall = 0
        self.speed = 5
        self.color = color
        self.rect = pygame.Rect(x,y,height,width)
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window, self.color, self.rect)

# enemy class
class enemys:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.color = color
        self.rect = pygame.Rect(x,y,height,width)
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window, self.color, self.rect)


# FPS
FPS = 60
clock = pygame.time.Clock()

#  Colors
NiceBlue = (46, 196, 187)
NiceGreen = (48, 196, 46)

# define players by name
playerman = player(40,390,30,30, NiceBlue)
enemy1 = enemys(150,390,150,10, NiceGreen)
enemy2 = enemys(350,300,150,10, NiceGreen)
enemy3 = enemys(70,250,150,10, NiceGreen)
enemy4 = enemys(-1000,480,1900,60, NiceGreen)

# put them in a list so we can call all of them at the same time
enemies  = [enemy1,enemy2,enemy3,enemy4]

# Coins my g

# main Loop
runninggame = True
while runninggame:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            runninggame = False



    keys = pygame.key.get_pressed()
    # Right and Left
    if playerman.y < 250:
        playerman.y += 1
        for enemy in enemies:
            enemy.y += playerman.speed

    # FOR DOWN AND UP
    if playerman.y > 450: #somewhere close to the bottom of the screen
        playerman.y -= playerman.fall  #reverse direction
        for enemy in enemies:
            enemy.y -= playerman.fall


    if keys[pygame.K_LEFT]:
        playerman.x -= playerman.speed
        if playerman.x < 100:
            playerman.x += playerman.speed
            for enemy in enemies:
                enemy.x += playerman.speed

    if keys[pygame.K_RIGHT]:
        playerman.x += playerman.speed
        if playerman.x > 400:
            playerman.x -= playerman.speed
            for enemy in enemies:
                enemy.x -= playerman.speed

    if not playerman.isJump:
        playerman.y += playerman.fall
        playerman.fall += 1
        collide = False
        for enemy in enemies:
            if playerman.rect.colliderect(enemy.rect):
                collide = True
                playerman.y = enemy.rect.top - playerman.height +1
                if playerman.rect.right > enemy.rect.left and playerman.rect.left < enemy.rect.left - playerman.width:
                    playerman.x = enemy.rect.left - player.width
                if playerman.rect.left < enemy.rect.right and playerman.rect.right > enemy.rect.right + playerman.width:
                    playerman.x = enemy.rect.right
                break

        if playerman.rect.bottom >= 500:
            collide = True
            playerman.isJump = False
            playerman.JumpCount = 10
            playerman.y = 500 - playerman.height


        if collide:
            if keys[pygame.K_SPACE]:
                playerman.isJump = True
            playerman.fall = 0
    else:
        if playerman.JumpCount > 0:
            playerman.y -= (playerman.JumpCount*abs(playerman.JumpCount))*0.4
            playerman.JumpCount -= 1
        else:
            playerman.isJump = False
            playerman.JumpCount = 10


    window.fill((0,0,0))
    playerman.draw()
    enemy1.draw()
    enemy2.draw()
    enemy3.draw()
    enemy4.draw()
    pygame.display.update()
pygame.quit()



















1 个答案:

答案 0 :(得分:2)

就像@GrahamOrmond所说的那样,创建一个硬币类,实际上您可以使用相同的类,但是这取决于您,创建一个新列表并像敌人一样创建硬币。遍历它们并检查if playerman.rect.colliderect(coin.rect):,如果它碰撞了,将其加到分数上并从列表中删除,您可以使用del Coin_list[coin_index]来删除硬币(硬币索引是列表中关于数字的位置)是)。

先尝试一下,向我们展示您的尝试,我们将为您提供帮助


太好了,看起来还不错,我只能看到2个问题,

1)您需要使用滚动条移动硬币,这很容易,与敌人相同,但是带有硬币,请让我们这样做

2)对于碰撞,您与敌人的行为相同,如果发生碰撞,请在顶部移动,这不是您想要的,您希望它消失并通过它

对于碰撞,您必须使用一种先进的技术,即向后循环硬币

for i in range(len(Coins_list)-1,-1,-1):
    if playerman.rect.colliderect(coin.rect):
        del Coins_list[i]
        score += 1

这是因为当您从列表中删除某项内容时,所有内容都会向下移动以填充它,例如如果删除第3个元素,则第4个元素现在变为第3个元素。因此,如果您遍历所有这些元素,并且删除了第3个,则当您移至第4个时,实际上是第5个,因为第4个移至第3个。因此,您最终跳过了一个,并且由于尝试获取最后一个减少了一个的元素而收到索引错误。因此,向后表示如果删除一个,则已经检查的对象将被移动,而hvanet的对象将保持不变。

对于文本,请使用变量score(如上)并将其设置为0。文本被硬编码为0,因此您希望它是得分,因此它被更改了

score = 0
text = font.render('Score = ' + str(score), True, NiceOlive)
textRect = text.get_rect()  
textRect.center = (100, 40)

我还将此添加到了score+= 1

下的硬币的碰撞中

现在您可能会注意到硬币并没有消失,这是因为您单独绘制它们,只想在列表中绘制它们就可以绘制

    window.fill((0,0,0))
    window.blit(text,textRect)
    for coin in Coins_list:
        coin.draw()

    playerman.draw()
    for enemey in enemies:
        enemy.draw()

这是完整的代码

import pygame
import random
import time 
pygame.init()



# ------------------------------------------------------------------------------------------VV window screen size
window = pygame.display.set_mode((500,500))
pygame.display.set_caption("DUDE RUFAIDA UGLY ASS HELL")
# ------------------------------------------------------------------------------------------
# --------------------------------------------VV coins class
class coins:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.color = color
        self.rect = pygame.Rect(x,y,height,width)
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window, NiceOlive, self.rect)

# ------------------------------------------------------------------------------------------



# --------------------------------------VVV player class

# draw the player
class player:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.isJump = False
        self.JumpCount = 10
        self.speed = 5
        self.fall = 0
        self.color = color
        self.rect = pygame.Rect(x,y,height,width)
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window, self.color, self.rect)
# ------------------------------------------------------------------------------------------

# ------------------------------------------VV enemy class

class enemys:
    def __init__(self,x,y,height,width,color):
        self.x = x
        self.y = y
        self.height = height
        self.width = width
        self.color = color
        self.rect = pygame.Rect(x,y,height,width)
    def draw(self):
        self.rect.topleft = (self.x,self.y)
        pygame.draw.rect(window, self.color, self.rect)
# ------------------------------------------------------------------------------------------

# --------------------------VV frames per sec
# FPS
FPS = 60
clock = pygame.time.Clock()
# ------------------------------------------------------------------------------------------
# ---------VV colors

# COLORS
NiceYellow = (255,255,0)
NiceOlive = (0, 255, 0)
# ------------------------------------------------------------------------------------------

# ----------------------------VV define enemy and players xx,y,height and colors
# define enemy and player class
playerman = player(40,390,30,30, NiceOlive)
enemy1 = enemys(150,390,100,10, NiceYellow)
enemy2 = enemys(300,300,100,10, NiceYellow)
enemy3 = enemys(80,250,100,10, NiceYellow)
enemy4 = enemys(-5000,490,100000,100, NiceYellow)

enemies = [enemy1,enemy2,enemy3,enemy4]
# ------------------------------------------------------------------------------------------


# --------------------------define coins colors and width,heights anD coins LIST
coin1 = coins(250,250,20,20,NiceOlive)
coin2 = coins(350,350,20,20,NiceOlive)
coin3  = coins(300,300,20,20,NiceOlive)
coin4 = coins(150,150,20,20,NiceOlive)
coin5  = coins(50,390,20,20,NiceOlive)
Coins_list = [coin1,coin2,coin3,coin4,coin5]   
# ------------------------------------------------------------------------------------------


# -----------VV scoring 
# display scoring
font = pygame.font.Font('freesansbold.ttf', 32)
score = 0
text = font.render('Score = ' + str(score), True, NiceOlive)
textRect = text.get_rect()  
textRect.center = (100, 40)
# ------------------------------------------------------------------------------------------
# main loop
runninggame = True
while runninggame:
    clock.tick(FPS)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            runninggame = False
# -----------------------Draw the players and coins and enemys
    window.fill((0,0,0))
    window.blit(text,textRect)
    for coin in Coins_list:
        coin.draw()

    playerman.draw()
    for enemy in enemies:
        enemy.draw()

# ------------------------------------------------------------------------------------------

# --------------------------# VV screen movements
    if playerman.y < 250:
        playerman.y += 1
        for enemy in enemies:
            enemy.y += playerman.speed
        for coin in Coins_list:
            coin.y += playerman.speed

    if playerman.y > 450:
        playerman.y -= playerman.fall
        for enemy in enemies:
            enemy.y -= playerman.fall
        for coin in Coins_list:
            coin.y -= playerman.fall

# ------------------------------------------------------------------------------------------
# ----------------------------VV player keys and screen movements
    keys = pygame.key.get_pressed()


    if keys[pygame.K_LEFT]:
        playerman.x -= playerman.speed
        if playerman.x < 100:
            playerman.x += playerman.speed
            for enemy in enemies:
                enemy.x += playerman.speed
            for coin in Coins_list:
                coin.x += playerman.speed



    if keys[pygame.K_RIGHT]:
        playerman.x += playerman.speed
        if playerman.x > 400:
            playerman.x -= playerman.speed
            for enemy in enemies:
                enemy.x -= playerman.speed
            for coin in Coins_list:
                coin.x -= playerman.speed
# ------------------------------------------------------------------------------------------

# ---------------------------collisions with player and enemy
    if not playerman.isJump:
        playerman.y += playerman.fall
        playerman.fall += 1
        collide = False
        for enemy in enemies:
            if playerman.rect.colliderect(enemy.rect):
                collide = True
                playerman.y = enemy.rect.top - playerman.height + 1
                if playerman.rect.right > enemy.rect.left and playerman.rect.left < enemy.rect.left - playerman.width:
                    playerman.x = enemy.rect.left - playerman.width
                if playerman.rect.left < enemy.rect.right and playerman.rect.right > enemy.rect.right + playerman.width:
                    playerman.x = enemy.rect.right
 # ------------------------------------------------------------------------------------------
# ---------------------------------collision with coins and player     
        for i in range(len(Coins_list)-1,-1,-1):
            if playerman.rect.colliderect(Coins_list[i].rect):
                del Coins_list[i]
                score += 1
                text = font.render('Score = ' + str(score), True, NiceOlive)
                textRect = text.get_rect()  
                textRect.center = (100, 40)                
# ------------------------------- here is the problem I said if playerman.rect.colliderect coin1 it should then collide and delete the coin1 from coin list and then it should add it in to the score 1 point 


        if playerman.rect.bottom >= 500:
            collide = True
            playerman.isJump = False
            playerman.JumpCount = 10
            playerman.y = 500 - playerman.height
        if collide:
            if keys[pygame.K_SPACE]:
                playerman.isJump = True
            playerman.fall = 0

    else:
        if playerman.JumpCount > 0:
            playerman.y -= (playerman.JumpCount*abs(playerman.JumpCount))*0.3
            playerman.JumpCount -= 1
        else:
            playerman.isJump = False
            playerman.JumpCount = 10


    pygame.display.update()
pygame.quit()