Update examples for iOS including touch support, proper handling of window resize, launch screens and icons

This commit is contained in:
Jonny Paton 2019-01-18 15:04:03 +00:00 committed by Lukas Dürrenberger
parent 9f4a0c3c4f
commit 353c846c87
12 changed files with 141 additions and 9 deletions

View File

@ -223,7 +223,18 @@ macro(sfml_add_example target)
add_executable(${target} WIN32 ${target_input}) add_executable(${target} WIN32 ${target_input})
target_link_libraries(${target} PRIVATE sfml-main) target_link_libraries(${target} PRIVATE sfml-main)
elseif(THIS_GUI_APP AND SFML_OS_IOS) elseif(THIS_GUI_APP AND SFML_OS_IOS)
add_executable(${target} MACOSX_BUNDLE ${target_input})
# For iOS apps we need the launch screen storyboard,
# and a custom info.plist to use it
SET(LAUNCH_SCREEN "${CMAKE_SOURCE_DIR}/examples/assets/LaunchScreen.storyboard")
SET(LOGO "${CMAKE_SOURCE_DIR}/examples/assets/logo.png")
SET(INFO_PLIST "${CMAKE_SOURCE_DIR}/examples/assets/info.plist")
SET(ICONS "${CMAKE_SOURCE_DIR}/examples/assets/icon.icns")
add_executable(${target} MACOSX_BUNDLE ${target_input} ${LAUNCH_SCREEN} ${LOGO} ${ICONS})
set(RESOURCES ${LAUNCH_SCREEN} ${LOGO} ${ICONS})
set_target_properties(${target} PROPERTIES RESOURCE "${RESOURCES}"
MACOSX_BUNDLE_INFO_PLIST ${INFO_PLIST}
MACOSX_BUNDLE_ICON_FILE icon.icns)
target_link_libraries(${target} PRIVATE sfml-main) target_link_libraries(${target} PRIVATE sfml-main)
else() else()
add_executable(${target} ${target_input}) add_executable(${target} ${target_input})
@ -264,7 +275,8 @@ macro(sfml_add_example target)
# add the install rule # add the install rule
install(TARGETS ${target} install(TARGETS ${target}
RUNTIME DESTINATION ${target_install_dir} COMPONENT examples RUNTIME DESTINATION ${target_install_dir} COMPONENT examples
BUNDLE DESTINATION ${target_install_dir} COMPONENT examples) BUNDLE DESTINATION ${target_install_dir} COMPONENT examples
RESOURCE DESTINATION ${target_install_dir} COMPONENT examples)
# install the example's source code # install the example's source code
install(FILES ${THIS_SOURCES} install(FILES ${THIS_SOURCES}

View File

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="14460.31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
<device id="ipad9_7" orientation="landscape">
<adaptation id="fullscreen"/>
</device>
<dependencies>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="14460.20"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<scenes>
<!--View Controller-->
<scene sceneID="EHf-IW-A2E">
<objects>
<viewController id="01J-lp-oVM" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
<rect key="frame" x="0.0" y="0.0" width="1024" height="768"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<imageView userInteractionEnabled="NO" contentMode="scaleAspectFit" horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" image="logo.png" translatesAutoresizingMaskIntoConstraints="NO" id="HXY-06-8aG">
<rect key="frame" x="0.0" y="0.0" width="1024" height="768"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
</imageView>
</subviews>
<color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
<viewLayoutGuide key="safeArea" id="Bcu-3y-fUS"/>
</view>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="52" y="374.66266866566718"/>
</scene>
</scenes>
<resources>
<image name="logo.png" width="512" height="512"/>
</resources>
</document>

BIN
examples/assets/icon.icns Normal file

Binary file not shown.

View File

@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleIconFile</key>
<string>icon.icns</string>
<key>UILaunchStoryboardName</key>
<string>LaunchScreen</string>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleGetInfoString</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>org.sfml-dev.$(EXECUTABLE_NAME)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleLongVersionString</key>
<string>2.5.1</string>
<key>CFBundleName</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string></string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string></string>
<key>CSResourcesFileMapped</key>
<true/>
<key>NSHumanReadableCopyright</key>
<string></string>
</dict>
</plist>

BIN
examples/assets/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

View File

@ -220,13 +220,24 @@ int main()
// Adjust the viewport when the window is resized // Adjust the viewport when the window is resized
if (event.type == sf::Event::Resized) if (event.type == sf::Event::Resized)
{ {
sf::Vector2u textureSize = backgroundTexture.getSize();
// Make the window the active window for OpenGL calls // Make the window the active window for OpenGL calls
window.setActive(true); window.setActive(true);
glViewport(0, 0, event.size.width, event.size.height); glViewport(0, 0, event.size.width, event.size.height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLfloat ratio = static_cast<float>(event.size.width) / event.size.height;
glFrustum(-ratio, ratio, -1.f, 1.f, 1.f, 500.f);
// Make the window no longer the active window for OpenGL calls // Make the window no longer the active window for OpenGL calls
window.setActive(false); window.setActive(false);
sf::View view;
view.setSize(textureSize.x, textureSize.y);
view.setCenter(textureSize.x/2.f, textureSize.y/2.f);
window.setView(view);
} }
} }
@ -241,9 +252,17 @@ int main()
// Clear the depth buffer // Clear the depth buffer
glClear(GL_DEPTH_BUFFER_BIT); glClear(GL_DEPTH_BUFFER_BIT);
// We get the position of the mouse cursor, so that we can move the box accordingly // We get the position of the mouse cursor (or touch), so that we can move the box accordingly
float x = sf::Mouse::getPosition(window).x * 200.f / window.getSize().x - 100.f; sf::Vector2i pos;
float y = -sf::Mouse::getPosition(window).y * 200.f / window.getSize().y + 100.f;
#ifdef SFML_SYSTEM_IOS
pos = sf::Touch::getPosition(0);
#else
pos = sf::Mouse::getPosition();
#endif
float x = pos.x * 200.f / window.getSize().x - 100.f;
float y = -pos.y * 200.f / window.getSize().y + 100.f;
// Apply some transformations // Apply some transformations
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);

View File

@ -84,7 +84,12 @@ int main()
pauseMessage.setCharacterSize(40); pauseMessage.setCharacterSize(40);
pauseMessage.setPosition(170.f, 150.f); pauseMessage.setPosition(170.f, 150.f);
pauseMessage.setFillColor(sf::Color::White); pauseMessage.setFillColor(sf::Color::White);
#ifdef SFML_SYSTEM_IOS
pauseMessage.setString("Welcome to SFML pong!\nTouch the screen to start the game");
#else
pauseMessage.setString("Welcome to SFML pong!\nPress space to start the game"); pauseMessage.setString("Welcome to SFML pong!\nPress space to start the game");
#endif
// Define the paddles properties // Define the paddles properties
sf::Clock AITimer; sf::Clock AITimer;
@ -134,6 +139,15 @@ int main()
while (std::abs(std::cos(ballAngle)) < 0.7f); while (std::abs(std::cos(ballAngle)) < 0.7f);
} }
} }
// Window size changed, adjust view appropriately
if (event.type == sf::Event::Resized)
{
sf::View view;
view.setSize(gameWidth, gameHeight);
view.setCenter(gameWidth/2.f, gameHeight/2.f);
window.setView(view);
}
} }
if (isPlaying) if (isPlaying)
@ -154,8 +168,9 @@ int main()
if (sf::Touch::isDown(0)) if (sf::Touch::isDown(0))
{ {
sf::Vector2i pos = sf::Touch::getPosition(0, window); sf::Vector2i pos = sf::Touch::getPosition(0);
leftPaddle.setPosition(0.f, pos.y); sf::Vector2f mappedPos = window.mapPixelToCoords(pos);
leftPaddle.setPosition(leftPaddle.getPosition().x, mappedPos.y);
} }
// Move the computer's paddle // Move the computer's paddle
@ -181,16 +196,22 @@ int main()
float factor = ballSpeed * deltaTime; float factor = ballSpeed * deltaTime;
ball.move(std::cos(ballAngle) * factor, std::sin(ballAngle) * factor); ball.move(std::cos(ballAngle) * factor, std::sin(ballAngle) * factor);
#ifdef SFML_SYSTEM_IOS
const std::string inputString = "Touch the screen to restart";
#else
const std::string inputString = "Press space to restart or\nescape to exit";
#endif
// Check collisions between the ball and the screen // Check collisions between the ball and the screen
if (ball.getPosition().x - ballRadius < 0.f) if (ball.getPosition().x - ballRadius < 0.f)
{ {
isPlaying = false; isPlaying = false;
pauseMessage.setString("You lost!\nPress space to restart or\nescape to exit"); pauseMessage.setString("You Lost!\n" + inputString);
} }
if (ball.getPosition().x + ballRadius > gameWidth) if (ball.getPosition().x + ballRadius > gameWidth)
{ {
isPlaying = false; isPlaying = false;
pauseMessage.setString("You won!\nPress space to restart or\nescape to exit"); pauseMessage.setString("You Won!\n" + inputString);
} }
if (ball.getPosition().y - ballRadius < 0.f) if (ball.getPosition().y - ballRadius < 0.f)
{ {

View File

@ -129,7 +129,13 @@ int main()
// Resize event: adjust the viewport // Resize event: adjust the viewport
if (event.type == sf::Event::Resized) if (event.type == sf::Event::Resized)
{
glViewport(0, 0, event.size.width, event.size.height); glViewport(0, 0, event.size.width, event.size.height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
GLfloat ratio = static_cast<float>(event.size.width) / event.size.height;
glFrustum(-ratio, ratio, -1.f, 1.f, 1.f, 500.f);
}
} }
// Clear the color and depth buffers // Clear the color and depth buffers