📄 main.c
字号:
/* * PSP Software Development Kit - http://www.pspdev.org * ----------------------------------------------------------------------- * Licensed under the BSD license, see LICENSE in PSPSDK root for details. * * Copyright (c) 2006 McZonk (mczonk@teamemergencyexit.com) * * Simple example for drawing text with the gu * */#include <pspkernel.h>#include <pspgu.h>#include <pspgum.h>#include <pspdisplay.h>#include <string.h>#include <math.h>#include "font.c"PSP_MODULE_INFO("GuText Sample", 0, 1, 1);PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER);static unsigned int __attribute__((aligned(16))) list[262144];static int fontwidthtab[128] = { 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 6, 8, 10, // ! " # 10, 10, 10, 6, // $ % & ' 10, 10, 10, 10, // ( ) * + 6, 10, 6, 10, // , - . / 10, 10, 10, 10, // 0 1 2 3 10, 10, 10, 10, // 6 5 8 7 10, 10, 6, 6, // 10 9 : ; 10, 10, 10, 10, // < = > ? 16, 10, 10, 10, // @ A B C 10, 10, 10, 10, // D E F G 10, 6, 8, 10, // H I J K 8, 10, 10, 10, // L M N O 10, 10, 10, 10, // P Q R S 10, 10, 10, 12, // T U V W 10, 10, 10, 10, // X Y Z [ 10, 10, 8, 10, // \ ] ^ _ 6, 8, 8, 8, // ` a b c 8, 8, 6, 8, // d e f g 8, 6, 6, 8, // h i j k 6, 10, 8, 8, // l m n o 8, 8, 8, 8, // p q r s 8, 8, 8, 12, // t u v w 8, 8, 8, 10, // x y z { 8, 10, 8, 12 // | } ~ };#define BUF_WIDTH (512)#define SCR_WIDTH (480)#define SCR_HEIGHT (272)#define PIXEL_SIZE (4)#define FRAME_SIZE (BUF_WIDTH * SCR_HEIGHT * PIXEL_SIZE)#define ZBUF_SIZE (BUF_WIDTH SCR_HEIGHT * 2)int exit_callback(int arg1, int arg2, void *common) { sceKernelExitGame(); return 0;}int CallbackThread(SceSize args, void *argp) { int cbid = sceKernelCreateCallback("Exit Callback", exit_callback, NULL); sceKernelRegisterExitCallback(cbid); sceKernelSleepThreadCB(); return 0;}/* This function draws a string on the screen The chars are handled as sprites. It supportes colors and blending. The fontwidth can be selected with the parameter fw, if it is 0 the best width for each char is selected.*/void drawString(const char* text, int x, int y, unsigned int color, int fw) { int len = (int)strlen(text); if(!len) { return; } typedef struct { float s, t; unsigned int c; float x, y, z; } VERT; VERT* v = sceGuGetMemory(sizeof(VERT) * 2 * len); int i; for(i = 0; i < len; i++) { unsigned char c = (unsigned char)text[i]; if(c < 32) { c = 0; } else if(c >= 128) { c = 0; } int tx = (c & 0x0F) << 4; int ty = (c & 0xF0); VERT* v0 = &v[i*2+0]; VERT* v1 = &v[i*2+1]; v0->s = (float)(tx + (fw ? ((16 - fw) >> 1) : ((16 - fontwidthtab[c]) >> 1))); v0->t = (float)(ty); v0->c = color; v0->x = (float)(x); v0->y = (float)(y); v0->z = 0.0f; v1->s = (float)(tx + 16 - (fw ? ((16 - fw) >> 1) : ((16 - fontwidthtab[c]) >> 1))); v1->t = (float)(ty + 16); v1->c = color; v1->x = (float)(x + (fw ? fw : fontwidthtab[c])); v1->y = (float)(y + 16); v1->z = 0.0f; x += (fw ? fw : fontwidthtab[c]); } sceGumDrawArray(GU_SPRITES, GU_TEXTURE_32BITF | GU_COLOR_8888 | GU_VERTEX_32BITF | GU_TRANSFORM_2D, len * 2, 0, v );}int main(int argc, char** argv) { int thid = sceKernelCreateThread("update_thread", CallbackThread, 0x11, 0xFA0, 0, 0); if(thid >= 0) { sceKernelStartThread(thid, 0, 0); } sceGuInit(); sceGuStart(GU_DIRECT, list); sceGuDrawBuffer(GU_PSM_8888,(void*)0,BUF_WIDTH); sceGuDispBuffer(SCR_WIDTH,SCR_HEIGHT,(void*)0x88000,BUF_WIDTH); sceGuDepthBuffer((void*)0x110000,BUF_WIDTH); sceGuOffset(2048 - (SCR_WIDTH/2),2048 - (SCR_HEIGHT/2)); sceGuViewport(2048,2048,SCR_WIDTH,SCR_HEIGHT); sceGuDepthRange(0xc350,0x2710); sceGuScissor(0,0,SCR_WIDTH,SCR_HEIGHT); sceGuEnable(GU_SCISSOR_TEST); sceGuDisable(GU_DEPTH_TEST); sceGuShadeModel(GU_SMOOTH); sceGuEnable(GU_BLEND); sceGuBlendFunc(GU_ADD, GU_SRC_ALPHA, GU_ONE_MINUS_SRC_ALPHA, 0, 0); sceGuEnable(GU_TEXTURE_2D); sceGuTexMode(GU_PSM_8888, 0, 0, 0); sceGuTexImage(0, 256, 128, 256, font); sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA); sceGuTexEnvColor(0x0); sceGuTexOffset(0.0f, 0.0f); sceGuTexScale(1.0f / 256.0f, 1.0f / 128.0f); sceGuTexWrap(GU_REPEAT, GU_REPEAT); sceGuTexFilter(GU_NEAREST, GU_NEAREST); sceGuFinish(); sceGuSync(0,0); sceGuDisplay(GU_TRUE); while(1) { sceGuStart(GU_DIRECT, list); sceGuClear(GU_COLOR_BUFFER_BIT); /* No matrixes are needed because the font is drawn with GU_TRANSFORM_2D */ drawString("Hello World in red", 0, 0, 0xFF0000FF, 0); drawString("Hello World in green", 0, 16, 0xFF00FF00, 0); drawString("Hello World in blue", 0, 32, 0xFFFF0000, 0); drawString("Hello World with free char width", 0, 64, 0xFFFFFFFF, 0); drawString("Hello World with block char width 10", 0, 80, 0xFFFFFFFF, 10); drawString("Hello World with block char width 12", 0, 96, 0xFFFFFFFF, 12); drawString("Hello World with opacity 100%", 0, 128, 0xFFFFFFFF, 0); drawString("Hello World with opacity 50%", 0, 144, 0x7FFFFFFF, 0); drawString("Hello World with opacity 10%", 0, 160, 0x18FFFFFF, 0); drawString("Hello World with shadow", 2, 194, 0x40FFFFFF, 0); drawString("Hello World with shadow", 0, 192, 0xFFFFFFFF, 0); static float t = 0.0f; t += 0.1f; unsigned int c = 0xFF000000 | (unsigned int)((sinf(t * 0.393f + 0.086f) / 2.0f + 0.5f) * 255.0f) << 16 | (unsigned int)((sinf(t * 0.444f + 0.854f) / 2.0f + 0.5f) * 255.0f) << 8 | (unsigned int)((sinf(t * 0.117f + 1.337f) / 2.0f + 0.5f) * 255.0f) << 0; drawString("Hello World from pspdev", 0, 224, c, 0); sceGuFinish(); sceGuSync(0, 0); sceDisplayWaitVblankStart(); sceGuSwapBuffers(); } sceGuDisplay(GU_FALSE); sceGuTerm(); return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -