Arcade-re váltás
This commit is contained in:
2
mkenv.sh
2
mkenv.sh
@@ -1,2 +1,2 @@
|
||||
python -m venv venv
|
||||
./venv/bin/pip install pygame
|
||||
./venv/bin/pip install arcade
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
python -m venv venv
|
||||
.\venv\Scripts\pip install pygame
|
||||
.\venv\Scripts\pip install arcade
|
||||
|
||||
BIN
res/sprite/handcursor.png
Normal file
BIN
res/sprite/handcursor.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 168 B |
@@ -1,12 +1,8 @@
|
||||
import pygame
|
||||
import arcade
|
||||
|
||||
sprites = {
|
||||
"louisu": pygame.image.load("res/sprite/louisu.png"),
|
||||
"louisd": pygame.image.load("res/sprite/louisd.png"),
|
||||
"louisl": pygame.image.load("res/sprite/louisl.png"),
|
||||
"louisb": pygame.image.load("res/sprite/louisb.png"),
|
||||
"louisu": arcade.load_texture("res/sprite/louisu.png"),
|
||||
"louisd": arcade.load_texture("res/sprite/louisd.png"),
|
||||
"louisl": arcade.load_texture("res/sprite/louisl.png"),
|
||||
"louisb": arcade.load_texture("res/sprite/louisb.png"),
|
||||
}
|
||||
|
||||
|
||||
def convert():
|
||||
for name, image in sprites.items():
|
||||
sprites[name] = image.convert_alpha()
|
||||
@@ -15,5 +15,5 @@ def switch_gamestate(state):
|
||||
def update(dt):
|
||||
gamestates[gamestate].update(dt)
|
||||
|
||||
def draw(screen):
|
||||
gamestates[gamestate].draw(screen)
|
||||
def draw(game):
|
||||
gamestates[gamestate].draw(game)
|
||||
|
||||
@@ -6,6 +6,6 @@ def switch():
|
||||
def update(dt):
|
||||
gamestate.switch_gamestate("title")
|
||||
|
||||
def draw(screen):
|
||||
def draw():
|
||||
pass
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import arcade
|
||||
import assets
|
||||
|
||||
def switch():
|
||||
@@ -6,7 +7,19 @@ def switch():
|
||||
def update(dt):
|
||||
pass
|
||||
|
||||
def draw(screen):
|
||||
screen.fill("blue")
|
||||
screen.blit(assets.sprites["louisu"], (0, 0))
|
||||
def draw(game):
|
||||
arcade.draw_rect_filled(
|
||||
arcade.LBWH(0, 0, game.screen_width, game.screen_height),
|
||||
arcade.color.BLUE,
|
||||
)
|
||||
|
||||
arcade.draw_texture_rect(
|
||||
assets.sprites["louisu"],
|
||||
arcade.LBWH(
|
||||
0,
|
||||
0,
|
||||
assets.sprites["louisu"].width,
|
||||
assets.sprites["louisu"].height
|
||||
),
|
||||
pixelated=True
|
||||
)
|
||||
|
||||
141
src/main.py
141
src/main.py
@@ -1,53 +1,126 @@
|
||||
import pygame
|
||||
import arcade
|
||||
import assets
|
||||
import gamestate
|
||||
|
||||
pygame.init()
|
||||
SCREEN_WIDTH = 256
|
||||
SCREEN_HEIGHT = 224
|
||||
|
||||
GAME_WIDTH = 256
|
||||
GAME_HEIGHT = 224
|
||||
class TextureRenderer:
|
||||
def __init__(self, ctx):
|
||||
self.ctx = ctx
|
||||
|
||||
screen = pygame.display.set_mode((GAME_WIDTH, GAME_HEIGHT), pygame.RESIZABLE)
|
||||
pygame.display.set_caption("Rick Roll To The Moon")
|
||||
clock = pygame.time.Clock()
|
||||
running = True
|
||||
dt = 0
|
||||
self.program = ctx.program(
|
||||
vertex_shader="""
|
||||
#version 330
|
||||
|
||||
game_screen = pygame.Surface((GAME_WIDTH, GAME_HEIGHT))
|
||||
in vec2 in_vert;
|
||||
in vec2 in_uv;
|
||||
|
||||
assets.convert()
|
||||
out vec2 uv;
|
||||
|
||||
while running:
|
||||
for event in pygame.event.get():
|
||||
if event.type == pygame.QUIT:
|
||||
running = False
|
||||
uniform vec2 screen_size;
|
||||
uniform vec4 bounds;
|
||||
|
||||
void main() {
|
||||
// Convert quad coordinates from [-1, 1] to [0, 1]
|
||||
vec2 local = in_vert * 0.5 + 0.5;
|
||||
|
||||
// bounds = x, y, width, height in pixels
|
||||
vec2 pixel_pos = bounds.xy + local * bounds.zw;
|
||||
|
||||
// Convert pixels to NDC
|
||||
vec2 ndc = pixel_pos / screen_size * 2.0 - 1.0;
|
||||
|
||||
gl_Position = vec4(ndc, 0.0, 1.0);
|
||||
uv = in_uv;
|
||||
}
|
||||
""",
|
||||
fragment_shader="""
|
||||
#version 330
|
||||
|
||||
uniform sampler2D tex;
|
||||
|
||||
in vec2 uv;
|
||||
out vec4 color;
|
||||
|
||||
void main() {
|
||||
color = texture(tex, uv);
|
||||
}
|
||||
""",
|
||||
)
|
||||
|
||||
self.quad = arcade.gl.geometry.quad_2d()
|
||||
|
||||
def render(self, texture, x, y, width, height):
|
||||
self.program["screen_size"] = (self.ctx.screen.width,
|
||||
self.ctx.screen.height)
|
||||
self.program["bounds"] = (x, y, width, height)
|
||||
|
||||
texture.use(0)
|
||||
self.program["tex"] = 0
|
||||
|
||||
self.quad.render(self.program)
|
||||
|
||||
class Game(arcade.Window):
|
||||
def __init__(self):
|
||||
super().__init__(
|
||||
SCREEN_WIDTH,
|
||||
SCREEN_HEIGHT,
|
||||
"Rick Roll To The Moon",
|
||||
resizable=True,
|
||||
)
|
||||
|
||||
self.screen_width = SCREEN_WIDTH
|
||||
self.screen_height = SCREEN_HEIGHT
|
||||
|
||||
self.game_texture = self.ctx.texture(
|
||||
(SCREEN_WIDTH, SCREEN_HEIGHT),
|
||||
components=4,
|
||||
)
|
||||
self.game_texture.filter = (self.ctx.NEAREST, self.ctx.NEAREST)
|
||||
|
||||
self.framebuffer = self.ctx.framebuffer(
|
||||
color_attachments=[self.game_texture],
|
||||
)
|
||||
|
||||
self.renderer = TextureRenderer(self.ctx)
|
||||
|
||||
def on_update(self, dt):
|
||||
gamestate.update(dt)
|
||||
gamestate.draw(game_screen)
|
||||
|
||||
screen.fill((0, 0, 0))
|
||||
def on_draw(self):
|
||||
self.framebuffer.use()
|
||||
self.framebuffer.clear()
|
||||
self.ctx.viewport = (0, 0, SCREEN_WIDTH, SCREEN_HEIGHT)
|
||||
|
||||
scale = min(
|
||||
screen.get_width() // GAME_WIDTH,
|
||||
screen.get_height() // GAME_HEIGHT
|
||||
)
|
||||
scale = max(1, scale)
|
||||
gamestate.draw(self)
|
||||
|
||||
scaled_width = GAME_WIDTH * scale
|
||||
scaled_height = GAME_HEIGHT * scale
|
||||
self.use()
|
||||
self.clear()
|
||||
self.ctx.viewport = (0, 0, self.width, self.height)
|
||||
|
||||
x = (screen.get_width() - scaled_width) // 2
|
||||
y = (screen.get_height() - scaled_height) // 2
|
||||
|
||||
scaled_surface = pygame.transform.scale(
|
||||
game_screen,
|
||||
(scaled_width, scaled_height)
|
||||
scale = max(
|
||||
1,
|
||||
min(
|
||||
self.width // SCREEN_WIDTH,
|
||||
self.height // SCREEN_HEIGHT,
|
||||
),
|
||||
)
|
||||
|
||||
screen.blit(scaled_surface, (x, y))
|
||||
scaled_width = SCREEN_WIDTH * scale
|
||||
scaled_height = SCREEN_HEIGHT * scale
|
||||
|
||||
pygame.display.flip()
|
||||
x = (self.width - scaled_width) // 2
|
||||
y = (self.height - scaled_height) // 2
|
||||
|
||||
dt = clock.tick(60) / 1000
|
||||
self.renderer.render(
|
||||
self.game_texture,
|
||||
x,
|
||||
y,
|
||||
scaled_width,
|
||||
scaled_height,
|
||||
)
|
||||
|
||||
pygame.quit()
|
||||
|
||||
game = Game()
|
||||
arcade.run()
|
||||
|
||||
Reference in New Issue
Block a user