Executando verificação de segurança...
13

[PURE MAGIC][INDIE][PYGAME] Meu início na criação de jogos.

Pure Magic

Eai galera tudo bem? Faz tempo que não venho aqui para mostrar algo, e cá estou eu mostrando um novo hobbie adquirido por mim.
A criação de jogos.

O começo

O começo

Um video mostrando como está as primeiras semanas

Então, começou assim, sempre gostei de tibia, e quando comecei a programar tinha aprendido algo em lua, bem pouca coisa mas não aprofundei, depois de muito tempo iniciei com python para web usando django, e uso até hoje para criar algumas aplicações, e gosto muito, mas já indico, python é dificil de achar emprego, não sei se só pra mim, mas o python para web vai na contramão de tudo que tem rolado na web hoje em dia, mas, não estou aqui para falar sobre isso, o intuito é mostrar meu trabalho com o pygame.

Primeiro comecei criando as sprites das barras de life/mana e skill, tudo de minha autoria,junto fiz algumas skills exemplo para coloca-lá em seus devidos lugares tudo com funções, calculadas para tais posições.

BAR

O próximo passo que ainda estou pensando como vou fazer, porém logo logo meu bloqueio criativo some e eu volto com tudo.

MINIMAP

A barra de configurações vai ser simplificada, aprendi a fazer pequeno, organizar, melhorar, um ciclo infinito que nunca acaba.

OPTION BAR

E aquela parte onde todo mundo corre atrás igual um loco para poder crescer dentro do jogo, a aba de inventário.

INVENTORY

Como vai ficar tudo isso? Assim

SCREEN_1

SCREEN_2

Eu preciso de ajuda para melhorar, entender como funciona um jogo online, como se mantém todo o contexto de um "mundo", caso alguém programe jogos, poderia me dar uma ajuda.

Estou muito contente com o que já consegui.

Carregando publicação patrocinada...
2

Não é minha área, mas achei legal a iniciativa, a criação de sprites próprios e gostei de conhecer mais uma biblioteca interessante. PyGame. Vai em frente e espero ver a evolução do jogo.

1
0

Hoje consegui fazer mais uma feature, o minimap. Está funcionando corretamente, mais pra frente vou ter que mudar bastante coisa, relacionar com os tiles na posição z, mas o básico já está dando certo.

MINIMAP

2

Estou presumindo que se trata de um MMORPG. Inicialmente, é essencial ter um Redis para armazenar temporariamente dados do usuário, como localização e bonificações. Em relação ao banco de dados, considere escolher entre SQL ou NoSQL e defina claramente o fluxo de cadastro do jogo. Evite permitir cálculos do lado do cliente para evitar possíveis trapaças. Parabéns pelo seu projeto; estou ansioso para acompanhá-lo!

2

Massa muito obrigado, tenho pensando muito sobre como ficaria a estrutura de código até por que não manjo, muito, estou tentando reduzir bastante as gambiarras e ir melhorando o que já tem, mas em relação ao Redis para ter cache é uma parte bem importante por que sim vai precisar caso eu queira deixar online, vou ter que estudar bastante ainda pra isso hehe.

1

Hoje consegui fazer mais uma feature, o minimap. Está funcionando corretamente, mais pra frente vou ter que mudar bastante coisa, relacionar com os tiles na posição z, mas o básico já está dando certo.

MINIMAP

2

Show! Parace está ganhando forma, parabéns pelo trabalho.

Uma dica referente ao bloqueio criativo, pare de implementar o jogo e vá jogar outros jogos, isso ajuda a ter percepções de artes, jogabilidade e mecânicas que as vezes combinada de 2 ou mais jogos pode te dar um insight valioso para construção do seu game.

Referente a parte da arquitetural, recomendo fazer o uso de uma camada de cache, se for haver modo multiplayer, certamente irá precisar para armazenar informações como:

  • Sessão do jogador
  • Status atual do player
  • Metadados do Mapa
  • Etc

Assim como as logica de combate, faça o processo de do algoritmo de combate ao lado do server-side evitando assim algum possível manipulação (cheat)

1

Aos poucos ta ganhando forma sim, puxado viu.

To tentando fazer isso mesmo jogando algumas coisas, mas fico sem saber poder onde ir na complexidade sabe, pensar como algo pode funcionar, exemplo os que você deu, não ter ideia por onde começar.

Mas aos poucos estou indo e melhorando ,trazendo funcionalidades, melhorei a barra de hotkeys colocando os cooldown's, porém preciso otimizar muito o código.

COOLDOWN

E como poderia faze a parte do combate ser do lado do servidor, eu fico meio confuso.

2

Não conheço o contexto do seu código. Mas imagino que até o momento você tem apenas o Client (Game) não tem API's para gerenciar, criação de conta, login, compra de itens, NPC's e etc.

Não sei o tamanho do escopo que você irá determinar, mas se for dispor isso de alguma forma MP, PVP, PVE, imagino que terá que ter não somente o lado do game, mas alocar lógicas no server side.

Ex: Player, ele tem um level, esse level tem que armazenar em algum local. Redis é apenas para camada de caching, um banco como Firebase ou MongoDb seria o suficiente para resolver o sua necessidade, banco de dados NoSQL, que permite armazenamento de documentos.

1
1
1

Estou na parte visual primeiro, em relação ao personagem, depois vou criar a parte do combate.

Eu nem pensei como posso começar a fazer isso sabe, vc havia comentado pra fazer essa parte do lado do servidor mas eu não consigo pensar como faria isso.

2

Se for multiplayer, primeira coisa é aprender a trabalhar com sockets, Dê uma pesquisada também para entender como funciona a teoria da coisa.

Se for apenas Singleplayer, esquece tudo que falamos sobre servidor, só vai ser um game simples do lado do cliente.

Usei esse propmt no ChatGPT, pode usar também para testar alguns conceitos isolados se precisar.

Create an example game in python with pygame lib. Game multiplayer client and server side in python

server.py

import socket
import threading

# Server configuration
host = '127.0.0.1'
port = 55555

# Create a socket
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((host, port))
server.listen()

# List to store connected clients
clients = []

def broadcast(message, client_socket):
    for client in clients:
        if client != client_socket:
            try:
                client.send(message)
            except:
                clients.remove(client)

def handle_client(client):
    while True:
        try:
            message = client.recv(1024)
            broadcast(message, client)
        except:
            # Remove the client if disconnected
            clients.remove(client)
            break

def main():
    print(f"Server is listening on {host}:{port}")

    while True:
        client, address = server.accept()
        print(f"Accepted connection from {address}")

        # Add the client to the list
        clients.append(client)

        # Start a new thread to handle the client
        client_thread = threading.Thread(target=handle_client, args=(client,))
        client_thread.start()

if __name__ == "__main__":
    main()

client.py

import socket
import threading
import pygame

# Client configuration
host = '127.0.0.1'
port = 55555

# Initialize Pygame
pygame.init()

# Set up the screen
WIDTH, HEIGHT = 600, 400
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Chat Client")

# Colors
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)

# Fonts
font = pygame.font.Font(None, 36)

# Input box
input_rect = pygame.Rect(10, 350, 480, 25)
input_color = pygame.Color('lightskyblue3')
input_text = ""

# Create a socket
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect((host, port))

def receive():
    while True:
        try:
            message = client.recv(1024).decode('utf-8')
            print(message)  # Display the message on the console for now
        except:
            print("An error occurred!")
            client.close()
            break

def draw_input_box():
    pygame.draw.rect(screen, input_color, input_rect, 0)
    pygame.draw.rect(screen, BLACK, input_rect, 2)
    text_surface = font.render(input_text, True, BLACK)
    screen.blit(text_surface, (input_rect.x + 5, input_rect.y + 5))

def main():
    receive_thread = threading.Thread(target=receive)
    receive_thread.start()

    clock = pygame.time.Clock()
    running = True

    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RETURN:
                    # Send the message to the server
                    client.send(input_text.encode('utf-8'))
                    input_text = ""
                elif event.key == pygame.K_BACKSPACE:
                    input_text = input_text[:-1]
                else:
                    input_text += event.unicode

        screen.fill(WHITE)
        draw_input_box()
        pygame.display.flip()
        clock.tick(30)

    client.close()

if __name__ == "__main__":
    main()

1

Eu quero muito que seja online, mas tem muita coisa pra fazer ainda, tem muito sprite pra desenhar, mas por enquanto vou fazer algo pequeno, offline, e depois escalar, e sim eu realmente preciso deixar pronto pra ficar online. Preciso pensar na arquitetura que vou levar esse projeto, as vezes eu acho que o código ta ficando muito "feio" e queria melhorar nisso, mas sem experiência fica um pouco foda.

1

Hoje consegui fazer mais uma feature, o minimap. Está funcionando corretamente, mais pra frente vou ter que mudar bastante coisa, relacionar com os tiles na posição z, mas o básico já está dando certo.

MINIMAP