mirror of
https://github.com/switchbrew/switch-examples.git
synced 2025-06-21 13:22:40 +02:00
Merge cc3744c81a
into 97aeaa0033
This commit is contained in:
commit
ab786a62f8
184
graphics/tictactoe/Makefile
Normal file
184
graphics/tictactoe/Makefile
Normal file
@ -0,0 +1,184 @@
|
|||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
.SUFFIXES:
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
ifeq ($(strip $(DEVKITPRO)),)
|
||||||
|
$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>/devkitpro")
|
||||||
|
endif
|
||||||
|
|
||||||
|
TOPDIR ?= $(CURDIR)
|
||||||
|
include $(DEVKITPRO)/libnx/switch_rules
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# TARGET is the name of the output
|
||||||
|
# BUILD is the directory where object files & intermediate files will be placed
|
||||||
|
# SOURCES is a list of directories containing source code
|
||||||
|
# DATA is a list of directories containing data files
|
||||||
|
# INCLUDES is a list of directories containing header files
|
||||||
|
# EXEFS_SRC is the optional input directory containing data copied into exefs, if anything this normally should only contain "main.npdm".
|
||||||
|
#
|
||||||
|
# NO_ICON: if set to anything, do not use icon.
|
||||||
|
# NO_NACP: if set to anything, no .nacp file is generated.
|
||||||
|
# APP_TITLE is the name of the app stored in the .nacp file (Optional)
|
||||||
|
# APP_AUTHOR is the author of the app stored in the .nacp file (Optional)
|
||||||
|
# APP_VERSION is the version of the app stored in the .nacp file (Optional)
|
||||||
|
# APP_TITLEID is the titleID of the app stored in the .nacp file (Optional)
|
||||||
|
# ICON is the filename of the icon (.jpg), relative to the project folder.
|
||||||
|
# If not set, it attempts to use one of the following (in this order):
|
||||||
|
# - <Project name>.jpg
|
||||||
|
# - icon.jpg
|
||||||
|
# - <libnx folder>/default_icon.jpg
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
TARGET := $(notdir $(CURDIR))
|
||||||
|
BUILD := build
|
||||||
|
SOURCES := source
|
||||||
|
DATA := data
|
||||||
|
INCLUDES := include
|
||||||
|
EXEFS_SRC := exefs_src
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# options for code generation
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
ARCH := -march=armv8-a -mtune=cortex-a57 -mtp=soft -fPIE
|
||||||
|
|
||||||
|
CFLAGS := -g -Wall -O2 \
|
||||||
|
-ffast-math \
|
||||||
|
$(ARCH) $(DEFINES)
|
||||||
|
|
||||||
|
CFLAGS += $(INCLUDE) -DSWITCH
|
||||||
|
|
||||||
|
CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11
|
||||||
|
|
||||||
|
ASFLAGS := -g $(ARCH)
|
||||||
|
LDFLAGS = -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
|
||||||
|
|
||||||
|
LIBS := -lnx
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# list of directories containing libraries, this must be the top level containing
|
||||||
|
# include and lib
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
LIBDIRS := $(PORTLIBS) $(LIBNX)
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# no real need to edit anything past this point unless you need to add additional
|
||||||
|
# rules for different file extensions
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
ifneq ($(BUILD),$(notdir $(CURDIR)))
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export OUTPUT := $(CURDIR)/$(TARGET)
|
||||||
|
export TOPDIR := $(CURDIR)
|
||||||
|
|
||||||
|
export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
|
||||||
|
$(foreach dir,$(DATA),$(CURDIR)/$(dir))
|
||||||
|
|
||||||
|
export DEPSDIR := $(CURDIR)/$(BUILD)
|
||||||
|
|
||||||
|
CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
|
||||||
|
CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
|
||||||
|
SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
|
||||||
|
BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# use CXX for linking C++ projects, CC for standard C
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
ifeq ($(strip $(CPPFILES)),)
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
export LD := $(CC)
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
else
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
export LD := $(CXX)
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
endif
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
export OFILES := $(addsuffix .o,$(BINFILES)) \
|
||||||
|
$(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o)
|
||||||
|
|
||||||
|
export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
|
||||||
|
$(foreach dir,$(LIBDIRS),-I$(dir)/include) \
|
||||||
|
-I$(CURDIR)/$(BUILD)
|
||||||
|
|
||||||
|
export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib)
|
||||||
|
|
||||||
|
export BUILD_EXEFS_SRC := $(TOPDIR)/$(EXEFS_SRC)
|
||||||
|
|
||||||
|
ifeq ($(strip $(ICON)),)
|
||||||
|
icons := $(wildcard *.jpg)
|
||||||
|
ifneq (,$(findstring $(TARGET).jpg,$(icons)))
|
||||||
|
export APP_ICON := $(TOPDIR)/$(TARGET).jpg
|
||||||
|
else
|
||||||
|
ifneq (,$(findstring icon.jpg,$(icons)))
|
||||||
|
export APP_ICON := $(TOPDIR)/icon.jpg
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
else
|
||||||
|
export APP_ICON := $(TOPDIR)/$(ICON)
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(NO_ICON)),)
|
||||||
|
export NROFLAGS += --icon=$(APP_ICON)
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifeq ($(strip $(NO_NACP)),)
|
||||||
|
export NROFLAGS += --nacp=$(CURDIR)/$(TARGET).nacp
|
||||||
|
endif
|
||||||
|
|
||||||
|
ifneq ($(APP_TITLEID),)
|
||||||
|
export NACPFLAGS += --titleid=$(APP_TITLEID)
|
||||||
|
endif
|
||||||
|
|
||||||
|
.PHONY: $(BUILD) clean all
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
all: $(BUILD)
|
||||||
|
|
||||||
|
$(BUILD):
|
||||||
|
@[ -d $@ ] || mkdir -p $@
|
||||||
|
@$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
clean:
|
||||||
|
@echo clean ...
|
||||||
|
@rm -fr $(BUILD) $(TARGET).pfs0 $(TARGET).nso $(TARGET).nro $(TARGET).nacp $(TARGET).elf
|
||||||
|
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
else
|
||||||
|
.PHONY: all
|
||||||
|
|
||||||
|
DEPENDS := $(OFILES:.o=.d)
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# main targets
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
all : $(OUTPUT).pfs0 $(OUTPUT).nro
|
||||||
|
|
||||||
|
$(OUTPUT).pfs0 : $(OUTPUT).nso
|
||||||
|
|
||||||
|
$(OUTPUT).nso : $(OUTPUT).elf
|
||||||
|
|
||||||
|
ifeq ($(strip $(NO_NACP)),)
|
||||||
|
$(OUTPUT).nro : $(OUTPUT).elf $(OUTPUT).nacp
|
||||||
|
else
|
||||||
|
$(OUTPUT).nro : $(OUTPUT).elf
|
||||||
|
endif
|
||||||
|
|
||||||
|
$(OUTPUT).elf : $(OFILES)
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
# you need a rule like this for each extension you use as binary data
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
%.bin.o : %.bin
|
||||||
|
#---------------------------------------------------------------------------------
|
||||||
|
@echo $(notdir $<)
|
||||||
|
@$(bin2o)
|
||||||
|
|
||||||
|
-include $(DEPENDS)
|
||||||
|
|
||||||
|
#---------------------------------------------------------------------------------------
|
||||||
|
endif
|
||||||
|
#---------------------------------------------------------------------------------------
|
191
graphics/tictactoe/source/main.c
Normal file
191
graphics/tictactoe/source/main.c
Normal file
@ -0,0 +1,191 @@
|
|||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <switch.h>
|
||||||
|
|
||||||
|
|
||||||
|
// Test for Win
|
||||||
|
|
||||||
|
int testwin(int a, int b, int c, int points[]) {
|
||||||
|
int win= 0;
|
||||||
|
if(points[a] == points[b] && points[b] == points[c] && points[a] != 0) {
|
||||||
|
points[a] += 3;
|
||||||
|
points[b] += 3;
|
||||||
|
points[c] += 3;
|
||||||
|
win = 1;
|
||||||
|
}
|
||||||
|
return win;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Square with Center coords
|
||||||
|
|
||||||
|
bool pointInSquareC(int px, int py, int x, int y, int s) {
|
||||||
|
if(px > x-s/2 && x+s/2 > px && y-s/2 < py && y+s/2 > py) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
|
||||||
|
u32* framebuf;
|
||||||
|
u32 cnt=0;
|
||||||
|
|
||||||
|
//Enable max-1080p support. Remove for 720p-only resolution.
|
||||||
|
//gfxInitResolutionDefault();
|
||||||
|
|
||||||
|
gfxInitDefault();
|
||||||
|
|
||||||
|
|
||||||
|
// Needed Vars
|
||||||
|
int player = 1;
|
||||||
|
int points[9] = {0,0,0,0,0,0,0,0,0};
|
||||||
|
int win;
|
||||||
|
win = 0;
|
||||||
|
|
||||||
|
u32 focused = 3;
|
||||||
|
int start = 0;
|
||||||
|
|
||||||
|
while(appletMainLoop())
|
||||||
|
{
|
||||||
|
hidScanInput();
|
||||||
|
|
||||||
|
//hidKeysDown returns information about which buttons have been just pressed (and they weren't in the previous frame)
|
||||||
|
u32 kDown = hidKeysDown(CONTROLLER_P1_AUTO);
|
||||||
|
|
||||||
|
// Check inputs and move focused field/cursor
|
||||||
|
if (kDown & KEY_PLUS) break; // break in order to return to hbmenu
|
||||||
|
else if (kDown & KEY_DUP) {
|
||||||
|
if(focused%3 < 2)
|
||||||
|
focused++;
|
||||||
|
else focused -= 2;
|
||||||
|
}
|
||||||
|
else if (kDown & KEY_DRIGHT) {
|
||||||
|
if(focused+3 <= 9) {
|
||||||
|
focused += 3;
|
||||||
|
} else focused -= 6;
|
||||||
|
}
|
||||||
|
else if (kDown & KEY_DLEFT) {
|
||||||
|
if(focused-3 >= 0) {
|
||||||
|
focused -= 3;
|
||||||
|
} else focused += 6;
|
||||||
|
}
|
||||||
|
else if (kDown & KEY_DDOWN) {
|
||||||
|
if(focused%3 > 0)
|
||||||
|
focused--;
|
||||||
|
else focused += 2;
|
||||||
|
}
|
||||||
|
else if (kDown & KEY_JOYCON_DOWN) {
|
||||||
|
memset(points, 0, sizeof points);
|
||||||
|
}
|
||||||
|
else if (kDown & KEY_JOYCON_RIGHT) { // Pressed A
|
||||||
|
if(points[focused] == 0) { // Set field if field isn't set yet
|
||||||
|
points[focused] = player;
|
||||||
|
player %= 2;
|
||||||
|
player += 1;
|
||||||
|
}
|
||||||
|
if(win) { // if game's ended, A-Button restarts the game
|
||||||
|
memset(points, 0, sizeof points);
|
||||||
|
win = 0;
|
||||||
|
player = 1;
|
||||||
|
focused = 4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(focused > 8 || focused < 0) focused = 4;
|
||||||
|
|
||||||
|
u32 width, height;
|
||||||
|
u32 pos;
|
||||||
|
framebuf = (u32*) gfxGetFramebuffer((u32*)&width, (u32*)&height);
|
||||||
|
|
||||||
|
if(start == 0) { // Initialisation
|
||||||
|
start = 1;
|
||||||
|
focused++; // Somehow not working without this
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(cnt==15) {
|
||||||
|
cnt=0;
|
||||||
|
} else {
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32 color;
|
||||||
|
|
||||||
|
// Each pixel is 4-bytes due to RGBA8888.
|
||||||
|
u32 x, y;
|
||||||
|
int s = height/5;
|
||||||
|
int b = 5;
|
||||||
|
int d = height/5/10;
|
||||||
|
|
||||||
|
//check if someone wins
|
||||||
|
if(testwin(0,1,2,points) ||
|
||||||
|
testwin(3,4,5,points) ||
|
||||||
|
testwin(6,7,8,points) ||
|
||||||
|
testwin(0,3,6,points) ||
|
||||||
|
testwin(1,4,7,points) ||
|
||||||
|
testwin(2,5,8,points) ||
|
||||||
|
testwin(0,4,8,points) ||
|
||||||
|
testwin(2,4,6,points)) win = 1;
|
||||||
|
|
||||||
|
// Check if Game ends (all fields are set)
|
||||||
|
int un = 1;
|
||||||
|
for(int i=0; i<9; i++) {
|
||||||
|
if(points[i] == 0) {
|
||||||
|
un = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(un) win = 1;
|
||||||
|
|
||||||
|
// Setting Win-Color (Changes between blue and turquoise)
|
||||||
|
u32 wincolor;
|
||||||
|
wincolor = 0xFFFF0000;
|
||||||
|
if(cnt > 7) {
|
||||||
|
wincolor = 0x33FFF000;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If game has ended, no field is focused
|
||||||
|
if(win) focused = -1;
|
||||||
|
|
||||||
|
|
||||||
|
for (y=0; y<height; y++)//Access the buffer linearly.
|
||||||
|
{
|
||||||
|
for (x=0; x<width; x++)
|
||||||
|
{
|
||||||
|
pos = y * width + x;
|
||||||
|
color = 0x00000000;
|
||||||
|
|
||||||
|
// Background-Color:
|
||||||
|
framebuf[pos] = color;
|
||||||
|
|
||||||
|
// Fill Fields
|
||||||
|
for(int rx = 0; rx < 3; rx++) {
|
||||||
|
for(int ry = 0; ry < 3; ry++) {
|
||||||
|
int id = ry+rx*3;
|
||||||
|
if(pointInSquareC(x,y, width/2-s-d+(s+d)*rx, height/2-s-d+(s+d)*ry, s+b*2)) {
|
||||||
|
color = 0x00000000;
|
||||||
|
if(focused == id) color = 0xFFFFFFFF; else color = 0x00000000;
|
||||||
|
if(points[id] > 2) color = wincolor;
|
||||||
|
framebuf[pos] = color;//Set framebuf to different shades of grey.
|
||||||
|
}
|
||||||
|
|
||||||
|
if(pointInSquareC(x,y, width/2-s-d+(s+d)*rx, height/2-s-d+(s+d)*ry, s)) {
|
||||||
|
if(points[id]%3 == 0) color = 0x99999999; // Grey -> Not set
|
||||||
|
if(points[id]%3 == 1) color = 0x1111FFFF; // Player 1 - Color
|
||||||
|
if(points[id]%3 == 2) color = 0x1111FF11; // Player 2 - Color
|
||||||
|
framebuf[pos] = color;//Set framebuf to different shades of grey.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gfxFlushBuffers();
|
||||||
|
gfxSwapBuffers();
|
||||||
|
gfxWaitForVsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
gfxExit();
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user