⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 event.c

📁 Microwindows genesis was with the NanoGUI project, and is now the primary distribution for both th
💻 C
字号:
/* * NanoBreaker, a Nano-X Breakout clone by Alex Holden. * * The contents of this file are subject to the Mozilla Public License * Version 1.1 (the "License"); you may not use this file except in * compliance with the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ *  * Software distributed under the License is distributed on an "AS IS" * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the * License for the specific language governing rights and limitations * under the License. *  * The Original Code is NanoBreaker. *  * The Initial Developer of the Original Code is Alex Holden. * Portions created by Alex Holden are Copyright (C) 2002 * Alex Holden <alex@alexholden.net>. All Rights Reserved. *  * Contributor(s): *  * Alternatively, the contents of this file may be used under the terms * of the GNU General Public license (the  "[GNU] License"), in which case the * provisions of [GNU] License are applicable instead of those * above.  If you wish to allow use of your version of this file only * under the terms of the [GNU] License and not to allow others to use * your version of this file under the MPL, indicate your decision by * deleting  the provisions above and replace  them with the notice and * other provisions required by the [GNU] License.  If you do not delete * the provisions above, a recipient may use your version of this file * under either the MPL or the [GNU] License. *//* event.c contains handlers for (almost) all of the Nano-X events we get. */#include <stdio.h>#include <stdlib.h>#include <nano-X.h>#include <nxcolors.h>#include "nbreaker.h"/* Called when an "action" input (ie. a mouse button or the space bar) is * pressed. Starts the game if we're on the title screen, jumps to the title * screen if the game is over, or unparks the ball if the game is running and * the ball is parked. */static void action_pressed(nbstate *state){	if(state->state == STATE_TITLESCREEN) increment_level(state);	else if(state->state == STATE_GAMEWON ||			state->state == STATE_GAMELOST)		reset_game(state);	else state->ball.parked = 0;}/* Because the canvas is a full double buffer, all we need to do when we get * an exposure event is to copy the specified area of the canvas to the * output window. */void handle_exposure_event(nbstate *state, GR_EVENT_EXPOSURE *ev){	draw_canvas(state, ev->x, ev->y, ev->width, ev->height);}/* When a mouse button (any button) is pressed, treat it as an "action". */void handle_button_event(nbstate *state, GR_EVENT_BUTTON *ev){	action_pressed(state);}/* When the mouse moves, move the bat. */void handle_mouse_event(nbstate *state, GR_EVENT_MOUSE *ev){	move_bat(state, ev->x - state->winx);}/* The key event handler. */int handle_keystroke_event(nbstate *state, GR_EVENT_KEYSTROKE *ev){	/* If the event is a "key up" event and the key is either the left or	 * right cursor key, cancel bat movement in that direction. Otherwise	 * we don't care about the event. */	if(ev->type == GR_EVENT_TYPE_KEY_UP) {		switch(ev->ch) {			case MWKEY_LEFT:				state->flags.left = 0;				break;			case MWKEY_RIGHT:				state->flags.right = 0;				break;			default:				/* Ignore the event. */				break;		}		return 0; /* Normal return. */	}	/* If we get to here, it's a "key down" event. Perform various	 * different actions depending on which key was pressed: */	switch(ev->ch) {		case ' ': /* The space bar is the "action" key: */			action_pressed(state);			break;		case MWKEY_F1: /* F1 is the "pause" key: */			state->flags.paused ^= 1; /* Set the pause flag. */			break;		case MWKEY_F2: /* F2 is the "suicide" key: */			lost_ball(state); /* Throw away the current ball. */			break;#ifdef DEBUG_POWERS		/* If DEBUG_POWERS is defined in nbreaker.h, keys F3-F8 are		 * used to trigger the power ups and power downs without		 * needing to catch a falling power box. */		case MWKEY_F3: /* WideBat */			activate_widebat(state);			break;		case MWKEY_F4: /* SlowMotion */			activate_slowmotion(state);			break;		case MWKEY_F5: /* StickyBat */			activate_stickybat(state);			break;		case MWKEY_F6: /* PowerBall */			activate_powerball(state);			break;		case MWKEY_F7: /* NarrowBat */			activate_narrowbat(state);			break;		case MWKEY_F8: /* FastMotion */			activate_fastmotion(state);			break;#endif		case MWKEY_LEFT: /* The left cursor key: */			/* Set the "moving left" flag and cancel the			 * "moving right" one. */			state->flags.left = 1;			state->flags.right = 0;			break;		case MWKEY_RIGHT: /* The right cursor key: */			/* Set the "moving right" flag and cancel the			 * "moving left" one. */			state->flags.left = 0;			state->flags.right = 1;			break;#ifdef NB_DEBUG		/* If NB_DEBUG is set in nbreaker.h, dump the game state when		 * F10 is pressed. */		case MWKEY_F10:			dump_state(state);			break;#endif		/* If the escape key is pressed, return 1 which means "exit		 * the game". */		case MWKEY_ESCAPE:			return 1;		/* Feed all other key presses to the cheat recogniser engine: */		default:			do_cheat(state, ev->ch);			break;	}	return 0; /* Normal return. */}/* Handle update events (window move, etc.) by setting the output window X * dimension to the root X dimension specified in the event structure. This is * used in move_bat() to convert the absolute dimensions we get in mouse * position events because we select for them on the root window (so we can * still move the bat when the cursor strays out of the window). */void handle_update_event(nbstate *state, GR_EVENT_UPDATE *ev){	state->winx = ev->rootx;}/* Handle a timer event. Currently there is only one timer; a 1 second * periodic timer that is used to decrement the power-up and power-down timers * once per second, and cancel the powers when the timers reach 0. */void handle_timer_event(nbstate *state, GR_EVENT_TIMER *ev){	do_power_timers(state);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -