view samples/sdl.tp @ 331:61f5b794d939

Breaking change: method call syntax now always uses the syntactic receiver as the actual receiver. This makes its behavior different from function call syntax, but solves some problems with methods being shadowed by local variables and the like.
author Michael Pavone <pavone@retrodev.com>
date Sat, 28 Mar 2015 14:21:04 -0700
parents 4c669942c30d
children
line wrap: on
line source

#{
	import: [
		video
		timer
	] from: (sdl subsystems)
	import: [
		quit
		keyDown
		keyUp
		mouseDown
		mouseUp
		mouseMotion
	] from: (sdl eventTypes)
	import: [
		streaming
	] from: (sdl textureAccess)
	import: [
		bgra8888
	] from: (sdl pixelFormats)
	main <- {
		if: (sdl init: (video or timer)) = 0 {
			(sdl createWindow: "SDL Test" pos: 0 0 size: 640 480 flags: 0u32) value: :window {
				(window createRenderer: -1 flags: ((window renderOpts) accelerated)) value: :render {
					render drawColor!: (sdl r: 0u8 g: 0u8 b: 255u8)
					render clear
					(sdl loadBMP: "944.bmp") value: :surf {
						(surf asTexture: render) value: :tex {
							surf free
							(render createTexture: bgra8888 access: streaming width: 32 height: 32) value: :drawTex {
								angle <- 45.0f32
								continue? <- true
								drawTex blendMode!: ((sdl blendModes) blend)
								drawTex lockRect: (sdl rect: 0 0 size: 32 32) with: :bytearr pitch {
									row <- 0
									start <- -1
									while: { row < 32 } do: {
										col <- 0
										i <- row * pitch
										while: { col < start } do: {
											bytearr set: i 0u8
											i <- i + 1
											bytearr set: i 0u8
											i <- i + 1
											bytearr set: i 0u8
											i <- i + 1
											bytearr set: i 0u8
											i <- i + 1
											col <- col + 1
										}
										end <- start + 3
										while: { col < end } do: {
											bytearr set: i 255u8
											i <- i + 1
											bytearr set: i 255u8
											i <- i + 1
											bytearr set: i 255u8
											i <- i + 1
											bytearr set: i 255u8
											i <- i + 1
											col <- col + 1
										}
										start2 <- 32 - 3 - start
										while: { col < start2 } do: {
											bytearr set: i 0u8
											i <- i + 1
											bytearr set: i 0u8
											i <- i + 1
											bytearr set: i 0u8
											i <- i + 1
											bytearr set: i 0u8
											i <- i + 1
											col <- col + 1
										}
										end <- start2 + 3
										if: end > 32 {
											end <- 32
										}
										while: { col < end } do: {
											bytearr set: i 255u8
											i <- i + 1
											bytearr set: i 255u8
											i <- i + 1
											bytearr set: i 255u8
											i <- i + 1
											bytearr set: i 255u8
											i <- i + 1
											col <- col + 1
										}
										while: { col < 32 } do: {
											bytearr set: i 0u8
											i <- i + 1
											bytearr set: i 0u8
											i <- i + 1
											bytearr set: i 0u8
											i <- i + 1
											bytearr set: i 0u8
											i <- i + 1
											col <- col + 1
										}
										if: row < 16 {
											start <- start + 1
										} else: {
											if: row > 16 {
												start <- start - 1
											}
										}
										row <- row + 1
									}
								}
								while: { continue? } do: {
									tex copy
									tex copyTo: (sdl rect: 160 120 size: 320 224)
									tex copyRect: (sdl rect: 80 60 size: 160 120) To: (sdl rect: 40 30 size: 320 224)
									tex copyTo: (sdl rect: 320 240 size: 320 224) rotated: angle
									drawTex copyTo: (sdl rect: 484 32 size: 32 32) rotated: angle / 60.0f32
									render present
									angle <- angle + 1.0f32

									event <- option none
									while: {
										event <- sdl pollEvent
										event value?
									} do: {
										event value: :ev {
											if: (ev type) = quit {
												continue? <- false
											} else: {
												if: (ev type) = keyDown || (ev type) = keyUp {
													print: "Key event for: " . (ev keyChar) . ", pressed?: " . (ev pressed?) . "\n"
												} else: {
													if: (ev type) = mouseDown || (ev type) = mouseUp {
														print: "Mouse button event at: " . (ev x) . ", " . (ev y) . " for button " . (ev button) . "\n"
													} else: {
														if: (ev type) = mouseMotion {
															print: "Mouse motion event: " . (ev xRel) . ", " . (ev yRel) . "\n"
														}
													}
												}
											}
										} none: {}
									}
								}
							} none: {
								print: "Failed to create texture\n"
							}
							tex destroy
						} none: {
							surf free
						}
					} none: {
					}
					render destroy
				} none: {
					print: "Failed to create renderer\n"
				}
				window destroy
			} none: {
				print: "Failed to create window\n"
				1
			}
		} else: {
			print: "Failed to initialize SDL\n"
			1
		}
	}
}