This commit is contained in:
Niramo 2018-02-22 09:31:04 +00:00 committed by GitHub
commit ab786a62f8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 375 additions and 0 deletions

184
graphics/tictactoe/Makefile Normal file
View 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
#---------------------------------------------------------------------------------------

View 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;
}