如何用源码编辑器做我的世界

如何用源码编辑器做我的世界我的世界小游戏使用方法 移动 前进 W 后退 S 向左 A 向右 D 环顾四周 鼠标 跳起 空格键 切换飞行模式 Tab 选择建筑材料 砖 1 草 2 沙子 3 删除建筑 鼠标左键单击 创建建筑块 鼠标右键单击 ESC 退出程序 完整程序包请通过文末地址下载 程序运行截图如下 from future import division import sys import math

我的世界小游戏使用方法:

移动

前进:W,后退:S,向左:A,向右:D,环顾四周:鼠标,跳起:空格键,切换飞行模式:Tab;

选择建筑材料

砖:1,草:2,沙子:3,删除建筑:鼠标左键单击,创建建筑块:鼠标右键单击

ESC退出程序。

完整程序包请通过文末地址下载,程序运行截图如下:

0ea2ab5816729731bf634e27560131e6.png

from __future__ import division

import sys

import math

import random

import time

from collections import deque

from pyglet import image

from pyglet.gl import *

from pyglet.graphics import TextureGroup

from pyglet.window import key, mouse

TICKS_PER_SEC = 60

# Size of sectors used to ease block loading.

SECTOR_SIZE = 16

WALKING_SPEED = 5

FLYING_SPEED = 15

GRAVITY = 20.0

MAX_JUMP_HEIGHT = 1.0 # About the height of a block.

# To derive the formula for calculating jump speed, first solve

# v_t = v_0 + a * t

# for the time at which you achieve maximum height, where a is the acceleration

# due to gravity and v_t = 0. This gives:

# t = - v_0 / a

# Use t and the desired MAX_JUMP_HEIGHT to solve for v_0 (jump speed) in

# s = s_0 + v_0 * t + (a * t^2) / 2

JUMP_SPEED = math.sqrt(2 * GRAVITY * MAX_JUMP_HEIGHT)

TERMINAL_VELOCITY = 50

PLAYER_HEIGHT = 2

if sys.version_info[0] >= 3:

xrange = range

def cube_vertices(x, y, z, n):

""" Return the vertices of the cube at position x, y, z with size 2*n.

"""

return [

x-n,y+n,z-n, x-n,y+n,z+n, x+n,y+n,z+n, x+n,y+n,z-n, # top

x-n,y-n,z-n, x+n,y-n,z-n, x+n,y-n,z+n, x-n,y-n,z+n, # bottom

x-n,y-n,z-n, x-n,y-n,z+n, x-n,y+n,z+n, x-n,y+n,z-n, # left

x+n,y-n,z+n, x+n,y-n,z-n, x+n,y+n,z-n, x+n,y+n,z+n, # right

x-n,y-n,z+n, x+n,y-n,z+n, x+n,y+n,z+n, x-n,y+n,z+n, # front

x+n,y-n,z-n, x-n,y-n,z-n, x-n,y+n,z-n, x+n,y+n,z-n, # back

]

def tex_coord(x, y, n=4):

""" Return the bounding vertices of the texture square.

"""

m = 1.0 / n

dx = x * m

dy = y * m

return dx, dy, dx + m, dy, dx + m, dy + m, dx, dy + m

def tex_coords(top, bottom, side):

""" Return a list of the texture squares for the top, bottom and side.

"""

top = tex_coord(*top)

bottom = tex_coord(*bottom)

side = tex_coord(*side)

result = []

result.extend(top)

result.extend(bottom)

result.extend(side * 4)

return result

TEXTURE_PATH = 'texture.png'

GRASS = tex_coords((1, 0), (0, 1), (0, 0))

SAND = tex_coords((1, 1), (1, 1), (1, 1))

BRICK = tex_coords((2, 0), (2, 0), (2, 0))

STONE = tex_coords((2, 1), (2, 1), (2, 1))

FACES = [

( 0, 1, 0),

( 0,-1, 0),

(-1, 0, 0),

( 1, 0, 0),

( 0, 0, 1),

( 0, 0,-1),

]

def normalize(position):

""" Accepts `position` of arbitrary precision and returns the block

containing that position.

Parameters

----------

position : tuple of len 3

Returns

-------

block_position : tuple of ints of len 3

"""

x, y, z = position

x, y, z = (int(round(x)), int(round(y)), int(round(z)))

return (x, y, z)

def sectorize(position):

""" Returns a tuple representing the sector for the given `position`.

Parameters

----------

position : tuple of len 3

Returns

-------

sector : tuple of len 3

"""

x, y, z = normalize(position)

x, y, z = x // SECTOR_SIZE, y // SECTOR_SIZE, z // SECTOR_SIZE

return (x, 0, z)

class Model(object):

def __init__(self):

# A Batch is a collection of vertex lists for batched rendering.

self.batch = pyglet.graphics.Batch()

# A TextureGroup manages an OpenGL texture.

self.group = TextureGroup(image.load(TEXTURE_PATH).get_texture())

# A mapping from position to the texture of the block at that position.

# This defines all the blocks that are currently in the world.

self.world = {}

# Same mapping as `world` but only contains blocks that are shown.

self.shown = {}

# Mapping from position to a pyglet `VertextList` for all shown blocks.

self._shown = {}

# Mapping from sector to a list of positions inside that sector.

self.sectors = {}

# Simple function queue implementation. The queue is populated with

# _show_block() and _hide_block() calls

self.queue = deque()

self._initialize()

def _initialize(self):

""" Initialize the world by placing all the blocks.

"""

n = 80 # 1/2 width and height of world

s = 1 # step size

y = 0 # initial y height

for x in xrange(-n, n + 1, s):

for z in xrange(-n, n + 1, s):

# create a layer stone an grass everywhere.

self.add_block((x, y - 2, z), GRASS, immediate=False)

self.add_block((x, y - 3, z), STONE, immediate=False)

if x in (-n, n) or z in (-n, n):

# create outer walls.

for dy in xrange(-2, 3):

self.add_block((x, y + dy, z), STONE, immediate=False)

# generate the hills randomly

o = n - 10

for _ in xrange(120):

a = random.randint(-o, o) # x position of the hill

b = random.randint(-o, o) # z position of the hill

c = -1 # base of the hill

h = random.randint(1, 6) # height of the hill

s = random.randint(4, 8) # 2 * s is the side length of the hill

知秋君
上一篇 2024-11-09 09:48
下一篇 2024-11-13 14:02

相关推荐